>当缺失值超过 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
函数。