medianImpute不适用于插入符号的preProcess方法

时间:2014-07-29 10:00:43

标签: r

这是一个小数据集,我可以在其上重现这一点。

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,
...

知道为什么它甚至没有将中位数附加到输出? 另外,调试这些问题的正确方法是什么?

1 个答案:

答案 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)