我跑在预测被另一个值分为一元线性回归时遇到了问题产生的newdata模拟响应。
首先,我产生了预测和误差方面有一些随机值。 然后我构建的响应。 需要注意的是预测的系数取决于分类变量的值。 我撰写基于预测和类别设计矩阵。
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行
除非我非常错误的,我不应该与变量名的任何问题。 (有这个板这表明,问题一个或两个的讨论。)注意,第一个预测运行正常,但第二次却没有。 唯一的变化是,第二预测仅使用设计矩阵的前五个行。
思考?
我不是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
有什么所谓as.matrix(dm).categoryblue
在dm
? 是啊,我不这么认为。
我怀疑(但我不知道),你的意思做更多的东西是这样的:
df$y <- y
fit <- lm(y~category - 1,data = df)
Joran是在正确的轨道上。 这个问题涉及到列名。 果然不出我所想要做的是创造我自己的设计矩阵,其中的东西,因为它发生,我并不需要做的。 如果运行与下面的代码行的模式,它是一帆风顺:
fit = lm(y ~ x1:category + 0, data = df)
该公式指定将替换设计矩阵的手动施工。
用我自己的设计矩阵是我在过去做和拟合参数和诊断只是因为他们理应是。 我没有使用预测功能,所以从来不知道的是,R是丢弃“数据=”参数。 警告将是很酷。 R是苛刻的女主人。