如何使用 lme4/nlme 对变化的变量进行估计?

How can I produce an estimate for a changing variable using lme4/nlme?

我对 R 和混合模型分析还很陌生。

我想根据每个人的 time 对变量 ln_ahr 的变化进行单一估计。我相信这可以被认为是时间变化的斜率。以下是我的数据结构(长格式):

       v001   ln_ahr    time
13404 28337 0.28438718    0
13405 28337         NA    3
13406 28337         NA    6
13407 28337 1.05015991    9
13408 28337         NA   12
13409 28337 1.33345188   15
13410 28337         NA   19
13413 28355 1.14904314    0
13414 28355         NA    3
13415 28355 1.06546008    6
13416 28355         NA    9
13417 28355 1.17865500   12
13418 28355 2.84949593   15
13423 29983 0.07015499    0
13424 29983 0.21056477    3
13426 29983 0.36125306    9
13427 29983 0.66139848   12
13428 29983 0.16962391   16

其中 v001 是主题标识符。

我尝试使用 R 中的 nlme 包计算斜率:

   slope <- lme(ln_ahr~time,random=~1+time|v001,
                data=restructured,na.action="na.omit")

我尝试获取 ranef(slope)coef(slope) 值。我读到 coef(slope) 值 "computes the sum of the fixed and random effects coefficients for each explanatory variable of each grouping factor" 因此我相信打印出时间系数(忽略截距值)会给我一个估计 ln_ahr 随着时间的推移每个人的变化和我可以将其用作我的 "slope" 或估计 ln_ahr 的变化。

时间按年计算,其中time0表示ln_ahr测量的第一年;每个人每三年测量一次。

我想知道这是否是一种正确的方法,或者我这样做是否正确;如果不是,你有什么建议?

基本答案是"yes"; lme4::coef() 返回的数字是估计的特定主题参数。

此示例的变体在 Internet 上随处可见,但是:

拟合来自 lme4 的基本随机斜率示例之一:

library(lme4)
fm1 <- lmer(Reaction~Days+(Days|Subject),sleepstudy)

提取每组(主题)的估计截距和斜率:

d1 <- coef(fm1)$Subject
d1$Subject <- rownames(d1)

为了比较,为每个组拟合一个单独的模型并提取特定于主题的斜率和截距:

fm2 <- lmList(Reaction~Days|Subject,sleepstudy)
d2 <- coef(fm2)
d2$Subject <- rownames(d2)

绘图(随机效应估计为实线;固定效应为虚线)

library(ggplot2); theme_set(theme_bw())
gg0 <- ggplot(sleepstudy,aes(Days,Reaction,
                      colour=Subject))+
  geom_point()+
  geom_abline(data=d1,
        mapping=aes(intercept=`(Intercept)`,
                    slope=Days,colour=Subject))+
  geom_abline(data=d2,linetype=2,
              mapping=aes(intercept=`(Intercept)`,
                          slope=Days,colour=Subject))  

Doug Bates 不喜欢这些 "spaghetti plots" 所有组都在一个面板中,他更喜欢分面:

gg0+facet_wrap(~Subject)+
 theme(panel.spacing=grid::unit(0,"lines"))          

(理想情况下,我们也会以某种非任意方式对主题进行排序,例如按斜率)