我的问题是 predict()
函数、它的结构和绘制预测。
使用来自我的模型的预测,我想可视化我的重要因素(及其相互作用)如何影响我的响应变量的概率。
我的型号:
m1 <-glm ( mating ~ behv * pop +
I(behv^2) * pop + condition,
data=data1, family=binomial(logit))
交配:个体是否交配(因子,二项式:0,1)
pop:人口(因子,4 个水平)
behv:行为(数字、缩放和居中)
条件:相对脂肪含量(数字、缩放和居中)
运行glm后的显着效果:
pop1
条件
behv*pop2
behv^2*pop1
虽然我已经阅读了帮助页面、以前对类似问题的回答、教程等,但我无法弄清楚如何在
newdata=
函数中构造 predict()
部分。我想可视化的效果(上面给出)可能会给出我想要的线索:例如,对于“ behv*pop2 ”交互,我想得到一个图表,显示来自人群的个体的行为 - 2 可以影响它们是否会交配(概率从 0 到 1)。 最佳答案
实际上,predict
唯一期望的是 newdata
中的列名与公式中使用的列名完全匹配。并且您必须为每个预测变量提供值。这是一些示例数据。
#sample data
set.seed(16)
data <- data.frame(
mating=sample(0:1, 200, replace=T),
pop=sample(letters[1:4], 200, replace=T),
behv = scale(rpois(200,10)),
condition = scale(rnorm(200,5))
)
data1<-data[1:150,] #for model fitting
data2<-data[51:200,-1] #for predicting
然后这将使用
data1
拟合模型并预测为 data2
model<-glm ( mating ~ behv * pop +
I(behv^2) * pop + condition,
data=data1,
family=binomial(logit))
predict(model, newdata=data2, type="response")
使用
type="response"
将为您提供预测的概率。现在要进行预测,您不必使用完全相同的
data.frame
的子集。您可以创建一个新的来调查特定范围的值(只需确保列名匹配。因此,为了探索 behv*pop2
(或我的示例数据中的 behv*popb
),我可能会创建一个像这样的 data.framepopbbehv<-data.frame(
pop="b",
behv=seq(from=min(data$behv), to=max(data$behv), length.out=100),
condition = mean(data$condition)
)
在这里,我修复了
pop="b"
,因此我只查看 pop
,并且由于我还必须提供 condition
,因此我将其修复为原始数据的平均值。 (我可以只输入 0,因为数据是居中和缩放的。)现在我指定了一个我感兴趣的 behv
值范围。这里我只是取了原始数据的范围并将其分成 100 个区域。这会给我足够的积分来绘制。所以我再次使用 predict
来获取popbbehvpred<-predict(model, newdata=popbbehv, type="response")
然后我可以用
plot(popbbehvpred~behv, popbbehv, type="l")
尽管在我的假数据中没有什么是重要的,但我们可以看到较高的行为值似乎导致群体 B 的交配较少。
关于r - 绘制 glm 相互作用 : "newdata=" structure in predict() function,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23826621/