25

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

“model.frame.default 中的错误(公式 = 死亡 ~ pm10 + Lag(resid1, 1) + :可变长度不同(为 'Lag(resid1, 1)' 找到)”。

model1 中使用的观察次数与偏差残差的长度完全相同,因此我认为这个误差与数据大小或长度的差异无关。

我在网上找到了一个相当相关的错误消息here,但该帖子没有得到足够的答案,所以它对我的问题没有帮助。

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

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)

这两种模型都产生了相同的错误消息。

4

4 回答 4

17

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

移除 NA

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

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

model2_1 <- update(model2,.~.+ Lag(resid2,1),  na.action=na.omit)
于 2013-11-05T11:54:17.827 回答
5

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

如果你然后尝试predict(m),你会得到与这个问题相同的错误。

于 2017-03-03T05:18:43.990 回答
4

它很简单,只需确保列中的数据类型相同即可。例如,我遇到了同样的错误,还有另一个错误:

contrasts<-( , value = contr.funs *tmp*[1 + isOF[nn]]) 中的错误:对比只能应用于具有 2 个或更多级别的因子

所以,我回到我的 excel 文件或 csv 文件,在变量上设置一个过滤器,给我一个错误,并检查不同的数据类型是否相同。还有……哦!它有数字和字符串,所以我将数字转换为字符串,它对我来说工作得很好。

于 2016-02-24T17:46:26.463 回答
0

另一个原因可能是与列同名的变量。该公式不知道取哪个(变量或列)。通过ls()(或在 RStudio 中)检查变量列表,remove(<varname>如果存在这样的冲突变量,请使用 ) 删除。

于 2021-04-22T23:11:28.903 回答