比较 R 包 missForest 和 Hmisc 性能



>当缺失值超过 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()方法。问题是,在aregImpute()中,无论我尝试n.impute = 1还是n.impute = 5,我都不能像原始数据虹膜一样为每个特征提供 150 个值......而且每个特征中的值数量也不同。

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

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)的比例。对于混合类型变量,则提供两个误差度量。

要在"Part 1" [ iris.mis2 ] 中的对象上执行此操作,您只需要使用 library(missForest) 中提供的 nrmse 函数。

相关内容

  • 没有找到相关文章

最新更新