【问题标题】:Predict.lm in R fails to recognize newdataR 中的 Predict.lm 无法识别新数据
【发布时间】:2013-01-05 04:47:54
【问题描述】:

我正在运行线性回归,其中预测变量按另一个值分类,并且无法为新数据生成建模响应。

首先,我为预测变量和误差项生成一些随机值。然后我构建响应。请注意,预测变量的系数取决于分类变量的值。我根据预测变量及其类别组成了一个设计矩阵。

set.seed(1)

category = c(rep("red", 5), rep("blue",5))
x1 = rnorm(10, mean = 1, sd = 1)
err = rnorm(10, mean = 0, sd = 1)

y = ifelse(category == "red", x1 * 2, x1 * 3)
y = y + err

df = data.frame(x1 = x1, category = category)

dm = as.data.frame(model.matrix(~ category + 0, data = df))
dm = dm * df$x1

fit = lm(y ~ as.matrix(dm) + 0, data = df)

# This line will not produce a warning
predictOne = predict.lm(fit, newdata = dm)

# This line WILL produce a warning
predictTwo = predict.lm(fit, newdata = dm[1:5,])

警告是:

'newdata' 有 5 行,但找到的变量有 10 行

除非我非常错误,否则我不应该对变量名有任何问题。 (在这个板上有一个或两个讨论暗示了这个问题。)请注意,第一个预测运行良好,但第二个没有。唯一的变化是第二个预测只使用了设计矩阵的前五行。

想法?

【问题讨论】:

  • 这里真正的问题是你,容我们说,“创造性”尝试通过lm的公式接口指定模型。
  • predict.lm 帮助页面说“newdata”参数需要是一个数据框。该警告确实看起来有点偏离目标,但可以说比默认行为更好,默认行为是在您可能认为自己得到新预测时默默地报告原始数据的预测。

标签: r lm predict


【解决方案1】:

这可能会有所帮助。将新数据转换为data.frame,例如:

x = 1:5
y = c(2,4,6,8,10)

fit = lm(y ~ x)

# PREDICTION
newx = c(3,5,7)

predict(fit, data.frame(x=newx))

【讨论】:

    【解决方案2】:

    Joran 走在正确的轨道上。该问题与列名有关。我想做的是创建自己的设计矩阵,而这恰好是我不需要做的。如果使用以下代码行运行模型,则一帆风顺:

    fit = lm(y ~ x1:category + 0, data = df)
    

    该公式指定将取代设计矩阵的手动构建。

    使用我自己的设计矩阵是我过去做过的事情,并且拟合参数和诊断都与它们应有的一样。我没有使用 predict 函数,所以从不知道 R 正在丢弃“data =”参数。警告会很酷。 R是个严厉的情妇。

    【讨论】:

      【解决方案3】:

      我不能 100% 确定您要做什么,但我认为对公式如何工作的简短演练将为您解决问题。

      基本思想很简单:你传递两个东西,一个公式和一个数据框。公式中的术语应全部是数据框中变量的名称。

      现在,您可以让lm 在不完全遵循该指南的情况下工作,但您只是要求出现问题。所以停下来看看你的模型规格,想想 R 在哪里寻找东西。

      当您调用lm 时,您的公式中的任何名称实际上都不会在数据框df 中找到。所以我怀疑df 根本没有被使用。

      然后,如果您调用model.frame(fit),您将看到 R 认为您的变量应该被调用。注意到有什么奇怪的吗?

      model.frame(fit)
                  y as.matrix(dm).categoryblue as.matrix(dm).categoryred
      1   2.2588735                  0.0000000                 0.3735462
      2   2.7571299                  0.0000000                 1.1836433
      3  -0.2924978                  0.0000000                 0.1643714
      4   2.9758617                  0.0000000                 2.5952808
      5   3.7839465                  0.0000000                 1.3295078
      6   0.4936612                  0.1795316                 0.0000000
      7   4.4460969                  1.4874291                 0.0000000
      8   6.1588103                  1.7383247                 0.0000000
      9   5.5485653                  1.5757814                 0.0000000
      10  2.6777362                  0.6946116                 0.0000000
      

      dm中有什么叫as.matrix(dm).categoryblue的吗?是的,我不这么认为。

      我怀疑(但不确定)你打算做更多这样的事情:

      df$y <- y
      fit <- lm(y~category - 1,data = df)
      

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 1970-01-01
        • 2018-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-12
        • 1970-01-01
        相关资源
        最近更新 更多