《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

本节书摘来自华章计算机《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一书中的第2章,第2.6节,作者:[美] 德博拉·诺兰(Deborah Nolan)  邓肯·坦普·朗(Duncan Temple Lang)  更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.6 对个人跑步时间的变化进行建模

樱花公路赛的结果包含20~80岁的运动员的比赛记录。然而,不会有任何一个运动员的记录满足60年的跨度。由于我们只有14年的比赛记录,所以最多只能观察到一个运动员20~33岁的记录,或者一个80岁的运动员从他67岁之后的记录。因此,满足60年的跨度是不可能的。这意味着,当研究随时间推移的个人成绩时,我们看到的是长度最多有14年的短时间序列。研究20~80岁的成绩意味着我们必须依赖数据的横截面信息,而这样的信息需要在这些短的时间序列里获得。
可以合理地猜测在一个短的时期内,比如8~10年,一名选手的成绩大致与年龄成线性关系(我们已经从横截面数据的分段线性模型中得到了这样的结论)。我们可以绘制图形以确定是否属于这种情况。现在有300多名参赛选手的数据可以用来绘图,为了限制过度绘制的影响,我们针对不同数据子集绘制多张图形。首先我们将参赛选手分成9组,在3×3的网格上绘制9张图,分配给每组大致相同数量的选手:

为每一幅图创建一个空白画布。例如,

然后我们在组内为每个选手添加线段,使用不同颜色和类型的线段以区分不同的参赛选手。下面的addRunners()函数为每个选手添加一条线段:

我们可以创建9块空白的画布,并用以下代码为参赛选手添加线段:

invisible()函数隐藏了sapply()函数的返回值。由于该函数的功能是将线段添加到画布上,因此对于每次迭代它都返回NULL,可以安全地忽略该返回值。
在图2-17中,可以看到9幅曲线图,每幅图大约包含30名运动员。有些运动员的成绩波动有点大,我们可能需要重新回顾一下舍弃参赛选手的概念,即由于选手的成绩波动超出了预期,因此有可能是两个不同运动员记录的合并,需要将他们舍弃掉。这里我们将以上处理留作练习。另外,为每位选手的成绩拟合一条直线似乎更合理。
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

图2-17 多场赛事的比赛用时。这些曲线图表示至少完成8次樱花赛的男选手的跑步时间。每个连接的片段集合对应一位运动员的跑步时间。观察所有的曲线图可以看出,该图和图2-7中的散点图呈现相似的形状,例如,图形随着年龄向上弯曲。然而,我们也可以看到单个选手成绩的变化情况。例如,许多中年选手的跑步时间随着年龄的增长而迅速增加,但并不是所有人都这样。他们中的一些人的成绩在进步,而另一些人的成绩变化较慢
针对个体选手的纵向分析隐式地抑制了那些可能影响成绩的协变量,比如性别。其中一个例外就是任意给定年份的比赛条件—由于路线或天气的变化,一些年份的速度可能慢些,一些年份速度可能快些。然而,看似合理的是这样的影响跟年龄无关,因此它相当于测量噪声。
现在有了参赛选手的名单,我们希望将每位选手的成绩拟合成一条线。如果针对一位选手编写函数执行该处理,那么就可以把该函数应用到名单上所有的选手。这个函数需要怎么做呢?可以让它通过lm()函数拟合一条线。函数需要返回什么值呢?我们对返回年龄的系数感兴趣,但是需要能够在年龄的上下文中对它进行解释。由于有每位选手的多个年龄,那么就让我们返回一个年龄的中间值。并且在得到该值后,返回一个该年龄上选手成绩的预测值。需要为函数输入什么呢?实际上仅仅是参赛选手的比赛用时和年龄。我们可以将它们作为独立的参数传入函数或者传入我们的数据框中。如果是后者,我们需要知道要拟合的变量名。下面完成这项工作。我们还让函数将被拟合的线段添加到绘图中。也可以通过增加参数使其变为可选操作,该参数的缺省值为FALSE,仅当指定参数为TRUE时函数才添加线段。该函数如下:
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

这里我们留一道练习题,增强以上函数的功能,使它也可以返回年龄误差的SD(标准差)以及年龄系数的SE(标准误差)。另外,我们也将另一种可选方法留作练习,即同时拟合所有运动员的线段,使噪声分散在所有运动员上。
针对图2-17中的一幅曲线图,我们可以用fitOne()函数添加拟合曲线,代码如下:
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

观察图2-18中的黑色虚线,这些线段似乎捕捉到了每个运动员的成绩变化。
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

图2-18 单个选手的跑步时间关于年龄的线性拟合。这里我们用最小二乘法对每个运动员的比赛用时进行拟合,以增强图2-17右下角的曲线图。总共有30条左右单个选手的黑色虚线段
接下来检查运动员与运动员之间的差异,我们使用以下调用对全部306位运动员进行线性拟合:
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

现在,对至少参赛8次的运动员(且在这些参赛年度中所居住的州名相同),我们用一个单一系数表示比赛用时和年龄之间的关系。这个系数以分钟为单位,也是每年10英里赛比赛的时间单位。如果系数为正,表示该参赛者因速度变慢而使每年比赛用时增加的分钟数。
从图2-19可以发现这些系数是如何随年龄进行变化的。大量参赛选手的个人成绩发生了变化,很多人在30岁以后开始变慢,而少量的人在他们50多和60多岁期间跑得更快。不管怎样,我们还是可以看到年龄和比赛用时之间的关系,在系数方面呈线性正相关趋势。可以用如下方式进行拟合:

拟合的概要信息如下:
《数据科学R语言实践:面向计算推理与问题求解的案例研究法》一一2.6 对个人跑步时间的变化进行建模

图2-19 运动员的纵向分析系数。该散点图显示了对300多位参赛选手进行直线拟合的斜率,这些选手都至少完成了8次樱花赛。系数为负表示参赛选手随着年龄增长速度变得更快。该图包括一条基于最小二乘法的拟合直线和一条loess拟合曲线。注意几乎所有超过50岁的选手的系数都为正值。对于50岁的选手,系数的典型值是每年大约1分钟
在图中我们沿着0水平参考线添加拟合直线,同时使用loess()函数画出平滑系数拟合曲线。该图表明,在平均情况下,年龄低于35岁的运动员的成绩有所提高。也就是说,低于35岁的选手的年龄系数是负值。假设的“平均”参赛选手在年龄超过35岁以后跑步开始放慢。到60岁时,这个典型选手每年大约会慢1.3分钟,大致是横截面分析法显示结果的2倍。

上一篇:了解GAC:从“找不到Microsoft.SqlServer.SqlClrProvider.dll”的问题开始


下一篇:CentOS 7 上使用Certbot申请通配符证书