У меня есть следующие данные:
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 ...
И исходя из этого, используя функцию lme() в пакете nlme, я создал следующую модель:
# 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 лет.
Я попытался использовать функцию Predict() при указании аргумента newdata, например:
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, — это рост, который я пытаюсь предсказать.
Что мне не хватает? Кажется, в документации по lme.predict() есть какой-то очевидный элемент, который я не могу применить к своим данным, но не могу понять, что это такое.
Любая помощь приветствуется!
Одна из проблем (или, возможно, проблема) заключается в том, что вы подгоняете модель к данным, в которых возраст является фактором, а затем пытаетесь спрогнозировать данные, в которых возраст является непрерывным.
Поскольку вы не предоставили свои данные, я не могу быть уверен, что это та же самая проблема. Но данные Ортодонта аналогичны вашим, и это выдает ошибку с той же формулировкой.
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
Created on 2024-05-03 with reprex v2.1.0
Извиняюсь, что не включил мои данные, но это сработало просто великолепно! Большое спасибо.