在多元线性回归中,为什么预测点的图不位于一条直线上?


16

我正在使用多元线性回归来描述Y与X1,X2之间的关系。

从理论上,我理解多元回归假设Y与每个X(Y和X1,Y和X2)之间存在线性关系。我没有使用X的任何转换。

因此,我得到的模型具有R = 0.45和所有显着X(P <0.05)。然后我针对X1绘制Y。我不明白为什么作为模型预测的红色圆圈没有形成一条线。正如我之前所说,我希望每对Y和X都由一条线拟合。

在此处输入图片说明

该图以这种方式在python中生成:

fig, ax = plt.subplots()
plt.plot(x['var1'], ypred, 'o', validation['var1'], validation['y'], 'ro');
ax.set_title('blue: true,   red: OLS')
ax.set_xlabel('X')
ax.set_ylabel('Y')
plt.show()

1
您可以发布用于绘图/分析的代码吗?红线和蓝线看起来像是在抖动。因此,此图背后的代码可能有助于更好地回答您的问题。
Dawny33

仅在以下情况中您会期望获得一条线:(i)假定每个预测点的其他预测变量的值都相同(并且,如果您尝试假设x 2的值不同,那么您会得到一条不同的线),或者( ii)如果您对实际数据使用预测,但“偏出”(即补偿)x 2的变化,这就是偏回归图或添加变量图的用途。如@ dawny33所说,如果不确切知道您是如何构建此图的,就无法知道您的问题是什么x2x2x2
Silverfish

我认为@Silverfish的评论是正确的;在三个维度表示的平面P。如果缩小为二维,则将三维(P)平面“投影” 到例如y x 1平面中,仅当P正交于y x 1平面时才是一条线。y=β0+β1x1+β2x2PP(y,x1)P(y,x1)

@ Dawny33:发布。
Klausos

@f coppens:谢谢。那么,为什么文献说多元线性回归模型假设Y与每个X(Y和X1,Y和X2)之间存在线性关系?
Klausos

Answers:


33

假设您的多元回归方程为

y^=2x1+5x2+3

其中ÿy^指“预测 ”。y

现在仅取那些点。然后,如果你绘制ŸX 1x2=1y^x1,这些点将满足方程:

y^=2x1+5(1)+3=2x1+8

因此,它们必须位于斜率2且截距为8的直线上。y

现在取那些点。当您绘制ŸX 1,然后将这些点满足:x2=2y^x1

y^=2x1+5(2)+3=2x1+13

因此,这是一条斜率2的线,且 -intercept为13。您可以自己验证一下,如果x 2 = 3,则得到另一条斜率2的线,并且y -intercept为18。yx2=3y

我们看到值不同的点将位于不同的线上,但所有点都具有相同的梯度:原始回归方程中2 x 1的系数的含义是,ceteris paribus即保持其他预测变量不变,即1在单位增加X 1增大预测的平均响应ý由两个单位,而的截距的含义3的回归方程中的是,当X 1 = 0X 2 = 0x22x1x1y^3x1=0x2=0那么预测的平均响应是3。但是,并非所有的点都具有相同的,这意味着它们位于具有不同截距的直线上- 对于x 2 = 0的那些点,该线仅具有截距3。因此,您可能会看到(如果只出现x 2的某些值,例如x 2始终是整数)而不是看到一行,而是看到一系列对角线“条纹”。考虑下面的数据,其中ÿ = 2 X 1 + 5 X 2 + 3x23x2=0x2x2y^=2x1+5x2+3

在添加行之前

这里有明显的“条纹”。现在,如果我将为红色圆圈,x 2 = 2表示为金色三角形,x 2 = 3表示为蓝色正方形的点上色,我们将看到它们位于三个不同的直线上,所有直线的斜率均为2,y截距如上计算的图8、13和18。当然,如果不限制x 2取整数值,或者由于回归中包含其他预测变量而使情况复杂化,则对角线条纹将不太清楚,但是每个预测点仍然会如此位于单独的行上x2=1x2=2x2=3yx2基于图中未显示的其他预测因子的值

After lines added

如果要绘制的3维图形X 1X 2,那么你的预测点结合等式二维平面都位于Ŷ = 2 X 1 + 5 X 2 + 3。我上面描述的y vs x 1图是该三维图在二维上的投影-想象一下将自己与x 2轴对齐,以便您向下看,而y轴指向上方,x 1个yx1x2y^=2x1+5x2+3yx1x2yx1-轴指向您的右边。

3d plot

yy值则这些值将垂直位于这些点的上方或下方,这取决于残差分别是正值还是负值。

y^x1x2x2y^x1x2yx1 x2yx1

R图的代码

library(scatterplot3d)

data.df <- data.frame(
  x1 = c(0,2,4,5,8, 1,3,4,7,8, 0,3,5,6,7),
  x2 = c(1,1,1,1,1, 2,2,2,2,2, 3,3,3,3,3)
)

data.df$yhat <- with(data.df, 2*x1 + 5*x2 + 3)

data1.df <- data.df[data.df$x2==1,]
data2.df <- data.df[data.df$x2==2,]
data3.df <- data.df[data.df$x2==3,]

#Before lines added    
mar.default <- c(5,4,4,2) + 0.1
par(mar = mar.default + c(0, 1, 0, 0)) 
plot(data.df[c("x1","yhat")], main=expression("Predicted y against "*x[1]),
     xlab=expression(x[1]), ylab=expression(hat(y)))

#After lines added
plot(data.df[c("x1","yhat")], main=expression("Predicted y against "*x[1]),
     xlab=expression(x[1]), ylab=expression(hat(y)), pch=".")
points(data1.df[c("x1","yhat")], pch=19, col="red")
abline(lm(yhat ~ x1, data=data1.df), col="red")
points(data2.df[c("x1","yhat")], pch=17, col="gold")
abline(lm(yhat ~ x1, data=data2.df), col="gold")
points(data3.df[c("x1","yhat")], pch=15, col="blue")
abline(lm(yhat ~ x1, data=data3.df), col="blue")

#3d plot
myPlot <- scatterplot3d(data.df, pch=".", xlab=expression(x[1]),
                        ylab=expression(x[2]), zlab=expression(hat(y)),
                        main=expression("Predicted y against "*x[1]*" and "*x[2]))
myPlot$plane3d(Intercept=3, x.coef=2, y.coef=5, col="darkgrey")
myPlot$points3d(data1.df, pch=19, col="red")
myPlot$points3d(data2.df, pch=17, col="gold")
myPlot$points3d(data3.df, pch=15, col="blue")
print(myPlot)

只是一个小问题:说平面,您是说平面也可以弯曲吗?
克劳索斯(Klausos)

这意味着“平面”平面。我将添加图片以供稍后说明。
银鱼

2
我正在为这个问题
加注星标,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.