我想知道为什么用于插入数据集缺失值的R's插入包中的preProcess函数返回的观察数量少于原始数据集中的数量?
例如:
library(caret)
t <- data.frame(seq_len(100000),seq_len(100000))
for (i in 1:100000)
{
if (i %% 10 == 0) t[i,1] <- NA;
if (i %% 100 == 0) t[i,2] <- NA
}
preProcValues <- preProcess(t, method = c("knnImpute"))
Run Code Online (Sandbox Code Playgroud)
preProcValues仅包含2个变量的90000个观测值,而预期值为100000个.
从文档:
该函数
preProcess估计每个操作所需的参数,并predict.preProcess用于将它们应用于特定数据集.
在这里,preProcValues是不是t归集后,它包含上执行归集所需的参数t使用predict.preProcess.
你不应该期待100K的观察preProcValues
提示:看看源代码,看看底层发生了什么NA值
使用您的示例(修改为使用method = "medianImpute"- 请参阅此问题(以及上述源代码),了解您尝试执行的操作不适用于"knnImpute")
preProcValues <- preProcess(t, method = "medianImpute")
> preProcValues$dim[1]
#[1] 90000
Run Code Online (Sandbox Code Playgroud)
在这里,我们用中位数(50K)替换NA值t
t2 <- predict(preProcValues, t)
> dim(t2)[1]
#[1] 100000
Run Code Online (Sandbox Code Playgroud)
preProcess不返回值,它只是根据提供的数据设置整个预处理模型.因此,您需要运行predict(还需要RANN包),但即使您使用人工数据,也会出现错误:
Error in FUN(newX[, i], ...) :
cannot impute when all predictors are missing in the new data point
作为K-NN归集不能在工作行既您的预测是不适用的.
这是一个只有20行的演示,为了清晰和易于检查:
library(caret)
t <- data.frame(seq_len(20),seq_len(20))
for (i in 1:20)
{
if (i %% 3 == 0) t[i,1] <- NA;
if (i %% 7 == 0) t[i,2] <- NA
}
names(t) <- c('V1', 'V2')
preProcValues <- preProcess(t, method = c("knnImpute"))
library(RANN)
t_imp <- predict(preProcValues, t)
Run Code Online (Sandbox Code Playgroud)
查看结果时,请记住"center", "scale",即使您未明确调用这些方法,也会自动将方法添加到预处理中:
> str(preProcValues)
List of 19
$ call : language preProcess.default(x = t, method = c("knnImpute"))
$ dim : int [1:2] 12 2
$ bc : NULL
$ yj : NULL
$ et : NULL
$ mean : Named num [1:2] 10.5 10.5
..- attr(*, "names")= chr [1:2] "V1" "V2"
$ std : Named num [1:2] 6.25 6.14
..- attr(*, "names")= chr [1:2] "V1" "V2"
$ ranges : NULL
$ rotation : NULL
$ method : chr [1:3] "knnImpute" "scale" "center"
$ thresh : num 0.95
$ pcaComp : NULL
$ numComp : NULL
$ ica : NULL
$ k : num 5
$ knnSummary:function (x, ...)
$ bagImp : NULL
$ median : NULL
$ data : num [1:12, 1:2] -1.434 -1.283 -0.981 -0.83 -0.377 ...
..- attr(*, "dimnames")=List of 2
.. ..$ : chr [1:12] "1" "2" "4" "5" ...
.. ..$ : chr [1:2] "V1" "V2"
..- attr(*, "scaled:center")= Named num [1:2] 10.5 10.5
.. ..- attr(*, "names")= chr [1:2] "V1" "V2"
..- attr(*, "scaled:scale")= Named num [1:2] 6.63 6.63
.. ..- attr(*, "names")= chr [1:2] "V1" "V2"
- attr(*, "class")= chr "preProcess"
Run Code Online (Sandbox Code Playgroud)