0

当缺失值超过 50% 时,我试图比较 2 个 R 包(missForest 和 Hmisc)在处理缺失值时的性能。

我以这种方式获得了测试数据:

data("iris")
library(missForest)
iris.mis <- prodNA(iris, noNA = 0.6)
summary(iris.mis)

mis1 <- iris.mis
mis2 <- iris.mis

在missForest中,它有mixError()一种方法可以让您将插补精度与原始数据进行比较。

# using missForest
missForest_imputed <- missForest(mis1, ntree = 100)
missForest_error <- mixError(missForest_imputed$ximp, mis1, iris)
dim(missForest_imputed$ximp)
missForest_error

Hmisc 没有mixError()方法,我是用它强大的功能aregImpute()来进行插补的,像这样:

# using Hmisc
library(Hmisc)
hmisc_imputed <- aregImpute(~Sepal.Length + Sepal.Width + Petal.Length + Petal.Width + Species, 
                        data = mis2, n.impute = 1)

我希望将估算的结果转换为类似的格式missForest_imputed$ximp,以便我可以使用mixError()method. 问题是,在 中aregImpute(),无论我尝试过n.impute = 1还是n.impute = 5

那么,有没有办法比较missForest和Hmisc在处理缺失值方面的表现呢?

4

1 回答 1

1

第1部分

Hmisc::aregImpute返回推算值。对于名为 的对象hmisc_imputed,它们可以在 中找到hmisc_imputed$imputed。但是,imputed对象是每个维度的列表。

如果你想重新创建的等价物missForest_imputed$ximp,你必须自己做。为此,我们可以使用以下事实:

all.equal(as.integer(attr(xx$Sepal.Length, "dimnames")[[1]]), which(is.na(iris.mis$Sepal.Length))) ## returns true

我在这里做的:

check_missing <- function(x, hmisc) {
  return(all.equal(which(is.na(x)), as.integer(attr(hmisc, "dimnames")[[1]])))
}

get_level_text <- function(val, lvls) {
  return(lvls[val])
}

convert <- function(miss_dat, hmisc) {
  m_p <- ncol(miss_dat)
  h_p <- length(hmisc)
  if (m_p != h_p) stop("miss_dat and hmisc must have the same number of variables")
  # assume matches for all if 1 matches
  if (!check_missing(miss_dat[[1]], hmisc[[1]]))
    stop("missing data an imputed data do not match")

  for (i in 1:m_p) {
    i_factor <- is.factor(miss_dat[[i]])
    if (!i_factor) {miss_dat[[i]][which(is.na(miss_dat[[i]]))] <- hmisc[[i]]}
    else {
      levels_i <- levels(miss_dat[[i]])
      miss_dat[[i]] <- as.character(miss_dat[[i]])
      miss_dat[[i]][which(is.na(miss_dat[[i]]))] <- sapply(hmisc[[i]], get_level_text, lvls= levels_i)
      miss_dat[[i]] <- factor(miss_dat[[i]])
    }
  }
  return(miss_dat)
}

iris.mis2 <- convert(iris.mis, hmisc_imputed$imputed)

第2部分

mixError使用 RMSE 计算错误率?mixError

插补错误。在连续变量的情况下,这只是归一化均方根误差(NRMSE,有关更多详细信息,请参见“帮助(missForest)”)。在仅分类变量的情况下,这是错误分类条目 (PFC) 的比例。在混合类型变量的情况下,提供了两种误差测量值。

要对“第 1 部分”[ iris.mis2] 中的对象执行此操作,您只需nrmse使用library(missForest).

于 2016-06-14T19:21:30.060 回答