Press "Enter" to skip to content

R中用线性回归进行预测建模


预测模型对于预测未来结果和估算实际难以量化的指标非常有用。例如,数据科学家可以使用预测模型基于降雨和温度预测作物产量,或确定具有某些特征的患者是否更可能对新药物反应严重。
在我们具体讨论线性回归之前,让我们自己回顾一下典型的数据科学工作流程。很多时候,我们将从我们想要回答的问题开始,并执行以下操作:

  • 收集与问题相关的一些数据(更多数据几乎总是更好)。
  • 如果需要,可以将数据清理,扩充和预处理为方便的形式。
  • 对数据进行探索性分析以更好地了解数据。
  • 使用您的发现作为指南,构建数据某些方面的模型。
  • 使用该模型回答您开始的问题,并验证您的结果。

线性回归是数据科学家用于预测建模的最简单和最常见的监督机器学习算法之一。 在这篇文章中,我们将使用线性回归来构建一个模型,该模型从人们易于研究的树木测量指标来预测樱桃树的体积。
我们将在此博客文章中使用R来探索此数据集并学习线性回归的基础知识。 如果您不熟悉R,我们建议从R Data Analyst路径获取R基础知识和R编程:中级课程。 它也有助于获得一些非常基本的统计知识,但如果你知道平均值和标准偏差是什么,你就可以跟随它。 如果您想自己练习构建模型和可视化,我们将使用以下R包:

  • datasets
    该软件包包含各种练习数据集。 我们将使用其中一个“tree”来学习构建线性回归模型。
  • GGPLOT2
    我们将使用这个流行的数据可视化包来构建我们的模型图。
  • GGally
    该包扩展了ggplot2的功能。 我们将使用它来创建绘图矩阵,作为我们最初的探索性数据可视化的一部分。
  • scatterplot3d
    我们将使用此包来显示具有多个预测变量的更复杂的线性回归模型。

无论如何,他们如何测量树木的体积?

树数据集包含在基础R的数据集包中,它将帮助我们回答这个问题。 由于我们正在使用现有的(干净的)数据集,上面的步骤1和2已经完成,因此我们可以跳到第3步中的一些初步探索性分析。这个数据集是什么样的?

  1. data(trees) # 从datasets包中获取tree数据集
  2. head(trees) # 查看数据集前面几行

  1. str(trees) # 查看变量的结构


该数据集由31个描述黑樱桃树的3个数值变量组成:

  • 树干周长(in)
  • 高度(英尺)
  • 体积(ft3)

这些指标对于研究树木生态学的林务员和科学家来说是有用的信息。 使用基本的林业工具测量树木高度和周长相当简单,但测量树木体积要困难得多。 如果您不想实际减少和拆除树木,您必须采取一些技术上具有挑战性和耗时的活动,如爬树和进行精确测量。 能够从高度和/或周长准确预测树木体积将是有用的。

为了确定我们是否可以建立预测模型,第一步是查看我们的预测变量和响应变量(在这种情况下是周长,高度和体积)之间是否存在关系。 让我们做一些探索性的数据可视化。 我们将使用GGally包中的ggpairs()函数创建一个绘图矩阵,以查看变量如何相互关联。

  1. ggpairs(data = trees, columns = 1:3, title = "trees data")


ggpairs()函数给出了每个变量组合的散点图,以及每个变量的密度图和变量之间的相关强度。 如果您之前使用过ggplot2,这个符号可能看起来很熟悉:GGally是ggplot2的扩展,它提供了一个简单的界面来创建一些像这样复杂的图。
当我们查看这些图时,我们可以开始了解数据并提出问题。 相关系数提供有关变量与关系有多接近的信息; 相关系数越接近1,关系越强。 散点图让我们可视化变量对之间的关系。 散点图中点具有清晰的视觉模式(与看起来像无形的云相反)表明关系更强。
我们的问题:
哪些预测变量似乎与响应变量相关?
从ggpairs()输出看,周长似乎与体积有关:相关系数接近于1,并且这些点似乎具有线性模式。 高度和体积之间可能存在关系,但看起来较弱:相关系数较小,散点图中的点更加分散。
变量之间关系的形状是什么?
这种关系似乎是线性的; 从散点图中,我们可以看到随着树周长的增加树木体积不断增加。
这种关系是强大的,还是淹没信号的数据中的噪音?
高度和体积之间的关系不是那么清楚,但是周长和体积之间的关系似乎很强。
现在我们对数据有了一个很好的整体把握,我们可以继续进行第4步并做一些预测建模。

形成一个假设

一个假设是对我们认为我们的数据发生了什么的有根据的猜测。 在这种情况下,让我们假设樱桃树的周长和体积是相关的。 我们形成的每个假设都有相反的结论:“零假设”(H0)。 在这里,我们的零假设是周长和体积无关。
在统计学中,零假设是我们使用我们的数据来支持或拒绝的假设; 我们不能说我们“证明”一个假设。 我们称之为周长和体积与我们的“替代”假设(Ha)相关。
总结一下:

  • H0:周长和体积之间没有关系
  • Ha:周长和体积之间有一些关系

我们的线性回归模型将用于检验我们的假设。 如果我们找到足够强的证据来拒绝H0,那么我们就可以使用该模型来预测来自周长的樱桃树体积。

构建线性回归模型

线性回归描述了感兴趣的响应变量(或因变量)与一个或多个预测变量(或独立变量)之间的关系。 它有助于我们将信号(我们可以从预测变量中学习关于响应变量的信息)与噪声分离(我们无法从预测变量中了解响应变量)。 随着我们的前进,我们将深入探讨模型如何做到这一点。

