次のように2つの一般化線形モデルを作成しました。
glm1 <-glm(Y ~ X1 + X2 + X3, family=binomial(link=logit))
glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
次に、anova
関数を使用します。
anova(glm2,glm1)
しかし、エラーメッセージが表示されます:
"anova.glmlist(c(list(object)、dotargs)、分散=分散、:
モデルがすべて同じサイズのデータセットに適合しているわけではありません」
これはどういう意味ですか?どうすればこれを修正できますか?コードの開始時にデータセットをattach
して、両方のモデルが同じデータセットで動作するようにしました。
このエラーの主な原因は、1つ以上の予測変数に欠落している値がある場合です。 Rの最近のバージョンでは、デフォルトのアクションは、値が欠落しているすべての行を省略することです(以前のデフォルトはエラーを生成することでした)。したがって、たとえば、データフレームに100行があり、X3に1つの欠落値がある場合、モデルglm1は99行のデータに適合します(X3が欠落している行を削除します)が、glm2オブジェクトは完全に適合します。 100行のデータ(X3を使用しないため、行を削除する必要はありません)。
したがって、2つのモデルが異なるデータセットに適合しているため(および自由度などをどのように計算するか)、anova
関数はエラーを返します。
1つの解決策は、少なくとも1つのモデルで使用される列のみを含む新しいデータフレームを作成し、値が欠落しているすべての行を削除することです(na.omit
またはna.exclude
関数を使用すると、これが簡単になります)、次に、両方のモデルを、欠落値がない同じデータフレームに適合させます。
他のオプションは、複数の代入または欠落データを処理する他の方法のためのツールを調べることです。
_"models were not all fitted to the same size of dataset"
_エラーを回避するには、両方のモデルをまったく同じデータのサブセットに適合させる必要があります。これを行うには、2つの簡単な方法があります。
data=glm1$model
_を使用するdata=na.omit(orig.data[ , all.vars(formula(glm1))])
を使用して、正しくサブセット化されたデータセットを取得しますlm
(glm
の場合、同じアプローチが機能するはずです)とupdate
を使用した再現可能な例を次に示します。
_# 1st approach
# define a convenience wrapper
update_nested <- function(object, formula., ..., evaluate = TRUE){
update(object = object, formula. = formula., data = object$model, ..., evaluate = evaluate)
}
# prepare data with NAs
data(mtcars)
for(i in 1:ncol(mtcars)) mtcars[i,i] <- NA
xa <- lm(mpg~cyl+disp, mtcars)
xb <- update_nested(xa, .~.-cyl)
anova(xa, xb)
## Analysis of Variance Table
##
## Model 1: mpg ~ cyl + disp
## Model 2: mpg ~ disp
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 26 256.91
## 2 27 301.32 -1 -44.411 4.4945 0.04371 *
## ---
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 2nd approach
xc <- update(xa, .~.-cyl, data=na.omit(mtcars[ , all.vars(formula(xa))]))
anova(xa, xc)
## Analysis of Variance Table
##
## Model 1: mpg ~ cyl + disp
## Model 2: mpg ~ disp
## Res.Df RSS Df Sum of Sq F Pr(>F)
## 1 26 256.91
## 2 27 301.32 -1 -44.411 4.4945 0.04371 *
## ---
## Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
_
参照:
解決策は次のとおりです。
glm1 <-glm(Y ~ X1 + X2 + X3, family = binomial(link = logit), na.action = na.exclude)
glm2 <-glm(Y ~ X1 + X2, family = binomial(link = logit), na.action = na.exclude)
anova(glm2,glm1)
これにより、Rは、適合モデルに欠測データ(NA)のあるケースを含めるようになります。これにより、欠測データがどのように分散されていても、データセットが異なる適合モデル間で同一であることが保証されます。
欠測値を代入せずにこの状況を処理する最も簡単な方法は、tidyrのdrop_na()関数を使用して新しいデータセットを作成することだと思います。
この関数の場合、最終モデルに必要なすべての変数をdrop_na()部分に配置すると、関連する変数に値が欠落している行がすべて削除されます。
library(tidyr) #load in drop_na()
mtcars[1,2] <- NA #makes the first row of the cyl column become NA to illustrate
no_missing <- mtcars %>%
drop_na(cyl)
glimpse(no_missing) #note, you only have 31 obs instead of 32 now
drop_na()は、複数の列にわたっても機能します。
library(tidyr)
mtcars[1,2] <- NA #makes the first row of the cyl column become NA to illustrate
mtcars[3,1] <- NA #makes the 3rd row of the mpg column become NA to illustrate
no_missing_2 <- mtcars %>%
drop_na(mpg, cyl)
glimpse(no_missing_2) #now, you only have 30 obs
最も複雑なモデルで使用するすべての変数を指定してdrop_na()を実行することにより、同じデータセットを使用していることを確認できます。
私はあなたがタイプするつもりだったと思います:
_glm1 <-glm(Y ~ X1+X2+X3, family=binomial(link=logit))
glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
_
R回帰関数の数式インターフェイスは、数式のRHSに共変量を追加するものとしてコンマを認識しません。また、attach()
は使用しないでください。回帰関数にdata引数を使用します。
原因はGregSnowによって詳しく説明されています。別の非常に簡単な解決策は、問題のある変数のNAと一致するか、値1と一致する新しい変数を追加することです。両方のモデルに含めると、Rは両方のモデルの同じ行を除外します(->データセットが一致します)。