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

时间:2013-11-04 15:37:51

标签: r quantmod gam mgcv

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

  

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

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

我在网络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 个答案:

答案 0 :(得分:12)

Joran建议在运行模型之前首先删除NA。因此,我删除了NA,运行模型并获得残差。当我通过包含滞后残差更新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")

通过包含滞后1残差

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

  

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

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

答案 3 :(得分:0)

另一个原因可能是与列同名的变量。公式不知道要采用哪一个(变量或列)。通过 ls()(或在 RStudio 中)检查变量列表并使用 remove(<varname>)删除是否存在此类冲突变量。