R:混合模型 - 如何使用同一变量的先前值预测变量
R: mixed models - how to predict a variable using previous values of this same variable
我在多层次模型上遇到困难,并准备了一个可重现的例子来说明。
假设我想在 follow_up 的 12 个月后预测 children 的身高,即他们在月份 == 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 的多个值)添加为变量,则会出现以下错误“边界(单数)拟合:请参阅帮助('isSingular')” (即使在我的大数据集中),而如果我只为每个患者保留一个值的变量(例如性别),我就没有这个问题。
谁能解释一下为什么?
我的第二个问题是,通过训练一个类似的模型,我可以预测新的 children 几乎所有月份的身高值(我在第 1 个月、第 X 个月、... ,第 12 个月),我可以将其与我的测试集上收集的真实值进行比较。
然而,我感兴趣的是预测第 12 个月的值,并整合此测试中每个患者的先前值。换句话说,我不希望模型从头开始预测整组值(更准确地说,从用于训练的患者数据),而是从新患者在第 1 个月、第 4 个月、第 1 个月的先前值预测6等已经可用。我如何编写代码来获得这样的预测?
非常感谢您的帮助!
My first problem is that if I add "weight" (and its multiple values per ID) as a variable, I have the following error "boundary (singular) fit: see help('isSingular')" (even in my large dataset), while if I keep only variables with one value per patient (e.g. sex) I do not have this problem. Can anyone explain me why ?
当随机效应结构过于复杂而无法被数据支持时,就会发生这种情况。除此之外,通常不可能准确地确定为什么在某些情况下会发生这种情况,而在其他情况下不会。基本上模型是过度拟合的。您可以尝试的几件事是:
- 以
month
变量为中心
- 以其他数值变量为中心
- 通过使用
||
而不是 |
在随机斜率和截距之间没有相关性的情况下拟合模型
这里还有一些相关的问答:
至于第二个问题,听起来您想要某种时间序列模型。诸如 AR(1) 之类的自回归模型可能就足够了,但这不受 lme4
支持。您可以试试 nmle
。
我在多层次模型上遇到困难,并准备了一个可重现的例子来说明。
假设我想在 follow_up 的 12 个月后预测 children 的身高,即他们在月份 == 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 的多个值)添加为变量,则会出现以下错误“边界(单数)拟合:请参阅帮助('isSingular')” (即使在我的大数据集中),而如果我只为每个患者保留一个值的变量(例如性别),我就没有这个问题。 谁能解释一下为什么?
我的第二个问题是,通过训练一个类似的模型,我可以预测新的 children 几乎所有月份的身高值(我在第 1 个月、第 X 个月、... ,第 12 个月),我可以将其与我的测试集上收集的真实值进行比较。 然而,我感兴趣的是预测第 12 个月的值,并整合此测试中每个患者的先前值。换句话说,我不希望模型从头开始预测整组值(更准确地说,从用于训练的患者数据),而是从新患者在第 1 个月、第 4 个月、第 1 个月的先前值预测6等已经可用。我如何编写代码来获得这样的预测?
非常感谢您的帮助!
My first problem is that if I add "weight" (and its multiple values per ID) as a variable, I have the following error "boundary (singular) fit: see help('isSingular')" (even in my large dataset), while if I keep only variables with one value per patient (e.g. sex) I do not have this problem. Can anyone explain me why ?
当随机效应结构过于复杂而无法被数据支持时,就会发生这种情况。除此之外,通常不可能准确地确定为什么在某些情况下会发生这种情况,而在其他情况下不会。基本上模型是过度拟合的。您可以尝试的几件事是:
- 以
month
变量为中心 - 以其他数值变量为中心
- 通过使用
||
而不是|
在随机斜率和截距之间没有相关性的情况下拟合模型
这里还有一些相关的问答:
至于第二个问题,听起来您想要某种时间序列模型。诸如 AR(1) 之类的自回归模型可能就足够了,但这不受 lme4
支持。您可以试试 nmle
。