UA MATH571A R语言回归分析实践 多元回归1 医疗费用
这一讲开始讨论多元回归,这里选择的例子是寻找家庭医疗费用的决定因素。家庭医疗费用由哪些因素决定是卫生经济学、保险精算等领域共同关注的问题之一,它对于医疗收费与补贴政策的制定、健康医疗保险保费厘定等具有重要指导意义。这个例子的数据我上传资源了,如果需要可以自行下载。
先来看看数据大概什么样子
我们关注的被解释变量是charges,这个就是是家庭医疗费用(用
表示),它是一个quantitative variable,也就是数值型变量;年龄age、性别sex、体质比BMI、children、smoker、地区region是解释变量(分别用
表示)。其中sex、smoker和region是categorical variable或者qualitative variable,也就是类型变量,他们的值只是表示属于某个类型,没有数值上的含义。Smoker指的是个体是否吸烟、children指的是有几个小孩。
基础回归分析
根据这些变量,我们可以构建一个baseline
基于这六个解释变量可以构建的最简单额度多元回归模型就是这个,我们先用这个模型进行一些简单的分析,然后和我们在一元回归里面做的一样,我们看看模型的解释力如何,做一下模型诊断卡看看能不能提高解释力;和一元回归不一样的是,在多元回归中,我们需要探索是不是每个解释变量都有很高的解释力,都应该加入模型中?是不是需要考虑高阶项或者交互项?有没有可能找到一个解释力最强的模型?但在做更深入探索之前,我们需要先分析最简单的这个回归,以确保这个问题和这些数据是值得去深挖的。
首先读取数据,read.csv和setwd的注意事项和一元回归一样。
setwd("D:/Stat PhD/taking course/summer1/ref/regression")
Data <- read.csv("insurance.csv", header = TRUE, sep = ",", quote = "\"",
dec = ".", fill = TRUE, comment.char = "")
Age <- as.numeric(Data[,1])
Sex <- as.numeric(Data[,2])
BMI <- as.numeric(Data[,3])
Chil <- as.numeric(Data[,4])
Smoke <- as.numeric(Data[,5])
Region <- as.numeric(Data[,6])
Y <- as.numeric(Data[,7])
然后也是用lm函数来做多元回归,lm的输入叫公式,这个输入的含义是用Age、Sex、BMI、Children、Smoker、Region来回归Y,每个变量中间用加号连接,把估计好的模型对象赋值给mreg01.lm然后输出它的总结信息
> mreg01.lm <- lm(Y~ Age+Sex+BMI+Chil+Smoke+Region)
> summary(mreg01.lm)
Call:
lm(formula = Y ~ Age + Sex + BMI + Chil + Smoke + Region)
Residuals:
Min 1Q Median 3Q Max
-11434.4 -2813.8 -969.4 1379.1 29678.6
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -13253.55 1109.70 -11.943 < 2e-16 ***
Age 257.44 11.89 21.653 < 2e-16 ***
Sex -129.96 332.94 -0.390 0.696353
BMI 330.51 27.66 11.950 < 2e-16 ***
Chil 477.08 137.69 3.465 0.000547 ***
Smoke 23821.46 412.00 57.819 < 2e-16 ***
Region 428.58 204.62 2.095 0.036399 *
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 6062 on 1331 degrees of freedom
Multiple R-squared: 0.7505, Adjusted R-squared: 0.7494
F-statistic: 667.4 on 6 and 1331 DF, p-value: < 2.2e-16
Call后面的是lm函数执行的公式,residuals后面的是残差的描述性统计。简单看一下系数,发现年龄、BMI、家里小孩数量、是不是抽烟对家庭医疗费用支出是具有显著的正向效应的。给定其他条件不变、年龄越大,医疗费用会越高;家里小孩越多,医疗费用会越高;抽烟的人医疗费用显著地更高,这三个结论都非常符合直觉。给定其他条件不变,BMI越大,说明个体越胖,肥胖者的确是更容易患心脑血管疾病,所以BMI越大医疗费用越高也可以理解。性别对医疗费用的影响不显著。地区在0.05的显著性水平下也是显著的,因为这个是美国的数据,所以大概就是说医疗费用平均是西南<东南<东北<西北。
倒数第三行是残差的标准误和自由度,倒数第二行是R方和调整后的R方,第一个R方说明这个多元线性回归模型能够解释75.05%的医疗费用的变化,第二个R方和第一个R方非常接近,说明这个模型过拟合的风险非常低,这两个R方共同说明多元线性回归对家庭医疗费用的解释力是比较强的。倒数一行是对模型整体的F检验,原假设是所有的系数 都是0,因为p值非常小,我们课很自信地拒绝原假设,认可这个模型的解释力。
下面用ANOVA来更细致地看看F检验具体是怎么来的,与一元回归一致,把模型对象输入给anova函数就好:
> anova(mreg01.lm)
Analysis of Variance Table
Response: Y
Df Sum Sq Mean Sq F value Pr(>F)
Age 1 1.7530e+10 1.7530e+10 477.0365 < 2.2e-16 ***
Sex 1 7.9167e+08 7.9167e+08 21.5430 3.801e-06 ***
BMI 1 5.2576e+09 5.2576e+09 143.0724 < 2.2e-16 ***
Chil 1 5.5111e+08 5.5111e+08 14.9970 0.0001129 ***
Smoke 1 1.2287e+11 1.2287e+11 3343.5902 < 2.2e-16 ***
Region 1 1.6122e+08 1.6122e+08 4.3872 0.0363993 *
Residuals 1331 4.8912e+10 3.6748e+07
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
第一列是自由度的分配,一共有1338个样本,所以是1337个自由度,每个解释变量占一个,所以回归模型占6个自由度,残差占剩下1331个自由度。第二列是平方和的分解,我们可以看到抽烟与否、年龄、BMI这三个因素占了最多的平方和,说明他们具有最多与医疗费用相关的信息,这和回归系数告诉我们的信息是一致的。第四列的F是对单个系数的做的F检验的统计量,与t检验的结果有区别的只有sex,因为残差的自由度是比较大的所以相对而言残差的均方和比较少,系数F检验要显著要求分到的平方和就不用那么多,sex的F检验就很神奇的显著了。因为sex系数估计量的标准误比较大,所以t检验不能得出它的系数显著异于0。把这6个对单个系数简单的F加起来就是回归里面那个对全模型做的F检验的F统计量。
因为关于性别出现了一些不一致的地方,需要更细致地考虑一下它的系数是不是真的显著异于0的,这里用两个思路,分别用序贯ANOVA和广义线性检验法,前者检验在有了其他五个解释变量后,性别这个变量还值不值得加;后者是对性别的系数是否为0的检验。先做一下序贯ANOVA,
> mreg02.lm <- lm(Y~ Age+BMI+Chil+Smoke+Region+Sex)
> anova(mreg02.lm)
Analysis of Variance Table
Response: Y
Df Sum Sq Mean Sq F value Pr(>F)
Age 1 1.7530e+10 1.7530e+10 477.0365 < 2.2e-16 ***
BMI 1 5.4464e+09 5.4464e+09 148.2103 < 2.2e-16 ***
Chil 1 5.7152e+08 5.7152e+08 15.5523 8.443e-05 ***
Smoke 1 1.2345e+11 1.2345e+11 3359.2908 < 2.2e-16 ***
Region 1 1.6111e+08 1.6111e+08 4.3841 0.03646 *
Sex 1 5.5989e+06 5.5989e+06 0.1524 0.69635
Residuals 1331 4.8912e+10 3.6748e+07
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
这里就不得不提一下lm的输入公式的隐藏功能,Y~后面跟的解释变量的顺序其实就是解释变量进入模型的顺序,第一个是Age说明Age先进入模型,前五个的顺序我们不关心,但最后一个一定要是性别,这样估计出来的模型对象输入到anova中得到的关于性别的分析就是在有了其他五个解释变量后再把性别加入模型的。我们可以看到,当性别最后进入模型时,它的平方和就远远不如它第二个进入模型的情况了,说明如果有了其他五个解释变量,性别的效应的确是不会显著异于0的。
接下来不考虑序贯的情况,因为序贯的感觉还是有点欺负最后进入模型的解释变量。我们用广义线性检验的思路,假设性别的效应为0,那么去掉性别,用其他五个解释变量估计一个reduced model,模型对象赋值给Rreg01.lm,用这个和full model的对象,也就是mreg01.lm做ANOVA,reduced在前,full在后这样输入,可以看到这个检验的p值就和baseline里面的t检验的p值一样了,说明性别这个变量的价值可能真的是不大的。
> Rreg01.lm <- lm(Y~ Age+BMI+Chil+Smoke+Region)
> anova(Rreg01.lm,mreg01.lm)
Analysis of Variance Table
Model 1: Y ~ Age + BMI + Chil + Smoke + Region
Model 2: Y ~ Age + Sex + BMI + Chil + Smoke + Region
Res.Df RSS Df Sum of Sq F Pr(>F)
1 1332 4.8917e+10
2 1331 4.8912e+10 1 5598924 0.1524 0.6964