【问题标题】:Predict.glm not predicting missing values in responsePredict.glm 没有在响应中预测缺失值
【发布时间】:2013-04-22 08:39:38
【问题描述】:

由于某种原因,当我指定 glms(事实证明也是 lm)时,R 并没有预测数据的缺失值。这是一个例子:

y = round(runif(50))
y = c(y,rep(NA,50))
x = rnorm(100)
m = glm(y~x, family=binomial(link="logit"))
p = predict(m,na.action=na.pass)
length(p)

y = round(runif(50))
y = c(y,rep(NA,50))
x = rnorm(100)
m = lm(y~x)
p = predict(m)
length(p)

p 的长度应该是 100,但它是 50。奇怪的是,我在同一个脚本中还有其他预测,可以根据缺失的数据进行预测。

编辑:事实证明,那些其他预测是完全错误的——我在做imputed.value = rnorm(N,mean.from.predict,var.of.prediction.interval)。当length(predict)<N 时,这 回收 lm predict 或 glm predict 函数的均值和 sd 向量,这与我所寻求的完全不同。

所以我的问题是我的示例代码如何阻止 glm 和 lm 预测缺失值?

谢谢!

【问题讨论】:

    标签: r prediction missing-data glm lm


    【解决方案1】:

    我不确定您从哪里得到 R 的回归函数应该会自动估算缺失值的想法。这不是对 glm 帮助页面的正确阅读。如果您对您“认为”未提供的数据中缺失值的事物有预测,我的猜测是它们实际上并没有缺失,但可能是带有“NA”标签的水平。这 不是 R 中的缺失值。向我们展示您正在使用的数据集的 str(chr.imp)。这个名字的“小鬼”部分让我觉得你(或你之前的某个人)已经构建了一些插补。

    如果您想估算数据,那么您首先需要阅读所涉及的 hte 问题,然后选择一个包来执行此操作。要搜索此类包,请尝试以下操作:

    install.packages("sos")
    require(sos)
     findFn("impute")
    #---------
    found 834 matches;  retrieving 20 pages, 400 matches.
    2 3 4 5 6 7 8 9 10 
    11 12 13 14 15 16 17 18 19 20 
    
    Downloaded 383 links in 118 packages.
    

    【讨论】:

    • 我确实在构建估算。对于缺少 $Y$ 的 $X$ 值,我想要的是 $X'\hat\beta$。编辑:对不起,这个论坛里没有乳胶吗?我的意思是带有新数据预测区间的拟合值。我想我可以手动执行此操作,但我希望 predict 能够预测。我是否将它们用于估算或任何应该由我决定的。
    • 对不符合自己幻想的软件行为的正确建议投反对票是幼稚的。
    • 我对您的评论投了反对票,因为它没有建设性。你以略带敌意的语气做出毫无根据的假设。更重要的是,您的回答实际上不是一个答案,而是一个评论/请求更多信息。
    • 另一个反对这个?我想留下这个答案......这是一个答案(因为 R 不会估算提供给 glm 的数据中的缺失值,即使 na.action 有其他值)......将继续惹恼那些难以接受的人现实。如果要估算数据,则需要使用提供该功能的包。
    • 两年前,当我学习 R 时,你提供了一个技术上正确的答案,虽然粗鲁无用。一个有用的答案是解释 predict 在应用于拟合模型时默认为存储在 (g)lm 对象中的模型框架,这反过来又省略了缺失值的观察。事实上,假设任何人都会从预测函数中寻求插补,这有点密集。如果你真的看过我当时问的问题,你会看到我想要预测 y ,其中观察到了 x。插补通常是指努力解释缺失的 covs
    【解决方案2】:

    问题在于您对glm 的调用,它的na.action 参数设置为na.omit

    因此这些值被省略(并且当predict.glm被调用时,它们仍然被省略)

    来自?glm

    na.action

    一个函数,它指示当数据发生时应该发生什么 包含 NA。默认由选项的 na.action 设置, 如果未设置,则为 na.fail。 “工厂新鲜”的默认值为 na.省略。另一个可能的值是NULL,没有动作。值 na.exclude 可能有用。

    来自?na.exclude(这是一般的NA操作帮助页面)

    na.exclude 与 na.omit 的不同之处仅在于“na.action”的类 结果的属性,即“排除”。这给出了不同的 使用 naresid 和 napredict 的函数中的行为:何时 na.exclude 用于将残差和预测填充到 通过为 na.exclude 省略的情况插入 NA 来正确长度。

    【讨论】:

      【解决方案3】:

      当glm 适合模型时,它仅使用没有缺失值的情况。您仍然可以通过构建数据框并将其传递给 predict.glm 来预测您的 y 值丢失的情况。

      predict(m, newdata=data.frame(y, x))
      

      【讨论】:

      • 谢谢——这可行,但很奇怪。我猜想当 newdata 保留默认值时,“原始”数据是模型矩阵,而不是提供给 glm 的变量。
      • 只是为了增加对这个答案的赞赏:你帮助我在我的代码中找到了一个潜在的 MASSIVE 错误。真的很感激。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2018-10-19
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      • 1970-01-01
      相关资源
      最近更新 更多