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

时间:2013-08-22 17:39:27

标签: r glm lm anova

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

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),dispersion = dispersion,:
      模型并非都适合相同大小的数据集“

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

6 个答案:

答案 0 :(得分:13)

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

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

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

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

答案 1 :(得分:3)

要避免"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

另见:

答案 2 :(得分: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)的情况。这确保了数据集在不同的拟合模型中是相同的,无论数据丢失的方式如何。

答案 3 :(得分:0)

我猜你打算输入:

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

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

R回归函数的公式界面不会将逗号识别为向公式的RHS添加协变量。并且不要使用attach();将数据参数用于回归函数。

答案 4 :(得分:0)

Greg Snow很好地描述了这个原因。另一种非常简单的解决方案是添加一个新变量,匹配有问题变量的NA,否则匹配值1.将它包含在两个模型中,R将在两个模型中排除相同的行( - &gt;数据集将匹配)。

答案 5 :(得分:0)

我认为在不估算缺失值的情况下处理这种情况的最简单方法是使用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(),可以确保使用相同的数据集。