我有一个非常简单的逻辑回归模型,仅基于种族
和性别
中的两个分类预测变量。首先,由于我有一些缺失值,为了确保所有缺失数据都以 NA
形式出现,我使用以下命令导入数据框:
> mydata <- read.csv("~/Desktop/R/mydata.csv", sep=",", strip.white = TRUE,
+ na.strings= c("999", "NA", " ", ""))
以下是预测变量的摘要,可查看有多少个 NA
:
> # Define variables
>
> Y <- cbind(Support)
> X <- cbind(Race, Sex)
>
> summary(X)
Race Sex
Min. :1.000000 Min. :1.000000
1st Qu.:1.000000 1st Qu.:1.000000
Median :2.000000 Median :1.000000
Mean :1.608696 Mean :1.318245
3rd Qu.:2.000000 3rd Qu.:2.000000
Max. :3.000000 Max. :3.000000
NA's :420 NA's :42
该模型似乎执行了预期的操作,没有由于缺少值而出现任何问题:
> # Logit model coefficients
>
> logit <- glm(Y ~ X, family=binomial (link = "logit"))
>
> summary(logit)
Call:
glm(formula = Y ~ X, family = binomial(link = "logit"))
Deviance Residuals:
Min 1Q Median 3Q Max
-2.0826825 -1.0911146 0.6473451 1.0190080 1.7457212
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.3457629 0.2884629 4.66529 3.0818e-06 ***
XRace -1.0716191 0.1339177 -8.00207 1.2235e-15 ***
XSex 0.5910812 0.1420270 4.16175 3.1581e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 1434.5361 on 1057 degrees of freedom
Residual deviance: 1347.5684 on 1055 degrees of freedom
(420 observations deleted due to missingness)
AIC: 1353.5684
Number of Fisher Scoring iterations: 4
问题 1:当我没有任何 NA
时,此代码似乎运行良好。但只要有缺失值,我就会收到一条错误消息。有没有办法仍然可以看到我有多少正确的预测值,无论是否缺少数据?
> table(true = Y, pred = round(fitted(logit)))
Error in table(true = Y, pred = round(fitted(logit))) :
all arguments must have the same length
编辑:将 na.action = na.exclude
添加到模型定义后,该表现在可以完美运行:
pred
true 0 1
0 259 178
1 208 413
无论是否丢失数据,仍然有效的方法是当我使用此代码时将预测加载到原始数据帧上。它正确地在数据帧末尾添加一个“pred”列以及每行的概率(如果预测变量之一不存在,则简单地添加 NA
):
> predictions = cbind(mydata, pred = predict(logit, newdata = mydata, type = "response"))
> write.csv(predictions, "~/Desktop/R/predictions.csv", row.names = F)
问题 2:但是,当我尝试预测新的数据框时 - 即使它具有相同的感兴趣变量 - 似乎缺少值的某些内容会导致错误消息以及。是否有代码可以解决这个问题,或者我做错了什么?
> newpredictions = cbind(newdata, pred = predict(logit, newdata = newdata, type = "response"))
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 1475, 1478
In addition: Warning message:
'newdata' had 1475 rows but variables found have 1478 rows
如上所示,mydata
中的行数为 1,478,newdata
中的行数为 1,475。
感谢您的帮助!
最佳答案
如果您缺少数据,NA
,当建模函数执行 formula
-> model.frame
-> 时,R 会删除这些数据model.matrix()
等,因为所有这些函数的默认值都是 na.action = na.omit
。换句话说,在执行实际计算之前,具有 NA
的行将被删除。此删除会传播到从模型对象访问的拟合值、残差等
意识到这是一个问题,R 还有其他 na.action
函数,包括 na.exclude()
。因此,如果您添加
na.action = na.exclude
对 glm()
、fitted()
、resid()
等的调用将返回尽可能多的拟合值您放置的数据中的行。
你似乎确实以一种特殊的方式进行建模。您为什么要从您的 mydata
对象创建 X
和 Y
?这样做会远更好
mod <- glm(Support ~ Race + Sex, data = mydata family = binomial,
na.action = na.exclude)
现在,我们不再使用匿名的 X
和 Y
,而是使用有意义的变量,并且您不必创建重复的数据。
关于r - 当数据丢失时,如何在模型中使用 `predict()` 而不会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207360/