R:混合模型-如何使用同一变量的先前值来预测变量



我很难处理多层次模型,并准备了一个可复制的示例以使其清晰明了。

假设我想预测随访12个月后儿童的身高_up,即他们在第==12个月时的身高,使用之前获得的身高值,以及他们之前的体重值,使用这样的数据帧。

df <- data.frame (ID = c (1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3),
month = c (1, 3, 6, 12, 1, 6, 12, 1, 6, 8, 12),
weight = c (14, 15, 17, 18, 21, 21, 22, 8, 8, 9, 10),
height = c (100, 102, 103, 104, 122, 123, 125, 82, 86, 88, 90))

ID month weight height
1   1     1     14    100
2   1     3     15    102
3   1     6     17    103
4   1    12     18    104
5   2     1     21    122
6   2     6     21    123
7   2    12     22    125
8   3     1      8     82
9   3     6      8     86
10  3     8      9     88
11  3    12     10     90

我的计划是使用以下模型(显然,我的数据比3名患者多得多,每个患者的行数也更多(。因为我的身高在每个患者中都是相关的,所以我想添加一个随机截距(1|ID(,但也添加一个任意斜率,这就是我添加(month|ID(的原因(我在几个预测学生成绩的例子中看到,"场合"或"日考"被添加为随机斜率(。所以我使用了以下代码。

library(tidymodels)
library(multilevelmod)
library(lme4)
#Specifications
mixed_model_spec <- linear_reg() %>% 
set_engine("lmer") %>% 
set_args(na.action=na.exclude, control = lmerControl(optimizer ="bobyqa"))
#Fitting the model
mixed_model_fit <- 
mixed_model_spec %>% 
fit(height ~ weight + month + (month|ID),
data = df)

我的第一个问题是,如果我加上";重量;(及其每个ID的多个值(作为变量;边界(奇异(拟合:请参阅帮助("奇异"(";(即使在我的大型数据集中(,而如果我只保留每个患者一个值的变量(例如性别(,我就不会有这个问题。有人能解释一下为什么吗?

我的第二个问题是,通过训练一个类似的模型,我可以预测新孩子几乎所有月份的身高值(我在第1个月、第X个月、…、第12个月得到一个预测值(,我可以将其与测试集上收集的真实值进行比较。然而,我感兴趣的是预测第12个月的值,并在这次测试中整合每个患者之前的值。换言之,我不希望模型从头开始(更准确地说,从用于训练的患者数据(预测整个值集,也不希望模型从已经可用的新患者在第1个月、第4个月和第6个月等的先前值预测。我如何编写代码来获得这样的预测?

非常感谢你的帮助!

我的第一个问题是,如果我添加"重量;(及其每个ID的多个值(作为变量;边界(奇异(拟合:请参阅帮助("奇异"(";(即使在我的大型数据集中(,而如果我只保留每个患者一个值的变量(例如性别(,我就不会有这个问题。有人能解释一下为什么吗?

当随机效果结构过于复杂而无法得到数据支持时,就会发生这种情况。除此之外,通常不可能准确地确定为什么在某些情况下会发生这种情况,而在其他情况下则不会。基本上模型是过度拟合的。你可以尝试的几件事是:

  • month变量为中心
  • 将其他数值变量居中
  • 通过使用||而不是|,在没有随机斜率和截距之间相关性的情况下拟合模型

这里还有一些相关的问题和答案:

https://stats.stackexchange.com/questions/378939/dealing-with-singular-fit-in-mixed-models/379068#379068

https://stats.stackexchange.com/questions/509892/why-is-this-linear-mixed-model-singular/509971#509971

至于第二个问题,听起来你想要某种时间序列模型。像AR(1(这样的自回归模型可能就足够了,但lme4不支持这一点。您可以尝试nmle

最新更新