Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R错误,表示“错误”;模型并非都适用于相同大小的数据集;_R_Glm_Lm_Anova - Fatal编程技术网

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

R错误,表示“错误”;模型并非都适用于相同大小的数据集;,r,glm,lm,anova,R,Glm,Lm,Anova,我创建了两个广义线性模型,如下所示: glm1 <-glm(Y ~ X1 + X2 + X3, family=binomial(link=logit)) glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit)) 但会收到一条错误消息: anova.glmlist(c(列表(对象),点参数)中的错误,离散度=离散度,: 并非所有模型都适用于相同大小的数据集” 这意味着什么?如何修复?我在代码开头附加了数据集,因此两个模型都使用同一个数

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

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

glm2 <-glm(Y ~ X1 + X2, family=binomial(link=logit))
但会收到一条错误消息:

anova.glmlist(c(列表(对象),点参数)中的错误,离散度=离散度,:
并非所有模型都适用于相同大小的数据集”


这意味着什么?如何修复?我在代码开头附加了数据集,因此两个模型都使用同一个数据集。

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

因此,
anova
函数会给出一个错误,因为这两个模型适用于不同的数据集(以及如何计算自由度等)

一种解决方案是创建一个新的数据框,其中只包含至少一个模型中使用的列,并删除所有缺少值的行(通过
na.ommit
na.exclude
函数可以轻松实现),然后将两个模型适配到没有任何缺少值的同一数据框中


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

我猜您的意思是键入:

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

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

glm1解决方案是使用:

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)
glm1为避免
“模型未全部拟合到相同大小的数据集”
错误,必须将两个模型拟合到完全相同的数据子集上。有两种简单的方法:

  • 在第二个模型拟合中使用
    data=glm1$model
  • 或者在第二个模型拟合中使用
    data=na.omit(orig.data[,all.vars(公式(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
#第一次进近
#定义一个方便的包装器

更新嵌套原因由Greg Snow很好地描述。另一个非常简单的解决方案是添加一个新变量,将有问题的变量的NA与值1匹配。将其包含在两个模型中,R将排除两个模型中相同的行(->数据集将匹配).

我认为在不输入缺失值的情况下处理这种情况的最简单方法是使用tidyr的drop\u 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
library(tidyr)#在drop_na()中加载

mtcars[1,2]在旁注中,不要使用
attach()
。此外,我假设您使用了
glm(Y~X1…
,而不仅仅是
(Y~X1…)
?为什么变量之间用逗号分隔?是的,我使用了逗号。很抱歉,我以前没有正确地将其张贴在这里。知道可能出了什么问题吗?没有看到您的数据或代码,没有。使用
附加
肯定会导致该问题。您需要在
glm
中使用
数据=您的数据,您不能使用用逗号分隔变量。谢谢,这很有解释性。当我停止使用attach并选择指定每个glm中的数据时,它似乎起作用了。这只是偶然发生的吗?此外,我希望从glm1和各种其他glm之间的方差分析中获得一个p值。我如何做到这一点?@Denis,使用
attach
,您可能需要e在全局环境/工作区中有一个同名变量,这会把事情搞得一团糟。不使用
attach
的原因之一。要从
anova
add
test=“Chisq”
,请参阅
?anova.glm
,了解详细信息(并确保您对假设感到满意)是的,我已经完成了所有这些错误,我还输入了:NA,OMIT= N.PASS,看我的数据中的空白单元格在R中处理不一样,但是没有用。有什么想法我可以做错事吗?我会使用<代码>数据< /C> >,这两个参数对于<代码> GLM都是相同的:调用:NA。“X1”、“X2”、“X3”)]`。这样,您就可以删除X1和X2中不在X3中的“额外情况”。我是否将此glm1放在一起?数据参数应该相同,公式应该不同。
na.exclude
方法不一定有效。试试这个:
mtcars[1,2]你是对的。它在这种情况下不起作用。但是它确实确保
predict
为数据中缺少值的数据点插入
NA
s。阅读
NA的文档。exclude
它注意到这只适用于连接到
resid的
naresid
napredict
预测
。显然,
方差分析
使用了其他方法。显然,必须首先对完整案例进行子集,例如使用
na.省略
。至少,我在中讨论了至少两种简单的方法。在这种情况下,这些方法似乎都不起作用:fit4=lm(ctmax~ta+ratectmax,data=x,na.action=na.exclude)直线fit5=lme-它给出了相同的错误,没有丢失数据。
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
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