【问题标题】:Visualising GLMM predictions with interaction of categorical and continuous variables通过分类变量和连续变量的交互来可视化 GLMM 预测
【发布时间】:2015-09-04 14:22:48
【问题描述】:

我正在使用 GLMM 在 R 中工作,该 GLMM 混合了连续变量和分类变量以及一些交互。我在 MuMIn 中使用了 dredge 和 model.avg 函数来获得每个变量的效果估计值。我的问题是如何最好地绘制结果。我想制作一个图表来显示一个变量(森林)对我的数据的影响,其中趋势线反映了森林参数估计,但我不知道如何将分类变量和交互变量保持在它们的“平均值”,以便趋势线只反映森林的影响。

这是模型和绘图设置:

#load packages and document
cuckoo<-read.table("http://www.acsu.buffalo.edu/~ciaranwi/home_range.txt", 
header=T,sep="\t")
require(lme4)
require(MuMIn)
as.factor (cuckoo$ID)
as.factor (cuckoo$Sex)
as.factor(cuckoo$MS_bin)
options(na.action = "na.fail")

# create global model and fit
fm<- lmer(log(KD_95)~ MS_bin + Forest + NDVI + Sex + Precip + MS_bin*Forest 
+ MS_bin*NDVI  + MS_bin*Sex + MS_bin*Precip + Argos + Sample + (1|ID), data 
= cuckoo, REML = FALSE)

# dredge but always include argos and sample
KD95<-dredge(fm,fixed=c("Argos","Sample"))

# model averaging 
avgmod<-model.avg(KD95, fit=TRUE)
summary(avgmod)

