【问题标题】:Data imputation with preProcess in caret returns less observations than expected插入符号中 preProcess 的数据插补返回的观察结果少于预期
【发布时间】:2023-03-23 08:34:01
【问题描述】:

我想知道为什么 R 的插入符号包中的 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"))

preProcValues 将仅包含 2 个变量的 90000 个观察值,而预期为 100000 个。

【问题讨论】:

  • 你介意接受一个正确的答案吗(我知道,两者都很好......)?谢谢...

标签: r r-caret


【解决方案1】:

来自文档:

函数preProcess 估计每个所需的参数 操作和predict.preProcess 用于将它们应用于特定的 数据集。

这里,preProcValues 不是插补后的t,它包含使用predict.preProcesst 执行插补所需的参数。


您应该期待preProcValues中的100K观察

提示:查看source code 以了解NA 值的幕后情况

使用您的示例(修改为使用 method = "medianImpute" - 请参阅此 question(以及上述源代码),了解您尝试执行的操作为何不适用于“knnImpute”)

preProcValues <- preProcess(t, method = "medianImpute") 
> preProcValues$dim[1]
#[1] 90000

这里我们将t 中的NA 值替换为中位数(50K)

t2 <- predict(preProcValues, t)
> dim(t2)[1]
#[1] 100000

【讨论】:

    【解决方案2】:

    preProcess 不返回值,它只是根据提供的数据建立整个预处理模型。因此,您需要运行 predict(还需要 RANN 包),但即使您使用人工数据执行此操作,也会出现错误:

    Error in FUN(newX[, i], ...) : cannot impute when all predictors are missing in the new data point

    因为 k-nn 插补不能在 both 您的预测变量均为 NA 的行中起作用。

    这是一个只有 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)
    

    查看结果时,请记住方法 "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"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 1970-01-01
      • 2023-03-24
      • 2021-11-09
      • 1970-01-01
      相关资源
      最近更新 更多