Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中的Predict.lm无法识别新数据_R_Lm_Predict - Fatal编程技术网

R中的Predict.lm无法识别新数据

R中的Predict.lm无法识别新数据,r,lm,predict,R,Lm,Predict,我正在运行一个线性回归,其中预测值被另一个值分类,并且很难为新数据生成建模响应 首先,我为预测器和误差项生成一些随机值。然后构建响应。请注意,预测器的系数取决于分类变量的值。我根据预测器及其类别组成了一个设计矩阵 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

我正在运行一个线性回归,其中预测值被另一个值分类,并且很难为新数据生成建模响应

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

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
在不严格遵循该指南的情况下工作,但您只是要求事情出错。所以停下来看看你的模型规格,想想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
中是否有任何东西被称为.matrix(dm).categoryblue?是的,我不这么认为

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

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

df$yJoran在正确的轨道上。这个问题与列名有关。我想做的是创建我自己的设计矩阵,碰巧我不需要这样做。如果使用以下代码行运行模型,它将是一帆风顺的:

fit = lm(y ~ x1:category + 0, data = df)
该公式名称将取代设计矩阵的手动构造


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

这可能会有所帮助。将新数据转换为
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))

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