如何理解/扩展R公式中右侧矩阵项的含义

3

我一直在使用lme4中的knots()函数进行分段混合效应生长曲线回归,该函数发布在https://stats.stackexchange.com/questions/13361/fitting-piecewise-linear-curves-with-lmer上用于创建节点,然后像这样调用lmer

> df$knot<-knots(df$time,seq(1.5,3.5,.5)

> lmer(outcome ~ predictor*knot + (1+knot|id), data=df)

这很好。 str(df$knot) 显示它是一个矩阵:

num [1:1492895, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
- attr(*, "dimnames")=List of 2
 ..$ : NULL
 ..$ : chr [1:5] "1.5" "2" "2.5" "3" ...

为了提高速度,我想使用Julia(通过JuliaCall)来拟合这些模型,但是Julia不能像R一样理解矩阵RHS。

所以我的问题是:R的lm/lmer如何理解公式右侧的矩阵,我是否可以将矩阵“展开”成数据框中的常规向量列,以便Julia不会抱怨?

我尝试过:

> df$knot1<-df$knot[,1]

> ...

> df$knot5<-df$knot[,5]

然后使用公式

outcome ~ predictor*(knot1+knot2+knot3+knot4+knot5) + (1+knot1+knot2+knot3+knot4+knot5|id)

这是正确的吗?R对RHS矩阵预测器进行了什么处理?


如果从随机效应中删除节点,我认为使用lmer会运行得非常快。lmer(outcome ~ predictor*knot + (1|id), data=df)。请参阅vignette("lmerperf")并遵循其中的提示。 - G. Grothendieck
没错,但这样我就无法拟合增长模型了。(或者至少不是我想要的那种,带有随机斜率) - Alan Schwartz
您仍然会有随机截距,并且节点仍将用于固定效应,但无论如何,重点是通过这种改变,模型应该运行得更快。 - G. Grothendieck
谢谢。我仍然想了解R正在做什么,以便我可以尝试手动操作。 - Alan Schwartz
如果fm是运行lmer的结果,则model.matrix(fm)model.matrix(fm, "random")将为您提供模型矩阵。 - G. Grothendieck
1个回答

0

基于使用较小数据集运行测试模型,似乎将矩阵扩展为五个虚拟变量确实可以按预期工作,R和Julia产生相同的结果(但是对于相同的随机截距和斜率模型,在我的数据的5%子集上,Julia运行6分钟,而lme4大约需要一个小时)。


建议您运行简化模型和完整模型,并在5%的子集上查看是否有任何有价值的差异。 - G. Grothendieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接