web-dev-qa-db-ja.com

「モデルがすべて同じサイズのデータ​​セットに適合していなかった」というRエラー

次のように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して、両方のモデルが同じデータセットで動作するようにしました。

11
REnthusiast

このエラーの主な原因は、1つ以上の予測変数に欠落している値がある場合です。 Rの最近のバージョンでは、デフォルトのアクションは、値が欠落しているすべての行を省略することです(以前のデフォルトはエラーを生成することでした)。したがって、たとえば、データフレームに100行があり、X3に1つの欠落値がある場合、モデルglm1は99行のデータに適合します(X3が欠落している行を削除します)が、glm2オブジェクトは完全に適合します。 100行のデータ(X3を使用しないため、行を削除する必要はありません)。

したがって、2つのモデルが異なるデータセットに適合しているため(および自由度などをどのように計算するか)、anova関数はエラーを返します。

1つの解決策は、少なくとも1つのモデルで使用される列のみを含む新しいデータフレームを作成し、値が欠落しているすべての行を削除することです(na.omitまたはna.exclude関数を使用すると、これが簡単になります)、次に、両方のモデルを、欠落値がない同じデータフレームに適合させます。

他のオプションは、複数の代入または欠落データを処理する他の方法のためのツールを調べることです。

15
Greg Snow

_"models were not all fitted to the same size of dataset"_エラーを回避するには、両方のモデルをまったく同じデータのサブセットに適合させる必要があります。これを行うには、2つの簡単な方法があります。

  • 2番目のモデルの適合で_data=glm1$model_を使用する
  • または、2番目のモデルフィットでdata=na.omit(orig.data[ , all.vars(formula(glm1))])を使用して、正しくサブセット化されたデータセットを取得します

lmglmの場合、同じアプローチが機能するはずです)と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
_

参照:

4
landroni

解決策は次のとおりです。

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)のあるケースを含めるようになります。これにより、欠測データがどのように分散されていても、データセットが異なる適合モデル間で同一であることが保証されます。

1
Deleet

欠測値を代入せずにこの状況を処理する最も簡単な方法は、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()を実行することにより、同じデータセットを使用していることを確認できます。

0
J.Sabree

私はあなたがタイプするつもりだったと思います:

_glm1 <-glm(Y ~ X1+X2+X3, family=binomial(link=logit))

glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
_

R回帰関数の数式インターフェイスは、数式のRHSに共変量を追加するものとしてコンマを認識しません。また、attach()は使用しないでください。回帰関数にdata引数を使用します。

0
42-

原因はGregSnowによって詳しく説明されています。別の非常に簡単な解決策は、問題のある変数のNAと一致するか、値1と一致する新しい変数を追加することです。両方のモデルに含めると、Rは両方のモデルの同じ行を除外します(->データセットが一致します)。

0
cpt. couteau