如何使用 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
的变化。
时间按年计算,其中time
0表示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"))
(理想情况下,我们也会以某种非任意方式对主题进行排序,例如按斜率)
我对 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
的变化。
时间按年计算,其中time
0表示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"))
(理想情况下,我们也会以某种非任意方式对主题进行排序,例如按斜率)