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

7cjasjjr  于 2023-04-18  发布在  其他
关注(0)|答案(5)|浏览(199)

在使用mgcv包运行gam模型时,我遇到了一个奇怪的错误消息,我无法理解:
“model.frame.default(formula = death ~ pm10 + Lag(resid1,1)+:变量长度不同(在“Lag(resid 1,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)

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

ibrsph3r

ibrsph3r1#

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

删除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残差更新model2

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

zvms9eto2#

另一个可能导致此错误的原因是使用arm包中的centering/scaling标准化函数创建模型-m <- standardize(lm(y ~ x, data = train))
如果您尝试predict(m),您将得到与此问题相同的错误。

r6hnlfcb

r6hnlfcb3#

很简单,只要确保列中的数据类型相同即可。例如,我遇到了同样的错误,还有另一个错误:
contrasts<-*tmp*,value = contr.funs[1 + isOF[nn]])中的错误:对比只能应用于具有2个或更多水平的因子
所以,我回到我的excel文件或csv文件,设置一个过滤器的变量抛出一个错误,并检查是否不同的数据类型是相同的。和...哦!它有数字和字符串,所以我转换数字字符串,它为我工作得很好。

wfauudbj

wfauudbj4#

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

dtcbnfnu

dtcbnfnu5#

如果你正在检查这个问题,你可能不小心把你的变量放在了引号里。

相关问题