Прогнозируйте новые значения, используя смешанную модель, используя lme() в R

У меня есть следующие данные:

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() есть какой-то очевидный элемент, который я не могу применить к своим данным, но не могу понять, что это такое.

Любая помощь приветствуется!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Одна из проблем (или, возможно, проблема) заключается в том, что вы подгоняете модель к данным, в которых возраст является фактором, а затем пытаетесь спрогнозировать данные, в которых возраст является непрерывным.

Поскольку вы не предоставили свои данные, я не могу быть уверен, что это та же самая проблема. Но данные Ортодонта аналогичны вашим, и это выдает ошибку с той же формулировкой.

Подобная ошибка

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

Извиняюсь, что не включил мои данные, но это сработало просто великолепно! Большое спасибо.

originalJim 04.05.2024 12:59

Другие вопросы по теме