这是一个小数据集,我可以在其上重现这一点。
df <-
A B C D
54037 0.138666667 NA 0.00000000 0
54038 0.224000000 NA -0.10996564 0
54039 0.128000000 NA 0.10690000 0
54040 0.221333333 NA 0.00000000 0
54041 0.221333333 NA 0.00000000 0
54042 0.298666667 NA -0.11026616 0
54043 0.168000000 NA 0.06024096 0
54044 0.221333333 NA 0.00000000 0
54045 0.114666667 NA 0.12048193 0
54046 0.221333333 NA 0.00000000 0
54047 0.168000000 NA 0.06024096 0
54048 0.114666667 NA 0.12048193 0
54049 0.168000000 NA 0.06024096 0
54050 0.200000000 NA 0.02409639 0
54051 -0.106666667 NA 0.29638554 1
54052 0.221333333 NA 0.00000000 2
54053 0.221333333 NA 0.00000000 2
54054 0.221333333 NA 0.00000000 2
54055 0.240000000 NA -0.13333333 0
54056 0.050666667 NA 0.09269663 0
54057 0.097333333 NA 0.04323305 0
54058 0.050666667 NA 0.17977528 0
54059 0.122000000 NA 0.10724301 0
54060 -0.056000000 NA 0.26262626 0
54061 0.050666667 NA 0.17977528 2
54062 0.050666667 NA 0.17977528 0
54063 0.050666667 NA 0.17977528 0
54064 0.050666667 NA 0.17977528 0
54065 0.050666667 NA 0.17977528 0
54066 0.050666667 NA 0.17977528 0
54067 -0.002666667 NA 0.22120077 0
54068 0.050666667 NA 0.17977528 0
54069 0.050666667 NA 0.17977528 0
54070 0.162666667 NA 0.07006369 0
54071 -0.040000000 NA 0.24930784 0
54072 0.050666667 NA 0.17977528 0
54073 0.050666667 NA 0.17977528 0
54074 0.050666667 NA 0.17977528 0
54075 0.050666667 NA NA 0
54076 0.050666667 NA NA 0
54077 0.050666667 NA NA 0
54078 0.050666667 NA NA 0
54079 0.050666667 NA NA 0
54080 -0.093333333 NA NA 0
54081 0.000000000 NA NA 1
54082 0.000000000 NA NA 2
54083 0.000000000 NA NA 2
54084 0.000000000 NA NA 2
54085 -0.106666667 NA NA 2
54086 0.298666667 NA NA 0
54087 0.000000000 NA NA 0
54088 0.000000000 NA NA 0
54089 0.000000000 NA NA 0
54090 0.139240506 -0.11764706 NA 0
54091 0.139240506 -0.11764706 NA 0
54092 0.088607595 -0.08611111 NA 0
如果我试图使用插入符号的preProcess来估算缺失的值,这就是我得到的
p <- preProcess(df, method=c('medianImpute'))
p$median
=> NULL
现在,在经过preProcess源代码之后,我的假设是它应该至少计算中位数并将其附加到结果中。
if (any(method == "medianImpute"))
{
if(verbose) cat("Computing medians for each predictor...")
median <- sapply(x, median, na.rm=TRUE)
names(median) <- names(x)
if(verbose) cat(" done\n")
}
...
...
out <- list(call = theCall,
...
bagImp = bagModels,
median = median,
cols = cols,
...
知道为什么它甚至没有将中位数附加到输出? 另外,调试这些问题的正确方法是什么?
答案 0 :(得分:0)
能够解开谜团 preProcess严格依赖于执行的顺序,并且在计算中位数
之前就存在这条丑陋的线 x <- x[complete.cases(x),,drop = FALSE]
这意味着如果我们有一个案例,其中没有一行具有所有值,那么它将无法计算中位数和之后的所有计算。 (例如,PCA,ICA)因为x现在是0大小。
重现这一点的最小例子是
A B
1 NA
2 NA
3 NA
4 NA
NA 5
NA 6
NA 7
NA 8
理想情况下,此行应在计算中位数之后,因为无论如何代码在计算中位数时忽略了NA
median <- sapply(x, median, na.rm=TRUE)