#plot data
plot(cuckoo$Forest, (log(cuckoo$KD_95)),
 xlab = "Mean percentage of forest cover",
 ylab = expression(paste(plain("Log of Kernel density estimate, 95%    
utilisation, km"^{2}))),
 pch = c(15,17)[as.numeric(cuckoo$MS_bin)],  
 main = "Forest cover",
 col="black", 
 ylim=c(14,23))
legend(80,22, c("Breeding","Nonbreeding"), pch=c(15, 17),  cex=0.7)

然后我陷入了如何包含趋势线的问题。到目前为止,我有:

#parameter estimates from model.avg
argos_est<- -1.6
MS_est<- -1.77
samp_est<-0.01
forest_est<--0.02
sex_est<-0.0653
precip_est<-0.0004
ndvi_est<--0.00003
model_intercept<-22.7

#calculate mean values for parameters
argos_mean<-mean(cuckoo$Argos)
samp_mean<-mean(cuckoo$Sample)
forest_mean<-mean(cuckoo$Forest)
ndvi_mean<-mean(cuckoo$NDVI)
precip_mean<-mean(cuckoo$Precip)

#calculate the intercept and add trend line
intercept<-(model_intercept + (forest_est*cuckoo$Forest) +    
(argos_est*argos_mean) + (samp_est * samp_mean) + (ndvi_est*ndvi_mean) +  
(precip_est*precip_mean) )

abline(intercept, forest_est)

但这没有考虑交互作用或分类变量,截距看起来太高了。有什么想法吗?

【问题讨论】:

  • 您不需要为每个参数创建一个新对象(argos_est &lt;- -1.6 等)。你可以只做coef(avgmod),这会给你所有的系数。
  • 谢谢!绝对是一种更简洁的估算方式……但我仍然遇到同样的问题。

标签: r plot data-visualization predict lme4


【解决方案1】:

就过程而言,您可以利用 R 将大量有关模型的信息存储在模型对象中并具有从模型对象中获取信息的功能这一事实,使您的编码更加容易。例如,coef(avgmod) 将为您提供模型系数,predict(avgmod) 将为您提供模型对用于拟合模型的数据框中的每个观察值的预测。

要对我们感兴趣的特定数据值组合的预测进行可视化,请创建一个新数据框,其中包含我们想要保持不变的变量的平均值,以及我们想要改变的变量的一系列值 (比如Forest)。 expand.grid 使用下列值的所有组合创建一个数据框。

pred.data = expand.grid(Argos=mean(cuckoo$Argos), Sample=mean(cuckoo$Sample), 
                        Precip=mean(cuckoo$Precip), NDVI=mean(cuckoo$NDVI), 
                        Sex="M", Forest=seq(0,100,10), MS_bin=unique(cuckoo$MS_bin), 
                        ID=unique(cuckoo$ID))

现在我们使用 predict 函数将 log(KD_95) 的预测添加到此数据帧。 predict 负责计算您提供给它的任何数据的模型预测(假设您给它一个包含模型中所有变量的数据框)。

pred.data$lgKD_95_pred = predict(avgmod, newdata=pred.data)

现在我们绘制结果。 geom_point 绘制点,就像在您的原始绘图中一样,然后geom_line 添加MS_bin(和 Sex="M")的每个级别的预测。

library(ggplot2)

ggplot() +
  geom_point(data=cuckoo, aes(Forest, log(KD_95), shape=factor(MS_bin), 
             colour=factor(MS_bin), size=3)) +
  geom_line(data=pred.data, aes(Forest, lKD_95_pred, colour=factor(MS_bin)))

结果如下:

更新:要绘制男性和女性的回归线,只需在 pred.data 中包含 Sex="F" 并在情节中添加 Sex 作为美学。在下面的示例中,我在绘制点时使用不同的形状来标记Sex,并为回归线使用不同的线型来标记Sex。

pred.data = expand.grid(Argos=mean(cuckoo$Argos), Sample=mean(cuckoo$Sample), 
                        Precip=mean(cuckoo$Precip), NDVI=mean(cuckoo$NDVI), 
                        Sex=unique(cuckoo$Sex), Forest=seq(0,100,10), MS_bin=unique(cuckoo$MS_bin), 
                        ID=unique(cuckoo$ID))

pred.data$lgKD_95_pred = predict(avgmod, newdata=pred.data)

ggplot() +
  geom_point(data=cuckoo, aes(Forest, log(KD_95), shape=Sex, 
                              colour=factor(MS_bin)), size=3) +
  geom_line(data=pred.data, aes(Forest, lgKD_95_pred, linetype=Sex, 
                                colour=factor(MS_bin))) 

【讨论】:

  • 我试图用“预测”函数做类似的事情,但我也试图“修复”MS_bin,然后我对提到“......保持分类变量和交互变量”感到困惑以他们的‘平均水平’”。我认为这很棘手,因为您可以将分类变量保持在它们的模式(最常见的观察)并且您总是会丢失一些信息。
  • 您还可以将二元预测变量转换为 0/1 数值变量以拟合模型,然后使用平均值(值为 1 的案例的比例)进行预测。这些预测不适用于任何特定情况,但它们会为您提供“平均”情况的回归线。
  • 是的,没错。您还可以用“成功”案例的百分比替换二进制值(额外的过程,所以 1/0 技巧可能更快),但是不是二进制的分类变量呢?你有什么想法吗?
  • effects 和 visreg 包对分类预测器有一些很好的可视化。我还经常使用ggplot 中的各种美学和刻面来查看分类预测变量的各种组合。
  • eipi - 这很有帮助!谢谢你。我仍然有点不清楚的是如何将交互包含在同一个框架中?另外,趋势线是针对 MS_bin 的两个级别的,对吗?但这是否只反映了 Sex=M 的数据?再次感谢!
【解决方案2】:

我希望我没有错过重点,但如果您想要一个线性趋势,您实际上不必手动计算所有内容,而是获取您绘制的内容并拟合 y~x 线性回归模型,如下所示:

model = lm(log(cuckoo$KD_95)~cuckoo$Forest)

model

# Call:
#   lm(formula = log(cuckoo$KD_95) ~ cuckoo$Forest)
# 
# Coefficients:
#   (Intercept)  cuckoo$Forest  
#      17.13698       -0.01461 

abline(17.13698 ,  -0.01461, col="red")

红线使用回归拟合的截距和斜率。黑线是您的手动过程。

【讨论】:

  • 您好安东尼奥,感谢您的建议。回归线是我开始制作这个数字的方式,但我希望切换线以反映模型的实际参数估计值,而不是对数字和实际模型使用不同的方法。
  • 根据@elpi 的评论,这是获得估算值的最佳方式,您能否确保估算值正确?
  • elpi 是正确的,coef(avgmod) 是一种更简洁的获取估计值的方法,但它们仍然是相同的值,所以我仍然有同样的问题。
  • 我认为您必须考虑一下您期望的输出/情节如何。您在 N 维空间中有一个模型,并且您希望通过将其余变量保持在其均值来将其投影到二维空间(您的图)中。你如何想象两个固定值的相互作用?我有一种感觉,你试图观察/可视化的是 log(KD_95) 和 Forest 之间的模型/图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2021-08-30
  • 2018-05-23
  • 2021-03-16
  • 2021-01-04
  • 1970-01-01
相关资源
最近更新 更多