R错误,表示"模型并非都适合相同大小的数据集"

REn*_*ast 11 r anova lm glm

我创建了两个广义线性模型如下:

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

glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
Run Code Online (Sandbox Code Playgroud)

然后我使用该anova功能:

anova(glm2,glm1)
Run Code Online (Sandbox Code Playgroud)

但得到一条错误信息:

"anova.glmlist中的错误(c(list(object),dotargs),dispersion = dispersion,:
模型并非都适合相同大小的数据集"

这是什么意思,我该如何解决这个问题?我attach在代码的开头编辑了数据集,因此两个模型都使用相同的数据集.

Gre*_*now 14

该错误的主要原因是一个或多个预测变量中存在缺失值.在R的最新版本中,默认操作是省略所有缺少任何值的行(以前的默认值是产生错误).因此,例如,如果数据框有100行并且X3中有一个缺失值,则模型glm1将适合99行数据(删除X3缺失的行),但glm2对象将适合完整100行数据(因为它不使用X3,所以不需要删除任何行).

那么anova函数会给你一个错误,因为2个模型适合不同的数据集(以及如何计算自由度等).

一种解决方案是创建一个新的数据框,其中只包含将在至少一个模型中使用的列,并删除具有任何缺失值的所有行(na.omit或na.exclude函数将使这更容易),然后将两个模型都适合相同的数据框,没有任何缺失值.

其他选择是查看用于多重插补的工具或其他处理缺失数据的方法.


lan*_*oni 6

为避免该"models were not all fitted to the same size of dataset"错误,您必须在完全相同的数据子集上拟合两个模型。有两种简单的方法可以做到这一点:

  • 要么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
Run Code Online (Sandbox Code Playgroud)

也可以看看: