【发布时间】: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”参数需要是一个数据框。该警告确实看起来有点偏离目标,但可以说比默认行为更好,默认行为是在您可能认为自己得到新预测时默默地报告原始数据的预测。