我正试图使用library(imputation)
和kNNImpute()
估算R
中的一些缺失值。输入数据帧是由13个变量组成的44行。在2列中有30个完整的观测值和14个缺失值的观测值。
代码表示它正在输入所有缺失的值;然而,它将最后4个值输入为0
。根据我对代码的阅读,这似乎是一个基于使用0
作为错误默认值的缺陷。我的代码:
# impute data
library(imputation)
knn_data <- kNNImpute(x, k= 5)
# examine kNNImpute code
kNNImpute
kNNImpute
的代码:参见第4行、第8行,从第24行开始的函数和底部第2行(第48行):
[4] prelim = impute.prelim(x)
[8] x.missing = prelim$x.missing
[24] x.missing.imputed = t(apply(x.missing, 1, function(i) {...}
[48] x[missing.matrix2] = 0
??impute.prelim
不返回任何结果(缺少帮助页面)。所以,我不能检查这个代码。
然而,kNNImpute
的程序流程似乎是
[4] # run a (seemingly undefined) screening function
[8] # pull in the missing rows for later imputation
[24] # run imputation function
[48] # based on line [4] output, impute all "error rows" == 0
有人能解释为什么会发生这种情况和/或如何解决这个问题吗?
仅供参考-我已通过电子邮件向包作者发送了此页面的链接。
解决方案:我使用了与kNNImpute()
函数相同的代码来估算4个不正确的估算值。
impute.fn <- function(scores, distances, raw_dist) {
knn.values <- scores[c(as.integer(names(distances)))]
knn.weights <- 1 - (distances / max(raw_dist))
weighted.mean(knn.values, knn.weights)
}
# impute errors - rows 41-44 are improperly imputed
# rows 1-30 have non missing avlues
#---------------------------------------------------------
x.dist <- as.matrix(dist(x))
dist_41 <- x.dist[41, c(1:30)][order(x.dist[41, c(1:30)])]
...
# fix impute - column 1
x$ABC[41] <- impute.fn(x$ABC, dist_41[1:5], dist_41)
...
如果包作者(或其他人)给出适当的答复,我们将不胜感激。
注意:我已经为wKNN重新编写了imputation
包。改进的包可以在这里找到:imputaton