我的问题在于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)。
答案 0 :(得分:3)
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.frame
popbbehv<-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
,所以我修复了原来的behv
数据。 (由于数据居中和缩放,我可能只需输入0。)现在我指定一系列感兴趣的predict
值。这里我只取了原始数据的范围并将其拆分进入100个地区。这将给我足够的积分。所以我再次使用popbbehvpred<-predict(model, newdata=popbbehv, type="response")
来获取
plot(popbbehvpred~behv, popbbehv, type="l")
然后我可以用
绘制{{1}}
虽然我的假数据没有什么重要意义,但我们可以看到较高的行为值似乎导致人口B的交配减少。