1. ホーム
  2. r

[解決済み] model.frame.default のエラー: 変数の長さが異なる

2022-02-18 10:17:33

質問

mgcvパッケージを使用してgamモデルを実行したところ、理解できない奇妙なエラーメッセージが表示されました。

"Error in model.frame.default(formula = death ~ pm10 + Lag(resid1, 1) + : variable lengths differ (found for 'Lag(resid1, 1)')" と表示されました。

model1 で使用した観測値の数は deviance 残差の長さと全く同じなので、このエラーはデータサイズや長さの違いとは関係ないと思います。

ウェブ上でかなり関連性の高いエラーメッセージを見つけました。 こちら しかし、その投稿には十分な回答が得られなかったので、私の問題には役に立ちません。

再現性のある例とデータは以下の通りです。

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

これらのモデルは両方とも同じエラーメッセージを出力しました。

解決方法は?

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)