模型框架默认值出错:变量长度不同。

28

我使用mgcv软件包运行gam模型时,遇到了一个奇怪的错误信息,我无法理解:

"在model.frame.default(公式= death ~ pm10 + Lag(resid1, 1)+:variable lengths differ(found for 'Lag(resid1, 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.omit。也许长度不同是由于观察到一个 NA 值被删除。 - joran
1
@joran,在加上或不加上“na.omit”选项时,错误都会发生。事实上,我的最初尝试是没有指定这个选项的。 - Meso
1
默认值(在大多数情况下)仍为na.omit。请注意,df有5114行,而resid1的长度仅为4863。确实正在删除NA值。尝试先删除NA值。然后您的残差向量将与原始数据框匹配。 - joran
@joran,非常感谢您的建议。在我删除了结果和预测变量中的所有NAs之后,模型成功运行了。 - Meso
随意将您的操作记录下来作为答案,并在等待期后接受它! :) 很高兴它能够正常工作... - joran
5个回答

19

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

删除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")

通过包含一阶滞后残差更新 model2

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

7

另一个可能导致此错误的原因是使用arm包中的居中/缩放标准化函数创建模型--m <- standardize(lm(y ~ x, data = train))

如果您尝试使用predict(m),则会得到与此问题相同的错误。


4
很简单,只需确保列中的数据类型相同。例如,我遇到了相同的错误和另一个错误:
“在contrasts<-(*tmp*, value = contr.funs[1 + isOF[nn]])中出现错误:只能将对比应用于具有2个或多个级别的因子。”
所以,我回到我的Excel文件或CSV文件,对导致错误的变量设置了过滤器,并检查不同的数据类型是否相同。结果...噢!它包含数字和字符串,所以我将数字转换为字符串,这样就可以正常工作了。

1

如果你正在查看这个问题,可能是因为你不小心把变量放在引号中了。在R中不要把变量放在字符串中。


1
另一个原因可能是与列名相同的变量。公式不知道要选哪个(变量还是列)。通过ls()(或在RStudio中)检查变量列表,并使用remove(<varname>)来删除冲突的变量,如果存在的话。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接