当丢失值超过50%时,我试图比较2R包、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_errorHmisc没有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在处理缺失值方面的性能呢?
发布于 2016-06-14 19:21:30
第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,详见'help(missForest)‘)。在分类变量的情况下,这是错误分类条目(PFC)的比例。在混合类型变量的情况下,提供了两个错误度量。
要在“第1部分”iris.mis2中对对象执行此操作,只需使用nrmse函数,这是library(missForest)中提供的。
https://stackoverflow.com/questions/37804335
复制相似问题