使用 R 中的 lme() 使用混合模型预测新值

问题描述 投票:0回答:1

我有以下数据:

str(growth_data)
tibble [92 × 4] (S3: tbl_df/tbl/data.frame)
 $ person: num [1:92] 1 1 1 1 2 2 2 2 3 3 ...
 $ gender: chr [1:92] "F" "F" "F" "F" ...
 $ growth: num [1:92] 21 20 21.5 23 21 21.5 24 25.5 20.5 24 ...
 $ age   : Factor w/ 4 levels "8","10","12",..: 1 2 3 4 1 2 3 4 1 2 ...

由此,使用 nlme 包中的 lme() 函数,我创建了以下模型:

# Fitting a mixed model with a random coefficient and unstructured covariance structure.
unstructured_rand <- nlme::lme(growth ~ gender*age, 
                     random = ~ age | person, 
                     data=growth_data, 
                     correlation = corSymm())

我正在尝试为我的数据中的人员而不是我的数据中的新年龄值生成一组预测。具体来说,我想对 1 号人在 13 岁时进行预测。

我已经尝试在指定 newdata 参数的同时使用 Predict() 函数,如下所示:

newGrowth <- expand.grid(
  person = unique(growth_data$person),
  gender = c("F","M"),
  age = c(13,15,17,20)
)

newGrowth$Predicted_Response <- predict(unstructured_rand, newdata = newGrowth)

但是,我不断遇到以下错误:

Error in `Names<-.pdMat`(`*tmp*`, value = value[[i]]) : 
  Length of names should be 4

这似乎表明我的 newdata 没有正确的列数,但从有关此主题的所有其他帖子中,我从未见过任何人指定具有正确列数的 newdata 数据框。此外,我的数据中唯一不在 newdata 数据框中的列是增长,这是我试图预测的变量。

我错过了什么? lme.predict() 的文档中似乎有一些明显的元素我未能应用于我的数据,但我无法弄清楚它是什么。

任何帮助将不胜感激!

r statistics mixed-models nlme
1个回答
0
投票

一个问题(或者可能是手头的问题)是,您在年龄是一个因素的数据上拟合模型,然后尝试预测年龄连续的数据。

因为您没有提供数据,所以我无法确定这是同一个问题。但是 Orthodont 数据与您的数据相似,这会产生相同措辞的错误。

类似错误

library(nlme)

# make some data like yours
orthodont <- Orthodont
orthodont$age <- factor(orthodont$age)

# fit a model similar to yours
fm1 <- lme(distance ~ age, orthodont, random = ~ age | Subject)

# make some new data like your new data
newOrth <- data.frame(Sex = c("Male","Male","Female","Female","Male","Male"),
                      age = c(15, 20, 10, 12, 2, 4),
                      Subject = c("M01","M01","F30","F30","M04","M04"))

# attempt prediction and notice same error
predict(fm1, newOrth, level = 0:1)
#> Warning in model.frame.default(formula = asOneFormula(formula(reSt), fixed), :
#> variable 'age' is not a factor
#> Error in `Names<-.pdMat`(`*tmp*`, value = value[[i]]): Length of names should be 4

修复

使用连续年龄变量的数据拟合模型并使用它进行预测。特别是因为您试图推断该模型适合的过去年龄。

# change factor to numeric to match new data
orthodont$age <- as.numeric(as.character(orthodont$age))

# refit
fm2 <- lme(distance ~ age, orthodont, random = ~ age | Subject)

# attempt prediction again
predict(fm2, newOrth, level = 0:1)
#>   Subject predict.fixed predict.Subject
#> 1     M01      26.66389        30.95074
#> 2     M01      29.96481        35.33009
#> 3     F30      23.36296              NA
#> 4     F30      24.68333              NA
#> 5     M04      18.08148        20.95016
#> 6     M04      19.40185        22.13877

创建于 2024-05-03,使用 reprex v2.1.0

© www.soinside.com 2019 - 2024. All rights reserved.