我创建了两个广义线性模型如下:
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函数将使这更容易),然后将两个模型都适合相同的数据框,没有任何缺失值.
其他选择是查看用于多重插补的工具或其他处理缺失数据的方法.
为避免该"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)
也可以看看: