我已经创建了两个广义线性模型如下:
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(列表(对象),dotargs),分散=分散体,:
模型不是所有安装在数据集的大小相同”
这是什么意思,我该如何解决这一问题? 我已经attach
在我的代码,所以这两种模式都工作过的同一数据集的开始编数据集。
这个错误的主要原因是当有一个或多个预测变量的缺失值。 在最新版本的R的默认操作是忽略有任何遗漏值(以前的默认是产生错误)的所有行。 因此,例如,如果数据帧有100行并且在X3那么你的模型glm1将适合99行数据(下降,其中X3缺少行)的一个缺失值,但广二轻对象将是适合全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
也可以看看:
该解决方案是使用:
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)的情况下。 这确保了数据集是相同的在不同的适配机型,无论数据如何丢失的分布。
我猜你的意思是类型:
glm1 <-glm(Y ~ X1+X2+X3, family=binomial(link=logit))
glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
对于R回归函数式接口不能识别逗号作为协变量添加到式的RHS。 并且不使用attach()
; 使用数据参数回归函数。
原因是公由Greg雪说明。 一种替代和很容易的解决方案是增加一个新的变量,匹配问题的变量的NA的和以其他方式与值1在两种模型包括它和R将在两个模型中排除相同的行( - >数据集将匹配)。
文章来源: R error which says “Models were not all fitted to the same size of dataset”