Ошибка в model.frame.default...... переменная длина отличается

При запуске модели gam с использованием пакета mgcv я обнаружил странное сообщение об ошибке, которое я не могу понять. Сообщение об ошибке было "Ошибка в model.frame.default(formula = death ~ pm10 + Lag (остаток1, 1) +: переменная длина отличается (найдена для" Lag (остаток 1, 1) "). Число наблюдений, используемых в model1 точно такая же, как длина остаточного отклонения, поэтому я думаю, что эта ошибка не связана с разницей в размере или длине данных.

Я нашел довольно связанное сообщение об ошибке на веб-сайте здесь, но этот пост не получил адекватного ответа, поэтому мне не помогает моя проблема

Воспроизводимый пример и данные:

library(quantmod)
library(mgcv) 
require(dlnm)

df <- chicagoNMMAPS
df1 <- df[,c("date","dow","death","temp","pm10")] 
df1$trend<-seq(dim(df1)[1]) ### Create a time trend

Запустить модель

model1<-gam(death ~ pm10 + s(trend,k=14*7)+ s(temp,k=5), data=df1, na.action=na.omit, family=poisson)

Получить остатки отклонения

resid1 <- residuals(model1,type="deviance")

Добавить однодневное отставание от модели 1

model1_1 <- update(model1,.~.+ Lag(resid1,1),  na.action=na.omit)

model1_2<-gam(death ~ pm10 + s(trend,k=14*7)+ s(temp,k=5) + Lag(resid1,1), data=df1, na.action=na.omit, family=poisson)

Обе эти модели выпустили одно и то же сообщение об ошибке

Ответ 1

Джоран предложил сначала удалить NA, прежде чем запускать модель. Таким образом, я удалил NA, запустил модель и получил остатки. Когда я обновил модель2 путем включения отстающих остатков, сообщение об ошибке больше не появлялось.

Удалить NAs

df2<-df1[complete.cases(df1),]

Запустите основную модель

model2<-gam(death ~ pm10 + s(trend,k=14*7)+ s(temp,k=5), data=df2, family=poisson)

Получить остатки

resid2 <- residuals(model2,type="deviance")

Обновить модель2, включив остатки lag 1

model2_1 <- update(model2,.~.+ Lag(resid2,1),  na.action=na.omit)

Ответ 2

Просто, просто убедитесь, что тип данных в ваших столбцах одинаковый. Напр. Я столкнулся с такой же ошибкой, и с другой ошибкой:

Ошибка в contrasts<- (*tmp*, value = contr.funs [1 + isOF [nn]]):   контрасты могут применяться только к факторам с 2 или более уровнями

Итак, я вернулся к файлу excel или csv файлу, установил фильтр для переменной, сбросив меня с ошибкой и проверил, являются ли отдельные типы данных одинаковыми. И... О! у него были номера и строки, поэтому я преобразовал числа в строку, и это сработало для меня отлично.

Ответ 3

Еще одна вещь, которая может вызвать эту ошибку, - создать модель с функцией стандартизации центрирования/масштабирования из пакета рук - m <- standardize(lm(y ~ x, data = train))

Если вы затем попробуете predict(m), вы получите ту же ошибку, что и в этом вопросе.