【问题标题】:missing values when creating training and testing data with caret使用插入符号创建训练和测试数据时缺少值
【发布时间】:2015-03-03 11:54:58
【问题描述】:

我的问题是关于在使用 train 拟合带有插入符号的模型时如何处理缺失值。 我的数据的一个小样本是这样的:

       df <- dput(dat)
       structure(list(LagO3 = c(NA, NA, NA, 40, 45, NA), RH = c(69.4087524414062, 
       79.9608383178711, 64.4592437744141, 66.4207077026367, 66.0899200439453, 
       91.3353729248047), SR = c(298.928888888889, 300.128888888889, 
       303.688888888889, 304.521111111111, 303.223333333333, 294.716666666667
       ), ST = c(317.9917578125, 317.448253038194, 311.039059244792, 
       312.557927517361, 321.252841796875, 330.512212456597), Tmx = c(294.770359293045, 
       294.897191864461, 295.674552786042, 296.247345044048, 296.108238352818, 
       294.594430242372), CWTE = c(0, 1, 0, 0, 0, 0), CWTW = c(0, 0, 
       0, 0, 0, 0), o3 = c(NA, NA, NA, 52, 55, NA)), .Names = c("LagO3", 
       "RH", "SR", "ST", "Tmx", "CWTE", "CWTW", "o3"), row.names = c("1", 
       "2", "3", "4", "5", "6"), class = "data.frame")

问题是,对于我的一个预测变量中的几个位置,我有 NA,而预测变量 (o3) 也有 NA(但在不同的位置)。然后,我尝试了:

model <- train(x = na.omit(x.training), y = na.omit(training$o3), method = "lmStepAIC",
               direction="backward", trControl = control)

但是,我会为 y 设置不同的长度... 我尝试使用:

 model <- train(x = x.training, y = training$o3,na.action=na.pass, 
                method = "lmStepAIC",direction="backward",trControl = control)

出现以下错误:

Error in quantile.default(y, probs = seq(0, 1, length = cuts)) : 
  missing values and NaN's not allowed if 'na.rm' is FALSE

如有任何建议,我将不胜感激!

非常感谢。

【问题讨论】:

    标签: r statistics r-caret


    【解决方案1】:

    您需要将na.action 参数与train 函数的na.omit 一起使用。正如文档所说的na.action(输入?train):

    一个函数,用于指定在找到 NA 时要采取的操作。默认操作是过程失败。另一种方法是 na.omit,它会导致拒绝任何所需变量缺失值的案例。 (注意:如果给出,这个参数必须命名。)

    所以以下将起作用:

    model <- train(x = x.training, y = training$o3, 
                  method = "lmStepAIC",direction="backward", 
                  trControl = control, na.action=na.omit)
    

    输出:

    > model <- train(x = x.training, y = y.training, method = "lmStepAIC",direction="backward",
    +                na.action=na.omit)
    Start:  AIC=-129.7
    .outcome ~ LagO3 + RH + SR + ST + Tmx + CWTE + CWTW
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3 + RH + SR + ST + Tmx + CWTE
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3 + RH + SR + ST + Tmx
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3 + RH + SR + ST
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3 + RH + SR
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3 + RH
    
    
    Step:  AIC=-129.7
    .outcome ~ LagO3
    
    
    Step:  AIC=-129.7
    .outcome ~ 1
    ...
    ...
    ...
    

    【讨论】:

    • 我知道,我试过了,但我仍然出现错误: quantile.default(y, probs = seq(0, 1, length = cut)) 中的错误:如果出现缺失值和 NaN 则不允许'na.rm' 是 FALSE 。我不知道为什么 na.action 在这里不起作用...谢谢!
    • @user3231352 我在你的代码中只能看到na.pass 而不是na.omit。它肯定适用于na.omit。我的完美执行了 StepAIC。我会发布输出。也许那是你的控制文件。请通过编辑您的问题让我知道控制功能是什么以及您的电话是什么。
    • 嗨,谢谢。我在没有控制的情况下检查了它,它似乎可以工作(但是,有一个警告:在nominalTrainWorkflow(x = x,y = y,wts = weights,info = trainInfo,:重新采样的性能测量中缺少值。)。问题当我使用控件时仍然会发生,这只是: control
    • 如果您进行交叉验证,在这种情况下,您最终可能会在其中一个重采样中得到 NA,只需在训练函数之外处理 NA。键入 training &lt;- na.omit(training) 以删除 NA 行(与该函数在 train 参数中真正起作用的方式相同)并尝试一下。或者如果可以的话,尝试用其他东西替换 NA(同样在函数之外)。没有别的办法。
    • 是的,感谢您的建议,我认为这种方式可以工作!再次感谢!
    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 2020-12-14
    • 2015-07-16
    • 2018-06-16
    • 1970-01-01
    • 2020-06-07
    • 2020-09-24
    • 2014-11-02
    相关资源
    最近更新 更多