本文概述
- 什么是线性回归?
- 在R中创建线性回归。
- 系数。
- 残差
- 如何测试你的线性模型是否合适?
- 别忘了看一下残差!
- 检测影响点。
- 总结
- 什么是线性回归?
- 在R中创建线性回归。
- 了解系数和残差的概念。
- 如何测试你的线性模型是否合适?
- 检测影响点。 :target:before { content:""; display:block; height:150px; margin:-150px 0 0; } h3 {font-weight:normal; margin-top:.5em} h4 { font-weight:lighter }
在R中创建线性回归。 并非所有问题都可以使用相同的算法解决。在这种情况下, 线性回归假设响应变量和解释变量之间存在线性关系。这意味着你可以在两个(或更多变量)之间划一条线。在前面的示例中, 很明显, 孩子的年龄与其身高之间存在关系。
文章图片
在此特定示例中, 如果你知道孩子的年龄, 则可以计算其身高:
$ \ text {Height} = a + \ text {Age} * b $
在这种情况下, ” a” 和” b” 分别称为截距和斜率。在相同的示例中, ” a” 或截距是你开始测量的值。零个月的新生儿不一定是零厘米。这是拦截的功能。坡度测量的是高度随月龄的变化。通常, 孩子的年龄每增加一个月, 其身高就会增加” b” 。
可以使用lm命令在R中计算线性回归。在下一个示例中, 使用此命令根据孩子的年龄计算身高。
首先, 导入库readxl以读取Microsoft Excel文件, 它可以是任何格式, 只要R可以读取它即可。要了解有关将数据导入R的更多信息, 你可以参加此srcmini课程。
可以在此处下载用于本教程的数据。将数据下载到名为ageandheight的对象, 然后在第三行中创建线性回归。 lm命令采用以下格式的变量:
lm([目标变量]?[预测变量], 数据= [数据源])
使用命令摘要(lmHeight), 你可以查看有关模型性能和系数的详细信息。
library(readxl)
ageandheight <
- read_excel("ageandheight.xls", sheet = "Hoja2") #Upload the data
lmHeight = lm(height~age, data = http://www.srcmini.com/ageandheight) #Create the linear regression
summary(lmHeight) #Review the results
文章图片
你可能已经注意到, 查看兄弟姐妹的数量是预测孩子身高的一种愚蠢的方法。注意线性模型的另一个方面是系数的p值。在前面的示例中, 蓝色矩形表示年龄和同胞数量的p值。简而言之, p值表示你是否可以拒绝或接受假设。在这种情况下, 假设是预测变量对你的模型没有意义。
- 年龄的p值为4.34 * e-10或0.000000000434。很小的值表示年龄可能是对模型的出色补充。
- 兄弟姐妹数的p值为0.85。换句话说, 此预测变量有85%的可能性对回归没有意义。
残差 测试模型拟合质量的一种好方法是查看残差或实际值与预测值之间的差异。上图中的直线表示预测值。从直线到观测数据值的红色垂直线是残差。
文章图片
这里的想法是残差之和大约为零或尽可能低。在现实生活中, 大多数情况不会遵循完美的直线, 因此会出现残差。在lm函数的R摘要中, 你可以看到有关模型残差的描述性统计信息, 在同一示例之后, 红色方块显示残差如何近似为零。
文章图片
如何测试你的线性模型是否合适? 确定系数或R2是用来测试模型质量的一种度量。该度量由回归模型解释的总可变性的比例定义。
$ R ^ 2 = \ frac {\ text {模型的解释变体}} {\ text {模型的总变体}} $
这似乎有些复杂, 但是通常, 对于适合数据的模型, R2接近1。不适合数据的模型的R2接近0。在下面的示例中, 第一个R0.02为0.02。这意味着该模型仅解释了2%的数据可变性。第二个模型的R2为0.99, 该模型可以解释总变异性的99%。**
文章图片
文章图片
但是, 请务必记住, 有时高R2不一定每次都很好(请参见下面的剩余图), 而低R2不一定总是不好。在现实生活中, 事件并不能始终完美地结合在一起。例如, 你可以在数据中包含相同年龄的较高或较小的孩子。在某些领域, R2为0.5被认为是好的。
与上述相同, 查看线性模型的摘要以了解其R2。
文章图片
在蓝色矩形中, 请注意, 有两个不同的R2, 一个是倍数, 另一个是已调整的。倍数是你先前看到的R2。 R2的一个问题是, 当你向模型中添加更多自变量时, R2不会减小, 即使使这些变量对你的预测没有任何影响(例如, 兄弟姐妹数)。因此, 如果在模型中添加多个变量, 则调整后的R2可能更好看, 因为只有在减少预测的整体误差的情况下, R2才会增加。
别忘了看一下残差! 你的模型中可以有一个相当不错的R2, 但是在这里我们不要匆忙得出结论。让我们来看一个例子。你将根据材料的温度预测实验室中材料的压力。
让我们绘制数据(在一个简单的散点图中)并添加你使用线性模型构建的线。在此示例中, 让R首先使用read_excel命令再次读取数据, 以使用数据创建数据框, 然后使用新数据创建线性回归。命令图采用数据框并在其上绘制变量。在这种情况下, 它根据材料的温度绘制压力。然后, 使用命令abline添加通过线性回归生成的线。
pressure <
- read_excel("pressure.xlsx") #Upload the data
lmTemp = lm(Pressure~Temperature, data = http://www.srcmini.com/pressure) #Create the linear regression
plot(pressure, pch = 16, col ="blue") #Plot the results
abline(lmTemp) #Add a regression line
文章图片
如果你看到新模型的摘要, 则可以看到它的效果很好(请看一下R2和调整后的R2)
summary(lmTemp)
Call:
lm(formula = Pressure ~ Temperature, data = http://www.srcmini.com/pressure)Residuals:
Min1Q Median3QMax
-41.85 -34.72 -10.9024.6963.51Coefficients:
Estimate Std. Error t value Pr(>
|t|)
(Intercept) -81.500029.1395-2.7970.0233 *
Temperature4.03090.46968.583 2.62e-05 ***
---
Signif. codes:0'***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 42.66 on 8 degrees of freedom
Multiple R-squared:0.902, Adjusted R-squared:0.8898
F-statistic: 73.67 on 1 and 8 DF, p-value: 2.622e-05
理想情况下, 在绘制残差时, 它们应该看起来是随机的。否则意味着可能存在线性模型未考虑的隐藏模式。要绘制残差, 请使用命令plot(lmTemp $ residuals)。
plot(lmTemp$residuals, pch = 16, col = "red")
文章图片
这可能是一个问题。如果你有更多数据, 则简单的线性模型将无法很好地概括。在上一张图片中, 请注意有一个图案(如残差上的曲线)。这根本不是随机的。
你可以做的是变量的转换。可以对数据执行许多可能的转换, 例如添加二次项$(x ^ 2)$, 三次项$(x ^ 3)$或更复杂的数据, 例如ln(X), ln(X + 1), sqrt(X), 1 / x, Exp(X)。正确转换的选择将带有一些代数函数, 实践, 试验和错误的知识。
让我们尝试一个二次项。为此, 在转换之前添加术语” I” (大写” I” ), 例如, 这将是正常的线性回归公式:
lmTemp2 = lm(Pressure~Temperature + I(Temperature^2), data = http://www.srcmini.com/pressure) #Create a linear regression with a quadratic coefficient
summary(lmTemp2) #Review the results
Call:
lm(formula = Pressure ~ Temperature + I(Temperature^2), data = http://www.srcmini.com/pressure)Residuals:
Min1QMedian3QMax
-4.6045 -1.63300.55451.17954.8273Coefficients:
Estimate Std. Error t value Pr(>
|t|)
(Intercept)33.7500003.6155919.335 3.36e-05 ***
Temperature-1.7315910.151002 -11.467 8.62e-06 ***
I(Temperature^2)0.0523860.00133839.158 1.84e-09 ***
---
Signif. codes:0'***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1Residual standard error: 3.074 on 7 degrees of freedom
Multiple R-squared:0.9996, Adjusted R-squared:0.9994
F-statistic:7859 on 2 and 7 DF, p-value: 1.861e-12
请注意, 该模型已大大改善。如果绘制新模型的残差, 它们将如下所示:
plot(lmTemp2$residuals, pch = 16, col = "red")
文章图片
现在, 你的残留物上看不到任何清晰的图案, 这很好!
检测影响点。 在你的数据中, 你可能具有一些影响点, 这些影响点有时可能会不必要地扭曲你的模型。考虑一下数据输入中的错误, 该值不是写” 2.3″ , 而是” 23″ 。最常见的影响点是离群点, 它们是观察到的响应似乎不遵循其余数据建立的模式的数据点。
【R中的线性回归权威指南】你可以通过使用cooks.distance函数查看包含线性模型的对象来检测影响点, 然后绘制这些距离。故意更改一个值, 以查看其在” 库克距离” 图上的外观。要更改特定值, 你可以使用ageandheight [行号, 列号] = [新值]直接指向它。在这种情况下, 高度将更改为第二个示例的7.7:
ageandheight[2, 2] = 7.7
head(ageandheight)
年龄 | 高度 | 无兄弟姐妹 |
---|---|---|
18 | 76.1 | 0 |
19 | 7.7 | 2 |
20 | 78.1 | 0 |
21 | 78.2 | 3 |
22 | 78.8 | 4 |
23 | 79.7 | 1 |
lmHeight3 = lm(height~age, data = http://www.srcmini.com/ageandheight)#Create the linear regression
summary(lmHeight3)#Review the results
plot(cooks.distance(lmHeight3), pch = 16, col ="blue") #Plot the Cooks Distances.
Call:
lm(formula = height ~ age, data = http://www.srcmini.com/ageandheight)Residuals:
Min1QMedian3QMax
-53.704-2.5843.6099.50317.512Coefficients:
Estimate Std. Error t value Pr(>
|t|)
(Intercept)7.90538.3190.2060.841
age2.8161.6131.7450.112Residual standard error: 19.29 on 10 degrees of freedom
Multiple R-squared:0.2335, Adjusted R-squared:0.1568
F-statistic: 3.046 on 1 and 10 DF, p-value: 0.1115
文章图片
请注意, 有一点不遵循模式, 可能会影响模型。在这里, 你可以就这一点做出决策, 通常, 有三点原因可以说明这一点如此重要:
- 有人录制错误
- 有人在收集观测值时犯了一个根本错误
- 数据点是完全有效的, 在这种情况下, 模型无法解释行为。
请注意, 有影响力的点可能是有效点, 请确保在删除数据之前先检查数据及其来源。在统计资料书中经常会出现这样的报价:” 有时候, 当我们应该抛出可疑的模型时, 我们会抛出非常好的数据。”
总结 你做到了!线性回归是一个很大的话题, 并且将持续下去。在这里, 我介绍了一些技巧, 这些技巧可以帮助调优并充分利用这种强大而又简单的算法。你还学习了如何理解此简单统计模型的内容以及如何根据需要进行修改。你还可以通过在R控制台上键入” ?lm” 并查看此处未涵盖的不同参数来探索其他选项。如果你有兴趣研究统计模型, 请继续阅读R中的” 统计模型” 课程。
推荐阅读
- TensorBoard精品开发教程
- 使用Tableau进行数据可视化
- 将字符串转换为日期作为datetime对象
- 使用Python增强数据科学中的电子表格
- Android-shape圆形&转圈圈
- appuim的简单使用及实例
- jenkins-APP打包页面展示二维码
- Linux下打开Android调试器DDMS的方法
- 在Android上运行Java和C程序