r - 当数据丢失时,如何在模型中使用 `predict()` 而不会出现错误?

标签 r logistic-regression na missing-data glm

我有一个非常简单的逻辑回归模型,仅基于种族性别中的两个分类预测变量。首先,由于我有一些缺失值,为了确保所有缺失数据都以 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 对象创建 XY ?这样做会更好

mod <- glm(Support ~ Race + Sex, data = mydata family = binomial,
           na.action = na.exclude)

现在,我们不再使用匿名的 XY,而是使用有意义的变量,并且您不必创建重复的数据。

关于r - 当数据丢失时,如何在模型中使用 `predict()` 而不会出现错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23207360/

相关文章:

r - 比较逻辑模型时的方差分析函数没有偏差的 p 值

r - data.table 1.8.x mean() 函数自动删除 NA?

mysql - 寻找相似的用户

r - 从结构化文本文件中提取信息以在 R 中创建数据框

r - 根据时间范围对行进行子集化

python - Scikit python 和 R 中的逻辑回归结果不同?

r - 矢量场可视化R

python - SciKit Learn 中的多类逻辑回归

通过模拟数据替换NA

用一个平均值替换多个 NA