【问题标题】:missForest won't impute my categorical variablesmissForest 不会估算我的分类变量
【发布时间】:2020-07-09 14:38:55
【问题描述】:

我不是一位经验丰富的程序员,过去几周才开始学习 R,以帮助完成一些与我的博士学位相关的工作。问题来了:

多年来,我一直在尝试使用 R 中的 missForest 包将缺失值归入数据集中,但均未成功。以下是我在伪造数据集时遇到的问题的代表性示例。

数据集包含分类数值。导入后,我使用以下代码将类设置为“因子”


    data <- read.csv("~Data.csv", colClasses = c(rep('factor',3)))

>data  
a   b   c  
1   2   3  
4   5      
7   8   9

为了验证类设置是否正确,我运行:

missForest::varClass(data) 

返回:

[1] "factor" "factor" "factor"

然后我尝试估算和查看数据,但我得到了原始数据集,但数据点仍然丢失,而不是插入了估算值。

    data.imp <- missForest(data)
    data.imp$ximp

a   b   c  
1   2   3  
4   5      
7   8   9  

上面的示例显示了我如何导入数据并将其转换为因子并尝试估算丢失的数据。下面的示例是一个可重现的示例,它会产生相同的问题。

下面的例子应该可以在 R 中重现

我使用的是 R 版本 3.5.3 (2019-03-11)

#install and load the missForest package and library
install.packages("missForest")
library(missForest)
#create the test data frame with a missing value in column c
a <- c("1","4","7")
b <- c("2","5","8")
c <- c("3","","9")
data.test <- data.frame(a,b,c)
#print the data
data.test
#view the class of the data to ensure it is "factor"
missForest::varClass(data.test)
#create the imputed data frame using missForest
data.test.imp <- missForest(data.test)
#print the imputed data frame
data.test.imp$ximp

以上代码返回以下内容,但 c 列中的值仍然缺失

> data.test
  a b c
1 1 2 3
2 4 5  
3 7 8 9
> missForest::varClass(data.test)
[1] "factor" "factor" "factor"
> data.test.imp <- missForest(data.test)
  missForest iteration 1 in progress...done!
  missForest iteration 2 in progress...done!
> data.test.imp$ximp
  a b c
1 1 2 3
2 4 5  
3 7 8 9

如果我将所有数据转换为数字,它会将值估算为缺失的数据点,尽管这些估算值是小数并且我的所有数据都是整数,但它仍然有效......

我使用的真实数据集要大得多,但我遇到了完全相同的问题。

此外,如果我按照 missForest 手册中的示例使用 iris 数据集,则一切正常。但是,如果我从 UCI 存储库下载相同的数据集并手动删除分类数据点并尝试运行相同的代码,它就不起作用了。

我确定我遗漏了一些小问题,但经过数小时试图弄清楚这一点后,我陷入了困境。

【问题讨论】:

  • 我不明白你的数据是什么形状的。你能把这个设为reproducible example
  • 我的格式搞砸了,但我相信我现在已经更正了,希望它更有意义
  • 这个 UCI 存储库在哪里,我们如何下载这些数据?
  • @cbKCnSTL 请了解如何制作一个最小的、独立的、可重现的示例,如下所述:stackoverflow.com/questions/5963269/…
  • @jay.sf 我将可重现的代码添加到我的问题中。您应该能够将其直接粘贴到 R 中并运行它并获得与我显示的相同的输出。我也留下了我的原始信息,但如果这样会更好,我可以删除它。如果我需要更改或添加任何内容,请告诉我。感谢您的帮助。

标签: r rstudio imputation


【解决方案1】:

这似乎真的是一个小问题。在您的 data.test 中,您有需要编码为缺失的空字符串。

您可以使用str 进行测试:

str(data.test)
# 'data.frame': 3 obs. of  3 variables:
# $ a: Factor w/ 3 levels "1","4","7": 1 2 3
# $ b: Factor w/ 3 levels "2","5","8": 1 2 3
# $ c: Factor w/ 3 levels "","3","9": 2 1 3

你看,变量c的级别包含"",它也被编码为一个类别。

你可以很容易地解决这个问题

data.test[data.test == ""] <- NA
data.test
#   a b    c
# 1 1 2    3
# 2 4 5 <NA>
# 3 7 8    9

现在,missForest 工作:

data.test.imp <- missForest::missForest(data.test)
data.test.imp$ximp
#   a b c
# 1 1 2 3
# 2 4 5 9
# 3 7 8 9

【讨论】:

    猜你喜欢
    • 2018-05-14
    • 1970-01-01
    • 2020-02-04
    • 2019-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多