我创建了两个广义线性模型如下:
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
编辑了数据集,因此两个模型都使用相同的数据集。
答案 0 :(得分:13)
该错误的主要原因是一个或多个预测变量中存在缺失值。在R的最新版本中,默认操作是省略所有缺少任何值的行(以前的默认值是产生错误)。因此,例如,如果数据框有100行并且X3中有一个缺失值,则模型glm1将适合99行数据(删除X3缺失的行),但glm2对象将适合完整100行数据(因为它不使用X3,不需要删除任何行)。
那么anova
函数会给你一个错误,因为2个模型适合不同的数据集(以及如何计算自由度等)。
一种解决方案是创建一个新数据框,其中只包含将在至少一个模型中使用的列,并删除包含任何缺失值的所有行(na.omit
或na.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(),可以确保使用相同的数据集。