model.frame.default中的错误:变量长度不同

Mes*_*eso 18 r gam quantmod mgcv

在使用mgcv包运行gam模型时,我遇到了一条奇怪的错误消息,我无法理解:

"model.frame.default中的错误(公式=死亡~pm10 +滞后(resid1,1)+:变量长度不同(找到'Lag(resid1,1)')".

模型1中使用的观察数量与偏差残差的长度完全相同,因此我认为此误差与数据大小或长度的差异无关.

我在网上找到了一个相当有关的错误信息在这里,但后没有得到充分的答案,因此它是不利于我的问题.

可重复的示例和数据如下:

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
Run Code Online (Sandbox Code Playgroud)

运行模型

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

获得偏差残差

resid1 <- residuals(model1,type="deviance")
Run Code Online (Sandbox Code Playgroud)

为模型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)
Run Code Online (Sandbox Code Playgroud)

这两个模型都产生了相同的错误消息.

Mes*_*eso 14

Joran建议在运行模型之前先删除NA.因此,我删除了NA,运行模型并获得残差.当我通过包含滞后残差更新model2时,错误消息没有再次出现.

删除NA

df2<-df1[complete.cases(df1),]
Run Code Online (Sandbox Code Playgroud)

运行主模型

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

获得残差

resid2 <- residuals(model2,type="deviance")
Run Code Online (Sandbox Code Playgroud)

通过包括滞后1残差来更新模型2

model2_1 <- update(model2,.~.+ Lag(resid2,1),  na.action=na.omit)
Run Code Online (Sandbox Code Playgroud)


小智 5

可能导致此错误的另一件事是使用arm包创建具有定心/缩放标准化功能的模型- m <- standardize(lm(y ~ x, data = train))

如果再尝试predict(m),您将得到与此问题相同的错误。