首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较R包missForest和Hmisc的性能

比较R包missForest和Hmisc的性能
EN

Stack Overflow用户
提问于 2016-06-14 06:21:17
回答 1查看 1.2K关注 0票数 0

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

我得到的测试数据是这样的:

代码语言:javascript
复制
data("iris")
library(missForest)
iris.mis <- prodNA(iris, noNA = 0.6)
summary(iris.mis)

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

在missForest中,它有mixError()方法,允许您将计算精度与原始数据进行比较。

代码语言:javascript
复制
# 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()来进行计算,如下所示:

代码语言:javascript
复制
# 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在处理缺失值方面的性能呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-14 19:21:30

第1部分

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

如果您想要重新创建等效的missForest_imputed$ximp,您必须自己动手。为此,我们可以利用以下事实:

代码语言:javascript
复制
all.equal(as.integer(attr(xx$Sepal.Length, "dimnames")[[1]]), which(is.na(iris.mis$Sepal.Length))) ## returns true

我在这里做的是:

代码语言:javascript
复制
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,详见'help(missForest)‘)。在分类变量的情况下,这是错误分类条目(PFC)的比例。在混合类型变量的情况下,提供了两个错误度量。

要在“第1部分”iris.mis2中对对象执行此操作,只需使用nrmse函数,这是library(missForest)中提供的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37804335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档