让我们直接进入并建立一个将树体积与周长相关联的线性模型。 R使用基本函数lm()简化了这一点。

  1. fit_1 <- lm(Volume ~ Girth, data = trees)

lm()函数拟合我们数据的一条线,尽可能接近我们所有的31个观测值。 更具体地说,它以这样的方式拟合线,即点和线之间的平方差的总和最小化; 这种方法被称为“最小化最小二乘法”。
即使线性回归模型非常适合数据,拟合也并不完美。 我们的观测值与模型预测值之间的距离称为残差

在数学上,我们可以将线性回归的等式写成:

  • Y和X变量是我们与彼此相关的数据的响应和预测变量
  • β0是表示模型截距或与y轴交叉的模型系数
  • β1是表示模型斜率的模型系数,该斜率是给出关于线的陡度及其方向(正面或负面)的信息的数字。
  • ε是包含我们无法在模型中捕获的可变性的误差项(X不能告诉我们关于Y的信息)

就我们的例子而言:
Tree Volume ≈ Intercept + Slope(Tree Girth) + Error

lm()函数估计它适合我们数据的线性模型的截距和斜率系数。 有了模型,我们可以继续执行第5步,记住我们还有一些工作要做,以验证这个模型实际上适合数据的想法。

我们可以使用这个模型进行预测吗?

我们是否可以使用我们的模型进行预测取决于:

  • 我们是否可以拒绝零假设,即我们的变量之间没有关系。
  • 该模型是否适合我们的数据。

让我们使用summary()调用模型的输出。 模型输出将为我们提供测试我们的假设所需的信息,并评估模型与我们的数据的匹配程度。

让我们通过输出来回答每个问题。

该假设是否得到支持?

系数估计和标准误差
如果周长值为零,我们示例中的截距是预期的树体积。当然,我们不能拥有负数量的树,但稍后会分析。
我们的例子中的斜率是树周长对树体积的影响。我们看到,对于每增加一英寸的周长,树木体积增加5.0659英尺3。
系数标准误差告诉我们估计系数与我们的响应变量的实际平均值的平均变化。
t值
这是一个测试统计量,用于衡量估计系数与零的标准偏差。
PR(> | T |)
该数字是p值,定义为如果H0为真,则任何观察值的概率大于或者等于t值。 t统计量越大,p值越小。一般来说,我们使用0.05作为显着性的截止值;当p值小于0.05时,我们拒绝H0。
我们可以拒绝零假设,而是相信树宽和体积之间存在关系。

模型与数据的拟合程度如何?

残差
输出的这一部分为我们提供了残差的总结(回想一下这些是我们的观察与模型之间的距离),它告诉我们一些关于我们的模型如何适合我们的数据。残差应该在零附近具有非常对称的分布。一般来说,我们正在寻找正态分布在零附近的残差(即钟形曲线分布),但重要的是它们没有视觉上明显的模式,这表明线性模型不适合数据。
我们可以使用ggplot2制作直方图以使其可视化。

  1. ggplot(data=trees, aes(fit_1$residuals)) +
  2. geom_histogram(binwidth = 1, color = "black", fill = "purple4") +
  3. theme(panel.background = element_rect(fill = "white"),
  4. axis.line.x=element_line(),
  5. axis.line.y=element_line()) +
  6. ggtitle("Histogram for Model Residuals")


我们的残差在0附近看起来非常对称,这表明我们的模型很好地拟合了数据。
Residual standard error::
该术语表示我们的响应变量测量值偏离拟合线性模型(模型误差项)的平均量。
Degrees of freedom (DoF):
对自由度的讨论可能变得相当技术性。出于本文的目的,将它们视为用于计算估计的独立信息的数量就足够了。 DoF与测量数量相关但不相同。
Multiple R-squared:
R2值衡量我们的数据与线性回归模型的接近程度。 R2值始终在0和1之间;接近1的数字代表合适的模型。 R2总是随着模型中包含更多变量而增加,因此包含调整后的R2以计算用于制作模型的独立变量的数量。
F statistic:
此测试统计信息告诉我们正在测试的依赖变量和自变量之间是否存在关系。通常,大F表示更强的关系。
p-value:
该p值与F统计量相关联,用于解释适合我们数据的整个模型的显着性。
让我们来看看我们的模型是否适合我们的周长和体积数据。 我们可以通过使用ggplot()将线性模型拟合到我们数据的散点图中来实现:

  1. ggplot(data = trees, aes(x = Girth, y = Volume)) + geom_point() +
  2. stat_smooth(method = "lm", col = "dodgerblue3") +
  3. theme(panel.background = element_rect(fill = "white"),
  4. axis.line.x=element_line(),
  5. axis.line.y=element_line()) +
  6. ggtitle("Linear Model Fitted to Data")


线周围的灰色阴影表示0.95的置信区间,这是stat_smooth()函数的默认值,它可以平滑数据以使模式更易于显示。该0.95置信区间是所有黑樱桃树的周长和体积的真实线性模型将在符合我们数据的回归模型的置信区间内的概率。
即使这个模型非常适合我们的数据,我们的观察结果仍然存在差异。这是因为世界通常不整洁。在我们的模型中,树木体积不仅仅是树木周长的函数,而且还有我们不一定需要数据量化的东西(树干形状之间的个体差异,林务员树干周长测量技术的微小差异)。
有时,这种可变性会掩盖响应和预测变量之间可能存在的任何关系。但在这里,我们数据中的信号足够强大,可以让我们开发一个有用的模型来进行预测。
原文链接:
https://www.dataquest.io/blog/statistical-learning-for-predictive-modeling-r/

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注