使用 lm() 进行线性回归 - 对结果感到惊讶
linear regression using lm() - surprised by the result
我使用 lm
函数对我拥有的数据进行了线性回归。一切正常(没有错误消息),但我对结果感到惊讶:我的印象是 R "misses" 一组点,即截距和斜率不是最合适的。例如,我指的是坐标 x=15-25,y=0-20.
处的一组点
我的问题:
- 是否有函数可以比较 "expected" 系数和 "lm-calculated" 系数的拟合度?
- 我是不是在编码的时候犯了一个愚蠢的错误,导致
lm
做
那个?
以下一些答案:关于 x 和 y 的附加信息
x 和 y 都是疾病症状的视觉估计。两者都存在相同的不确定性。
数据和代码在这里:
x1=c(24.0,23.9,23.6,21.6,21.0,20.8,22.4,22.6,
21.6,21.2,19.0,19.4,21.1,21.5,21.5,20.1,20.1,
20.1,17.2,18.6,21.5,18.2,23.2,20.4,19.2,22.4,
18.8,17.9,19.1,17.9,19.6,18.1,17.6,17.4,17.5,
17.5,25.2,24.4,25.6,24.3,24.6,24.3,29.4,29.4,
29.1,28.5,27.2,27.9,31.5,31.5,31.5,27.8,31.2,
27.4,28.8,27.9,27.6,26.9,28.0,28.0,33.0,32.0,
34.2,34.0,32.6,30.8)
y1=c(100.0,95.5,93.5,100.0,98.5,99.5,34.8,
45.8,47.5,17.4,42.6,63.0,6.9,12.1,30.5,
10.5,14.3,41.1, 2.2,20.0,9.8,3.5,0.5,3.5,5.7,
3.1,19.2,6.4, 1.2, 4.5, 5.7, 3.1,19.2, 6.4,
1.2,4.5,81.5,70.5,91.5,75.0,59.5,73.3,66.5,
47.0,60.5,47.5,33.0,62.5,87.0,86.0,77.0,
86.0,83.0,78.5,83.0,83.5,73.0,69.5,82.5,78.5,
84.0,93.5,83.5,96.5,96.0,97.5)
## x11()
plot(x1,y1,xlim=c(0,35),ylim=c(0,100))
# linear regression
reg_lin=lm(y1 ~ x1)
abline(reg_lin,lty="solid", col="royalblue")
text(12.5,25,labels="R result",col="royalblue", cex=0.85)
text(12.5,20,labels=bquote(y== .(5.26)*x - .(76)),col="royalblue", cex=0.85)
# result I would have imagined
abline(a=-150,b=8,lty="dashed", col="red")
text(27.5,25,labels="What I think is better",col="red", cex=0.85)
text(27.5,20,labels=bquote(y== .(8)*x - .(150)),col="red", cex=0.85)
试试这个:
reg_lin_int <- reg_lin$coefficients[1]
reg_lin_slp <- reg_lin$coefficients[2]
sum((y1 - (reg_lin_int + reg_lin_slp*x1)) ^ 2)
# [1] 39486.33
sum((y1 - (-150 + 8 * x1)) ^ 2)
# [1] 55583.18
残差平方和低于 lm
拟合线。这是意料之中的,因为 reg_lin_int
和 reg_lin_slp
保证产生最小的总平方误差。
凭直觉,我们知道平方损失函数下的估计量对异常值很敏感。它是 "missing" 底部的组,因为它离左上角的组更近,而左上角的组距离更远——平方距离赋予这些点更大的权重。
事实上,如果我们使用 Least Absolute Deviations 回归(即指定绝对损失函数而不是平方),结果更接近您的猜测:
library(quantreg)
lad_reg <- rq(y1 ~ x1)
(专业提示:使用 lwd
使图表 更 更具可读性)
如@nongkrong 和@MikeWilliamson 所述,Total Least Squares 更接近您的想法。这是 TLS 在您的样本上的结果:
v <- prcomp(cbind(x1, y1))$rotation
bbeta <- v[-ncol(v), ncol(v)] / v[1, 1]
inter <- mean(y1) - bbeta * mean(x1)
您已经得到了一个很好的答案,但也许这也有帮助:
如您所知,OLS 最小化 y-direction 中的误差平方和。这意味着您的 x-values 的不确定性可以忽略不计,通常是这种情况。但是您的数据可能并非如此。如果我们假设 x 和 y 的不确定性相等并进行戴明回归,我们得到的拟合结果与您的预期更相似。
library(MethComp)
dem_reg <- Deming(x1, y1)
abline(dem_reg[1:2], col = "green")
您没有提供有关数据的详细信息。因此,这可能有用也可能没用。
我使用 lm
函数对我拥有的数据进行了线性回归。一切正常(没有错误消息),但我对结果感到惊讶:我的印象是 R "misses" 一组点,即截距和斜率不是最合适的。例如,我指的是坐标 x=15-25,y=0-20.
我的问题:
- 是否有函数可以比较 "expected" 系数和 "lm-calculated" 系数的拟合度?
- 我是不是在编码的时候犯了一个愚蠢的错误,导致
lm
做 那个?
以下一些答案:关于 x 和 y 的附加信息
x 和 y 都是疾病症状的视觉估计。两者都存在相同的不确定性。
数据和代码在这里:
x1=c(24.0,23.9,23.6,21.6,21.0,20.8,22.4,22.6,
21.6,21.2,19.0,19.4,21.1,21.5,21.5,20.1,20.1,
20.1,17.2,18.6,21.5,18.2,23.2,20.4,19.2,22.4,
18.8,17.9,19.1,17.9,19.6,18.1,17.6,17.4,17.5,
17.5,25.2,24.4,25.6,24.3,24.6,24.3,29.4,29.4,
29.1,28.5,27.2,27.9,31.5,31.5,31.5,27.8,31.2,
27.4,28.8,27.9,27.6,26.9,28.0,28.0,33.0,32.0,
34.2,34.0,32.6,30.8)
y1=c(100.0,95.5,93.5,100.0,98.5,99.5,34.8,
45.8,47.5,17.4,42.6,63.0,6.9,12.1,30.5,
10.5,14.3,41.1, 2.2,20.0,9.8,3.5,0.5,3.5,5.7,
3.1,19.2,6.4, 1.2, 4.5, 5.7, 3.1,19.2, 6.4,
1.2,4.5,81.5,70.5,91.5,75.0,59.5,73.3,66.5,
47.0,60.5,47.5,33.0,62.5,87.0,86.0,77.0,
86.0,83.0,78.5,83.0,83.5,73.0,69.5,82.5,78.5,
84.0,93.5,83.5,96.5,96.0,97.5)
## x11()
plot(x1,y1,xlim=c(0,35),ylim=c(0,100))
# linear regression
reg_lin=lm(y1 ~ x1)
abline(reg_lin,lty="solid", col="royalblue")
text(12.5,25,labels="R result",col="royalblue", cex=0.85)
text(12.5,20,labels=bquote(y== .(5.26)*x - .(76)),col="royalblue", cex=0.85)
# result I would have imagined
abline(a=-150,b=8,lty="dashed", col="red")
text(27.5,25,labels="What I think is better",col="red", cex=0.85)
text(27.5,20,labels=bquote(y== .(8)*x - .(150)),col="red", cex=0.85)
试试这个:
reg_lin_int <- reg_lin$coefficients[1]
reg_lin_slp <- reg_lin$coefficients[2]
sum((y1 - (reg_lin_int + reg_lin_slp*x1)) ^ 2)
# [1] 39486.33
sum((y1 - (-150 + 8 * x1)) ^ 2)
# [1] 55583.18
残差平方和低于 lm
拟合线。这是意料之中的,因为 reg_lin_int
和 reg_lin_slp
保证产生最小的总平方误差。
凭直觉,我们知道平方损失函数下的估计量对异常值很敏感。它是 "missing" 底部的组,因为它离左上角的组更近,而左上角的组距离更远——平方距离赋予这些点更大的权重。
事实上,如果我们使用 Least Absolute Deviations 回归(即指定绝对损失函数而不是平方),结果更接近您的猜测:
library(quantreg)
lad_reg <- rq(y1 ~ x1)
(专业提示:使用 lwd
使图表 更 更具可读性)
如@nongkrong 和@MikeWilliamson 所述,Total Least Squares 更接近您的想法。这是 TLS 在您的样本上的结果:
v <- prcomp(cbind(x1, y1))$rotation
bbeta <- v[-ncol(v), ncol(v)] / v[1, 1]
inter <- mean(y1) - bbeta * mean(x1)
您已经得到了一个很好的答案,但也许这也有帮助:
如您所知,OLS 最小化 y-direction 中的误差平方和。这意味着您的 x-values 的不确定性可以忽略不计,通常是这种情况。但是您的数据可能并非如此。如果我们假设 x 和 y 的不确定性相等并进行戴明回归,我们得到的拟合结果与您的预期更相似。
library(MethComp)
dem_reg <- Deming(x1, y1)
abline(dem_reg[1:2], col = "green")
您没有提供有关数据的详细信息。因此,这可能有用也可能没用。