相较于一元线性回归,多元线性回归是用来确定2个或2个以上变量间的统计分析方法,其基本的分析方法和一元线性回归是类似的。
优点:
1.可适用于几乎所有的数据;
2.提供了特征与结果之间关系的强度和大小的估计。缺点:
1.对数据做出了很强的假设;
2.模型形式必须事先指定;
3.不能很好地处理缺失数据。基本步骤:对选取的多元数据集定义数学模型,进行参数估计,对参数进行显著性检验、残差分析、异常点检验,最后确定回归方程进行模型预测。特别地,对于多元回归方程有一项很重要的操作就是自变量的优化,要挑选出相关性最显著的自变量,同时去除不显著的自变量。
接下来以医疗费用为例,通过分析病人的数据,来预测这部分群体的平均医疗费用,从而来为年度保费价格的设定提供参考。
数据来源:https://github.com/stedy/Machine-Learning-with-R-datasets/find/master里的insurance.csv文件,它是美国人口普查局(U.S. Census Bureau)的人口统计资料。
文件包含1338个案例,即目前已经登记过的保险计划受益者以及表示病人特点和历年计划计入的总医疗费用的特征。这些特征分别是:
- age:整数,受益者的年龄(不包括超过64岁的人,因为这部分人群的费用由政府承担);
- sex:保单持有人的性别,male或者female;
- bmi:身体质量指数(Body Mass Index, BMI),它等于体重(公斤)除以身高(米)的平方,理想的BMI指数在18.5和24.9之间;
- children:整数,保险计划中包括的孩子或者受抚养者的数量;
- smoker:被保险人是否吸烟,yes或者no;
- region:根据受益人在美国的居住地,分为4个地理区域,分别是northeast, southeast, southwest和northwest。
如何将这些变量与已结算的医疗费用联系起来很重要,在回归分析中,特征之间的关系通常是由使用者指定,而不是自动检测出来的。
> insurance <- read.csv("insurance.csv", stringsAsFactors = T)
> str(insurance)
'data.frame': 1338 obs. of 9 variables:
$ age : int 19 18 28 33 32 31 46 37 37 60 ...
$ sex : Factor w/ 2 levels "female","male": 1 2 2 2 2 1 1 1 2 1 ...
$ bmi : num 27.9 33.8 33 22.7 28.9 ...
$ children: int 0 1 3 0 0 0 1 3 2 0 ...
$ smoker : Factor w/ 2 levels "no","yes": 2 1 1 1 1 1 1 1 1 1 ...
$ region : Factor w/ 4 levels "northeast","northwest",..: 4 3 3 2 2 3 3 2 1 2 ...
$ charges : num 16885 1726 4449 21984 3867 ...
$ age2 : num 361 324 784 1089 1024 ...
$ bmi30 : num 0 1 1 0 0 0 1 0 0 0 ...
- read.csv()函数读入数据,用stringsAsFactors = T将名义变量转换成因子变量;
- str()函数查看数据结构,确认各个变量的读取是否有异常;
- summary()函数查看charges的分布情况;
- hist()函数可得到数据分布的直方图,表明保险费用的分布是右偏的,其平均数大于中位数,同时我们可以知道绝大数的人每年的费用在0到15000美元之间。
接下来面临的一个问题是如何处理因子类型的特征,因为回归模型需要每一个特征值都是数值型的。
在使用回归模型拟合数据之前,有必要确定自变量与因变量之间以及自变量之间是如何相关的。相关系数矩阵(correlation matrix)可以为每一对变量之间的关系提供一个相关系数。
> cor(insurance[c("age", "bmi", "children", "charges")])
age bmi children charges
age 1.0000000 0.1092719 0.04246900 0.29900819
bmi 0.1092719 1.0000000 0.01275890 0.19834097
children 0.0424690 0.0127589 1.00000000 0.06799823
charges 0.2990082 0.1983410 0.06799823 1.00000000
- cor()函数为insurance中的4个数值型变量创建了一个相关系数矩阵。
相关系数矩阵中存在着一些显著的相关,例如age和bmi,这就说明随着年龄的增长,身体质量指数也会增加。此外,age和charges、bmi和charges以及children和charges也都呈现出相关性。
散点图矩阵(sactterplot matrix)是一个简单地将散点图集合排列在网格中,并且包含相互紧邻的多种因素的图表。
> pairs(insurance[c("age", "bmi", "children", "charges")])
- pairs()函数可用于绘制散点图矩阵。
在散点图矩阵中,每个行和列的交叉点所在的散点图表示其所在的行与列的两个变量的相关关系,在对角线上方的图和下方的图是互为转置的。大部分的散点图看上去像是随机密布的点,但还是有一些会呈现出某种趋势,例如age和charges之间的关系呈现出几条相对的直线,而bmi和charges则构成了两个不同的群体。
> pairs.panels(insurance[c("age", "bmi", "children", "charges")])
- pairs.panels()函数属于R包psych,其产生的散点图矩阵有着更多的信息。
对角线的上方表示的是相关系数矩阵,对角线上的直方图描绘了每个特征的数值分布,对角线下方的散点图带有更多的可视化信息。
散点图中的椭圆被称为相关椭圆(correlation ellipse),它提供了一种变量之间是如何密切相关的可视化信息。相关椭圆中心的点表示x轴变量的均值和y轴变量的均值。两个变量的相关性由椭圆的形状所表示,椭圆越被拉伸,其相关性越强。若形状近似于圆,如bmi和children,则表示一种非常弱的相关性。
散点图中的曲线是局部回归平滑(loess smooth)曲线,它表示x轴和y轴变量之间的一般关系。例如,对于age和bmi而言,局部回归平滑曲线是一条倾斜的逐步上升的线,这说明bmi会随着age的增长而增长,这个结论从相关系数矩阵中也能得出。
> ins_model <- lm(charges ~ age + children + bmi + sex + smoker + region, data = insurance)
> ins_model
Call:
lm(formula = charges ~ age + children + bmi + sex + smoker +
region, data = insurance)
Coefficients:
(Intercept) age children bmi sexmale smokeryes regionnorthwest
-11938.5 256.9 475.5 339.2 -131.3 23848.5 -353.0
regionsoutheast regionsouthwest
-1035.0 -960.1
- lm()函数用于对数据拟合线性回归模型;
- 直接输入模型对象名称ins_model,就可以输出估计的系数。
需要注意的是,我们在模型公式中仅仅指定了6个变量,但是却输出8个系数(除截距外)。这是因为lm()函数自动将虚拟编码(dummy coding)应用于模型所包含的每一个因子类型的变量中。当添加一个虚拟编码的变量到回归模型中时,一个类别总是被排除在外作为参照类别,然后估计的系数就是相对于参照类别解释的。在我们的模型中,自动保留了sexfemale、smokerno和regionnortheast变量,使东北地区的女性非吸烟者作为参照组。因此,相对于女性来说,男性每年的医疗费用要少131.30美元,吸烟者平均多花费23848.50美元,远远超过非吸烟者。此外,模型中另外3个地区的系数是负的,这意味着东北地区倾向于具有最高的平均医疗费用。
线性回归模型的结果是合乎逻辑的,因为高龄、吸烟和肥胖往往与其它健康问题联系在一起,而额外的家庭成员或者受抚养者可能会导致就诊次数增加和预防保健费用的增加。
至此,我们已经得到了回归模型,但是目前并不知道该模型对数据的拟合有多好。下一篇再接着讲解吧!