第 27 章 多元模型分析:矩阵标记与其意义

在线性回归目前为止介绍的内容中,我们最多只谈到了预测变量为两个的情况。本章,我们要把这些概念推广到三个或者三个以上预测变量的情况。同时,多重线性回归时采用的假设检验也会被谈及。其实最常见的就是 \(F\) 检验。而且我们也见识过了,当预测变量只有一个的时候,\(F\) 检验和 \(t\) 检验是等价的。

重要的概念我们都已经介绍完毕。前一章的多重回归模型中也强调了,我们之所以希望把多个预测变量放进模型,最大的目的就是想了解这些预测变量之间的相互关系,当他们得到调整(adjustment) 之后,彼此之间的关系是怎样的。这样的关系我们称之为条件关系 (conditional relationships)。当我们使用条件关系的称呼时,需要同时指明我们说的是哪个变量,在那个变量不变的条件下,与因变量的关系是如何如何。

本章节最后的部分将会着重关注共线性 (collinearity) 的问题。

27.1 线性回归模型的矩阵/非矩阵标记法

27.1.1 模型标记:

假如,因变量用 \(Y\) 表示,预测变量有 \(p\) 个之多 \((X_1,\cdots, X_p)\)。该模型的非矩阵标记法如下: \[ \begin{equation} y_i = \alpha + \beta_1 x_{1i}+ \beta_2 x_{2i} + \cdots + \beta_p x_{pi} + \varepsilon_i \text{ with } \varepsilon_i \sim \text{NID}(0, \sigma ^2) \end{equation} \tag{27.1} \] 其中,

  • \(y_i =\)\(i\) 名观察对象的因变量数据;
  • \(x_{pi} =\)\(i\) 名观察对象的第 \(p\) 个预测变量的观察数据。

上面的非矩阵标记法,等同于如下的矩阵标记法: \[ \begin{equation} \textbf{Y} = \textbf{X}\beta+\varepsilon, \text{ where } \varepsilon \sim N(0, \textbf{I}\sigma^2) \\ \left( \begin{array}{c} y_1\\ y_2\\ \vdots\\ y_n \end{array} \right) = \left( \begin{array}{c} 1& x_{11} & \cdots & x_{p1} \\ 1& x_{12} & \cdots & x_{p2} \\ \vdots & \vdots& \vdots & \vdots \\ 1& x_{1n}& \cdots &x_{pn} \\ \end{array} \right)\left( \begin{array}{c} \alpha \\ \beta_1\\ \beta_2 \\ \vdots \\ \beta_p \end{array} \right)+\left( \begin{array}{c} \varepsilon_1\\ \varepsilon_2\\ \vdots\\ \varepsilon_n\\ \end{array} \right) \end{equation} \tag{27.2} \] 此公式 (27.2)

  • \(\textbf{X}\) 是一个 \(n\times(p+1)\) 的矩阵;
  • \(\textbf{Y}\)\(\varepsilon\) 分别是长度为 \(n\) 的列向量;
  • \(\beta\) 是长度为 \(p+1\) 的列向量,且第一个元素是 \(\alpha\),偶尔被人误写成 \(\beta_0\)

残差被认为服从多元正态分布 (multivariate normal distribution),这个多元正态分布的方差协方差矩阵等于 \(\sigma^2\) 与单位矩阵相乘获得的矩阵。这其实等价于认为残差服从独立正态且方差为 \(\sigma^2\) 的分布,

27.2 解读参数

模型中的参数的涵义为:

  • \(\alpha\) 是截距,所有的预测变量都是零的时候,因变量 \(Y\) 的期待值大小;
  • \(\beta_j\) 是预测变量 \(X_j\) 升高一个单位,且其他变量保持不变的同时,因变量 \(Y\) 的期待值的变化;
  • \(\beta_j\) 都是偏回归系数,每个偏回归系数,测量的都是该预测变量调整了其他预测变量之后对于因变量期待值的影响。

27.2.1 最小二乘估计

还是同之前一样,我们对残差的平方和最小化,来获取我们关心的预测变量的回归变量。

\[ \begin{aligned} SS_{RES} & = \sum_{i=1}^n \hat\varepsilon_i^2 = \sum_{i=1}^n(y_i-\hat{y})^2 \\ & = \sum_{i=1}^n (y_i-\hat\alpha-\hat\beta_1x_{1i}-\hat\beta_2x_{2i}-\cdots-\hat\beta_px_{pi})^2 \end{aligned} \tag{27.3} \]

下面用矩阵标记法计算 \(\hat\beta\)

\[ \begin{aligned} \text{Because } \mathbf{Y} & = \mathbf{X\hat\beta + \varepsilon} \\ \Rightarrow \mathbf{\varepsilon} & = \mathbf{Y - X\hat\beta}\\ \Rightarrow \mathbf{SS_{RES}} & = \varepsilon_1\times \varepsilon_1 + \varepsilon_2\times \varepsilon_2 + \cdots + \varepsilon_n\times \varepsilon_n \\ & = (\varepsilon_1, \varepsilon_2, \cdots, \varepsilon_n)\left( \begin{array}{c} \varepsilon_1\\ \varepsilon_2\\ \vdots\\ \varepsilon_n \end{array} \right) \\ & = \mathbf{\varepsilon^\prime} \mathbf{\varepsilon} \\ & = \mathbf{(Y-X\hat\beta)^\prime(Y-X\hat\beta)} \\ & = \mathbf{Y^\prime Y - X^\prime\hat\beta^\prime Y - Y^\prime X\hat\beta + X^\prime\hat\beta^\prime X \hat\beta } \\ \text{Because} &\text{ transpose of a scalar is a scalar:} \\ \mathbf{Y^\prime X\hat\beta} & = \mathbf{(Y^\prime X\hat\beta)^\prime = X^\prime\hat\beta^\prime Y} \\ \Rightarrow \mathbf{SS_{RES}} & = \mathbf{Y^\prime Y - 2X^\prime\hat\beta^\prime Y + X^\prime\hat\beta^\prime X \hat\beta }\\ \Rightarrow \mathbf{\frac{\partial SS_{RES}}{\partial \hat\beta}} & = \mathbf{-2X^\prime Y + 2 X^\prime X \hat\beta} = 0 \ \ \Rightarrow \mathbf{\hat\beta} & = \mathbf{(X^\prime X)^{-1}X^\prime Y} \end{aligned} \tag{27.4} \]

公式(27.4) 是参数矩阵\(\mathbf{\beta}\) 的无偏估计,且服从方差协方差矩阵为\(\mathbf{(X^\prime X)^{-1} \sigma^2}\) 的多元正态分布:

\[ \begin{equation} \mathbf{\hat\beta} \sim N(\mathbf{\beta, (X^\prime X)^{-1}\sigma^2}) \end{equation} \tag{27.5} \]

另外可以被证明的是,多元线性回归模型的残差方差的估计量计算公式为:

\[ \begin{aligned} \hat\sigma^2 & = \sum^n_{i=1}\frac{\hat\varepsilon^2_i}{[n-(p+1)]} \\ & = \sum^n_{i=1}\frac{\sum_{i=1}^n (y_i-\hat\alpha-\hat\beta_1x_{1i}-\hat\beta_2x_{2i}-\cdots- \hat\beta_px_{pi})^2}{[n-(p+1)]} \\ \text{Where } & p \text{ is the number of predictors} \end{aligned} \tag{27.6} \]

27.2.2 因变量的期待值 \(\mathbf{\hat Y}\)

因变量的期待值矩阵 \(\mathbf{\hat Y}\) 根据公式 (27.4) 推导:

\[ \begin{aligned} \mathbf{\hat Y} & = \mathbf{X\hat\beta} \\ & = \mathbf{X(X^\prime X)^{-1}X^\prime Y}= \mathbf{PY} \\ \text{Where } \mathbf{P} &= \mathbf{X(X^\prime X)^{-1}X^\prime} \end{aligned} \tag{27.7} \]

这里的 \(n\times n\) 的正方形矩阵 \(\mathbf{P}\) 在多元线性回归中是一个极为重要的矩阵。

  • 它常被叫做“帽子/映射 (hat/projection)”矩阵,因为它把观察值 \(\mathbf{Y}\) 和观察值的拟合值一一映射;
  • 帽子矩阵的第 \(i\) 个对角元素,是第 \(i\) 名观察值的影响值 (leverage),会用在下章节的模型诊断中;
  • 拟合值矩阵的方差协方差矩阵被定义为:

\[ \begin{equation} \text{Var}(\mathbf{\hat Y}) = \mathbf{P}\sigma^2 \end{equation} \tag{27.8} \]

27.2.3 残差

残差的观察值 \(\mathbf{\hat\varepsilon}\) 被定义为观察值和拟合值的差。根据前节 (27.8) 推导:

\[ \begin{equation} \mathbf{\hat\varepsilon} = \mathbf{Y - \hat Y} = \mathbf{Y - PY} = \mathbf{(I - P)Y} \end{equation} \tag{27.9} \]

这个观察残差的方差被定义为:

\[ \begin{equation} \text{Var}(\mathbf{\hat\varepsilon}) = \mathbf{(I - P)}\sigma^2 \end{equation} \tag{27.10} \]

  • 一般地,\(\mathbf{P}\) 不是一个对角矩阵,意思是观察残差之间无法保证是独立的;
  • \(\mathbf{P}\) 的对角元素也不全都相等,意思是观察残差的方差无法保证是恒定不变的。

27.3 方差分析一般化和 \(F\) 检验

27.3.1 多元线性回归时的决定系数和残差方差

和简单线性回归一样,因变量的校正平方和可以被分割成两部分:回归模型能够解释的平方和;模型无法解释的残差平方和。类比方差分析章节 (Section 25) 的公式 (25.1)

\[ \begin{aligned} \sum_{i=1}^n(y_i-\bar{y})^2 & = \sum_{i=1}^n(\hat{y}_i - \bar{y})^2 + \sum_ {i=1}^n(y_i - \hat{y}_i)^2 \\ SS_{yy} & = SS_{REG} + SS_{RES} \end{aligned} \tag{27.11} \]

和简单线性回归也一样,多元线性回归时的模型决定系数 (coefficient of determination) 的定义为:

\[ \begin{aligned} R^2 & = \frac{SS_{yy}-SS_{RES}}{SS_{yy}} = 1- \frac{SS_{RES}}{SS_{yy}} \\ & = 1 - \frac{\sum_{i=1}^n(y_i-\hat{y}_i)^2}{\sum_{i=1}^n(y_i - \bar{y})^2 } \end{aligned} \tag{27.12} \]

这里的 \(R^2\) 也一样可以被解释为模型能够解释的因变量变动部分的百分比 (proportion of the variability in the dependent variable explained by the model)。值得注意的是,当模型中预测变量不减少,每加入一个新的预测变量,决定系数也会增加,相反残差平方和却绝不会增加。

27.3.2 方差分析表格

下表和简单线性回归的方差分析表格很类似,也可以用来作假设检验(回归方程的显著性检验Global \(F-\text{test}\),和偏\(F\) 检验Partial \(F-\text {test}\))。

Analysis of Variance table for a liear regression model with \(p\) predictor variables
Source of
Variation
Sum of
Squares
Degrees of
Freedom
Mean Sum of
Squares
Regression (model) \(SS_{REG}\) \(p\) \(MS_{REG} = \frac{SS_{REG}}{p}\)
Residual \(SS_{RES}\) \(n-(p+1)\) \(MS_{RES} = \frac{SS_{RES}}{[n-(p+1)]}\)
Total \(SS_{yy}\) \(n-1\) \(\frac{SS_{yy}}{(n-1)}\)

27.3.3 回归方程的显著性检验

整个方程的显著性检验,检验的是所有的回归系数都等于零的零假设,其对应的替代假设则是:“回归系数不全为零”。就是至少有一个不等于零。

在零假设条件下,检验统计量的计算公式为:

\[ \begin{equation} F = \frac{MS_{REG}}{MS_{RES}} \sim F_{p, [n-(p+1)]} \end{equation} \tag{27.13} \]

在零假设条件下,\(F\) 的期望值接近\(1\),而替代假设条件下的\(F\) 总是会大于此,所以和\(F\) 分布比较特征值时只需要比较单侧的(右侧的)值,即可获得双侧\(p\) 值。

在 R 里面,回归方程的结果的最底下会出现统计量 \(F\) 的大小,但是 \(MS_{REG}, MS_{RES}\) 要用 anova() 代码获得:

growgam1 <- read_dta("../Datas/growgam1.dta")
growgam1$sex <- as.factor(growgam1$sex)

Model1 <- lm(wt ~ age + len, data=growgam1)
print(summary(Model1), digits = 5)
## 
## Call:
## lm(formula = wt ~ age + len, data = growgam1)
## 
## Residuals:
##      Min       1Q   Median       3Q      Max 
## -3.20525 -0.64402 -0.00303  0.55967  2.86277 
## 
## Coefficients:
##              Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -8.351244   1.259968 -6.6281 3.531e-10 ***
## age         -0.011260   0.016751 -0.6722    0.5023    
## len          0.237129   0.019516 12.1502 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.95456 on 187 degrees of freedom
## Multiple R-squared:  0.74337,    Adjusted R-squared:  0.74063 
## F-statistic: 270.84 on 2 and 187 DF,  p-value: < 2.22e-16
print(anova(Model1), digits = 5)
## Analysis of Variance Table
## 
## Response: wt
##            Df Sum Sq Mean Sq F value    Pr(>F)    
## age         1 359.06  359.06  394.06 < 2.2e-16 ***
## len         1 134.52  134.52  147.63 < 2.2e-16 ***
## Residuals 187 170.39    0.91                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

可以看到summary() 输出结果的最后一行是关于回归方程整体的\(F\) 检验结果F-statistic: 270.84 on 2 and 187 DF, p-value: < 2.22e-16,从anova () 结果中可以获得\(MS_{REG} = \frac{359.0632 + 134.5153}{2} = 246.7892\)\(F_{2,187} = \frac{246.7892}{0.9111833} = 270.84\)。这个检验结果证明了,两个预测变量 “体重” 和 “身长” 至少有一个的回归系数不等于零。

27.3.4 \(\text{partial }F\) 检验

如果我们建立两个模型,一个稍微复杂一些 \((B)\),比起略简单的模型 \((A)\),增加了 \(k\) 个预测变量。两个模型放在一起的方差分析表格可以归纳成:

Analysis of Variance table comparing the fit of a model \((B)\) with \(p\) predictor variables with that of one (model \(A\)) with \(p-k\) predictor variables
Source of
Variation
Sum of
Squares
Degrees of
Freedom
Mean Sum of
Squares
Explained by
model \(A\)
\(SS_{REG_A}\) \(p-k\) \(MS_{REG_A} = \frac{SS_{REG_A}}{p-k}\)
Extra Explained
by model \(B\)
\(SS_{REG_B}-SS_{REG_A}\) \(k\) \(\frac{SS_{REG_B}-SS_{REG_A}}{k}\)
Residual from
model \(B\)
\(SS_{RES_B}\) \(n-(p+1)\) \(MS_{RES_B} = \frac{SS_{RES_B}}{[n-(p+1)]}\)
Total \(SS_{yy}\) \(n-1\) \(\frac{SS_{yy}}{(n-1)}\)

那么偏 \(F\) 检验的零假设就是:\(B\) 模型中包含,\(A\) 模型中不包含的 \(k\) 个预测变量的回归系数都等于零。

\[ \begin{equation} F=\frac{(SS_{REG-B}-SS_{REG-A})/k}{MS_{RES-B}} \sim F_{k, [n-(p+1)]} \end{equation} \tag{27.14} \]

在 R 里建立两个模型:

Model1 <- lm(wt ~ len, data=growgam1)
print(summary(Model1), digits = 5)
## 
## Call:
## lm(formula = wt ~ len, data = growgam1)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -3.155217 -0.629239  0.014555  0.544783  2.928738 
## 
## Coefficients:
##               Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -7.6694406  0.7463556 -10.276 < 2.2e-16 ***
## len          0.2257467  0.0096893  23.299 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.95317 on 188 degrees of freedom
## Multiple R-squared:  0.74275,    Adjusted R-squared:  0.74139 
## F-statistic: 542.82 on 1 and 188 DF,  p-value: < 2.22e-16
print(anova(Model1), digits = 5)
## Analysis of Variance Table
## 
## Response: wt
##            Df Sum Sq Mean Sq F value    Pr(>F)    
## len         1 493.17  493.17  542.82 < 2.2e-16 ***
## Residuals 188 170.80    0.91                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model2 <- lm(wt ~ len + age + sex, data = growgam1)
print(summary(Model2), digits = 5)
## 
## Call:
## lm(formula = wt ~ len + age + sex, data = growgam1)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -3.110422 -0.648401  0.026103  0.560621  2.768583 
## 
## Coefficients:
##               Estimate Std. Error t value  Pr(>|t|)    
## (Intercept) -7.8906758  1.3003091 -6.0683 7.091e-09 ***
## len          0.2317997  0.0198470 11.6793 < 2.2e-16 ***
## age         -0.0077959  0.0168974 -0.4614    0.6451    
## sex2        -0.1964758  0.1421171 -1.3825    0.1685    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.95224 on 186 degrees of freedom
## Multiple R-squared:  0.74599,    Adjusted R-squared:  0.74189 
## F-statistic: 182.08 on 3 and 186 DF,  p-value: < 2.22e-16
print(anova(Model2), digits = 5)
## Analysis of Variance Table
## 
## Response: wt
##            Df Sum Sq Mean Sq  F value Pr(>F)    
## len         1 493.17  493.17 543.8753 <2e-16 ***
## age         1   0.41    0.41   0.4540 0.5013    
## sex         1   1.73    1.73   1.9113 0.1685    
## Residuals 186 168.66    0.91                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

根据公式 (27.14)\(F=\frac{0.4116944+1.7330862}{2\times0.9067645} = 1.18\)\(p\) 值可以在 R 里面这样计算:

1 - pf(df1 = 2,df2 = 186,q = (0.4116944+1.7330862)/(2*0.9067645))
## [1] 0.3087575

更方便的是直接用 anova() 进行偏 \(F\) 检验:

print(anova(Model1, Model2), digits = 5)
## Analysis of Variance Table
## 
## Model 1: wt ~ len
## Model 2: wt ~ len + age + sex
##   Res.Df    RSS Df Sum of Sq      F Pr(>F)
## 1    188 170.80                           
## 2    186 168.66  2    2.1448 1.1827 0.3088

27.4 添加新变量对回归模型的影响

当你决定给建立的模型 \(\mathbf{A}\) 增加新的预测变量时,输出的结果改变的有:

  1. 模型 \(\mathbf{A}\) 原先的预测变量的偏回归系数会改变;
  2. 模型 \(\mathbf{A}\) 原先的预测变量的偏回归系数的方差会改变;
  3. 模型 \(\mathbf{A}\) 原先的预测变量的偏回归系数的检验结果会改变;
  4. 模型 \(\mathbf{A}\) 原先的 拟合值 (predicted values/fitted values)会改变;
  5. 决定系数 \(R^2\) 会改变。

27.4.1 偏回归系数方差的改变

偏回归系数矩阵\(\mathbf{\hat\beta}\) 的方差\(\mathbf{(X^\prime X)^{-1}\sigma^2}\) (27.5),取决于

  1. 残差方差 (residual variance) \(\sigma^2\)
  2. 样本量大小 (sample size) \(n\)
  3. 预测变量之间的协方差 (covariance between the predictor variable in question and the others)。

在简单线性回归中,预测变量的变化性 (variability,用方差或标准差衡量) 越大,回归系数的估计就越精确。类似地,多元线性回归中,预测变量之间的协方差之所以重要,因为它决定了其他预测变量保持不变时,该预测变量的变化性。如果某两个预测变量之间高度相关 (high covariance),那么当一个预测变量保持不变时,另一个的变化性就很小。

所以当给一个模型加入新的预测变量时,可能观察的现象是原先模型中已有的预测变量的偏回归系数的方差可能升高,也可能降低

  • 如果新加入的变量能解释很大比例的残差方差,那么其他原有变量的偏回归系数会降低 (变精确);
  • 如果新加入的变量和原模型中的某个变量高度相关,那么加入新变量后,原模型中与之高度相关的预测变量的方差会升高(不精确),这个现象会在共线性( collinearity) 中继续讨论。

27.4.2 偏回归系数检验结果的改变

加入新预测变量时,原有的偏回归系数的检验结果发生的改变可以归类成两种情况:

  1. 估计的偏回归系数本身发生了改变;
  2. 偏回归系数的方差改变,导致了检验结果发生变化。

27.4.3 拟合值的改变

很明显,当模型中加入新的变量,观察对象的拟合值会发生改变,但是通常这样的影响要远远小于对偏回归系数估计 (和其方差) 的影响。

27.4.4 决定系数的改变

模型中增加新的预测变量,那么模型的决定系数不会减少,只会增加。

27.4.5 共线性

当预测变量 \(X_1\) 和另一个预测变量 \(X_2\) 之间呈高度线性关系时被定义为共线性 ( collinearity)现象。如果这两个变量的关系是完全线性(exact linear),那么多元回归其实是无法进行的,因为这两个变量中的一个随着另一个改变,无法像我们设想的那样把其中一个变量保持不变,从而估计另一个变量的回归系数。用矩阵表示多元预测变量时\(\mathbf{X}\)奇异矩阵singular matrix\(\mathbf{( X^\prime X)^{-1}}\) 是不存在的。

完全线性的最佳例子是我们在对分类变量使用哑变量的情况下。每个哑变量之间都是完全线性的关系,因而我们只能用 \(0,1\) 来编码哑变量,当某个哑变量存在时,其余的哑变量取 \(0\) 从模型中消失。否则模型将无法拟合。

如果某两个变量之间高度相关,那么他们的预测变量矩阵接近 奇异矩阵,把这两个变量同时作为预测变量放入模型中会引起共线性现象,表现出来的形式有:

  1. 偏回归系数的方差变得很大;
  2. 偏回归系数本身的绝对值变得异常大;
  3. 某些已知的重要预测变量的偏回归系数变得过小且不再有意义;
  4. 虽然会有 1-3 描述的异常现象出现,但是拟合值的变化却可能微不足道。

所以拟合多元线性回归模型时,极为重要的一点是要避免共线性。如果有些变量高度相关,必须考虑改变他们放入模型的形式:

  1. 收缩期血压,舒张期血压两个变量是高度相关的,不能一起放入模型中。如果需要同时考虑两个变量,可以用其中一个,另一个预测变量用二者之差;
  2. 身高,体重常常是高度相关的,尽量不要一起放入模型中,可以使用他们的结合形式体质指数 (BMI, \(\text{kg/m}^2\));
  3. 当使用二次方程进行模型拟合的时候,用 \((x_i - \bar{x})^2\) 取代 \(x_i^2\)

27.5 实例

27.5.1 血清维生素 C 浓度的预测变量

数据来自与某个横断面研究,其目的是找出与血清维生素 C 浓度相关的预测变量。

数据中个变量含义如下表所示。

  1. 在R 里读入数据,并对数据内容总结,对维生素C浓度和其他连续性变量作散点图,对分类变量如性别,吸烟状况,和维生素C补充剂服用与否之间的维生素C 浓度作初步的分析表格。
library(haven)
library(tidyverse)
vitC <- read_dta("../Datas/vitC.dta")


# Recoding the categorical variables  
vitC <- vitC %>% 
  mutate(sex = as.factor(sex)) %>% 
  mutate(sex = fct_recode(sex, 
                          Men = "0",
                          Women = "1")) %>% 
  mutate(cigs = as.factor(cigs)) %>% 
  mutate(cigs = fct_recode(cigs,
                           "Non-smoker" = "0",
                           "Smoker" = "1")) %>% 
  mutate(ctakers = as.factor(ctakers)) %>% 
  mutate(ctakers = fct_recode(ctakers, 
                              No = "0",
                              Yes = "1"))

summary(vitC) 
##      serial            age            height              cigs   
##  Min.   :  1.00   Min.   :65.00   Min.   :1.480   Non-smoker:80  
##  1st Qu.: 23.75   1st Qu.:67.00   1st Qu.:1.580   Smoker    :12  
##  Median : 49.00   Median :69.00   Median :1.640                  
##  Mean   : 49.25   Mean   :69.32   Mean   :1.647                  
##  3rd Qu.: 73.25   3rd Qu.:71.00   3rd Qu.:1.720                  
##  Max.   :100.00   Max.   :74.00   Max.   :1.890                  
##                                   NA's   :1                      
##      weight          sex        seruvitc      ctakers 
##  Min.   : 44.00   Men  :44   Min.   :  8.00   No :73  
##  1st Qu.: 57.80   Women:48   1st Qu.: 34.75   Yes:19  
##  Median : 67.00              Median : 58.00           
##  Mean   : 68.57              Mean   : 53.21           
##  3rd Qu.: 76.55              3rd Qu.: 71.00           
##  Max.   :103.00              Max.   :100.00           
##  NA's   :1
head(vitC)
## # A tibble: 6 × 8
##   serial   age height cigs       weight sex   seruvitc ctakers
##    <dbl> <dbl>  <dbl> <fct>       <dbl> <fct>    <dbl> <fct>  
## 1      1    71   1.72 Smoker       68.8 Men          9 No     
## 2      2    70   1.63 Non-smoker   58.2 Women       19 No     
## 3      3    69   1.65 Non-smoker   94.3 Women       69 Yes    
## 4      4    67   1.62 Non-smoker   87.6 Women       71 No     
## 5      5    68   1.53 Non-smoker   66.3 Women       87 Yes    
## 6      6    71   1.64 Non-smoker   72.2 Women       96 Yes
library(psych) #some detailed summary function from this package
describe(vitC)
##          vars  n  mean    sd median trimmed   mad   min    max range  skew
## serial      1 92 49.25 29.07  49.00   48.97 37.06  1.00 100.00 99.00  0.04
## age         2 92 69.32  2.91  69.00   69.27  2.97 65.00  74.00  9.00  0.15
## height      3 91  1.65  0.10   1.64    1.64  0.10  1.48   1.89  0.41  0.33
## cigs*       4 92  1.13  0.34   1.00    1.04  0.00  1.00   2.00  1.00  2.16
## weight      5 91 68.57 13.48  67.00   67.92 14.08 44.00 103.00 59.00  0.41
## sex*        6 92  1.52  0.50   2.00    1.53  0.00  1.00   2.00  1.00 -0.09
## seruvitc    7 92 53.21 23.83  58.00   54.16 22.24  8.00 100.00 92.00 -0.40
## ctakers*    8 92  1.21  0.41   1.00    1.14  0.00  1.00   2.00  1.00  1.43
##          kurtosis   se
## serial      -1.23 3.03
## age         -1.20 0.30
## height      -0.76 0.01
## cigs*        2.69 0.04
## weight      -0.42 1.41
## sex*        -2.01 0.05
## seruvitc    -0.94 2.48
## ctakers*     0.04 0.04
vitC$serial[which(is.na(vitC$height))]
## [1] 24
vitC$serial[which(is.na(vitC$weight))]
## [1] 24

从初步的熟悉数据结构和归纳结果可以看出,身高体重两个数据有出现缺损值 (编号 24 的患者)。

# You can also get similar detailed descriptive statistics by groups from package "psych"
describeBy(vitC$seruvitc, group = vitC$sex)
## 
##  Descriptive statistics by group 
## group: Men
##    vars  n  mean    sd median trimmed   mad min max range  skew kurtosis   se
## X1    1 44 46.09 24.88   52.5   45.61 25.95   8 100    92 -0.06    -1.12 3.75
## ------------------------------------------------------------ 
## group: Women
##    vars  n  mean    sd median trimmed   mad min max range  skew kurtosis   se
## X1    1 48 59.73 21.04   66.5   61.15 15.57  15  96    81 -0.65    -0.62 3.04
describeBy(vitC$seruvitc, group = vitC$cigs)
## 
##  Descriptive statistics by group 
## group: Non-smoker
##    vars  n  mean    sd median trimmed   mad min max range  skew kurtosis   se
## X1    1 80 55.14 23.32     58    56.3 22.24   8 100    92 -0.43    -0.85 2.61
## ------------------------------------------------------------ 
## group: Smoker
##    vars  n  mean    sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 12 40.33 24.19   49.5    40.7 25.2   9  68    59 -0.19    -1.93 6.98
describeBy(vitC$seruvitc, group = vitC$ctakers)
## 
##  Descriptive statistics by group 
## group: No
##    vars  n  mean    sd median trimmed  mad min max range  skew kurtosis   se
## X1    1 73 48.64 22.79     55   49.47 25.2   8  84    76 -0.33    -1.24 2.67
## ------------------------------------------------------------ 
## group: Yes
##    vars  n  mean    sd median trimmed   mad min max range  skew kurtosis  se
## X1    1 19 70.74 19.61     72   72.41 19.27  13 100    87 -1.07     1.52 4.5

所以,血清维生素水平在女性,非吸烟者,和服用补充剂(废话) 的人中较高。

par(mfrow=c(2,2))
plot(vitC$age, vitC$seruvitc, pch = 20, xlab = "age on study entry", ylab = "Serum ascorbate")
plot(vitC$weight, vitC$seruvitc, pch = 20, xlab = "Clothed weight", ylab = "Serum ascorbate")
plot(vitC$height, vitC$seruvitc, pch = 20, xlab = "Height", ylab = "Serum ascorbate")
Scatter plots between serum ascorbate and age/weight/height

图 27.1: Scatter plots between serum ascorbate and age/weight/height

散点图似乎没有证据提示血清维生素 C 浓度和连续型变量,年龄,身高,体重之间有什么相关性。

  1. 建立维生素 C 和其他预测变量的简单线性回归模型,你有什么结论?
summary(lm(seruvitc ~ age, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ age, data = vitC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -44.935 -18.979   5.817  16.669  46.521 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept) 113.1041    59.5112   1.901   0.0606 .
## age          -0.8641     0.8578  -1.007   0.3165  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.83 on 90 degrees of freedom
## Multiple R-squared:  0.01115,    Adjusted R-squared:  0.0001626 
## F-statistic: 1.015 on 1 and 90 DF,  p-value: 0.3165
confint(lm(seruvitc ~ age, data = vitC))
##                 2.5 %      97.5 %
## (Intercept) -5.125252 231.3335294
## age         -2.568324   0.8400563

血清维生素 C 浓度随着年龄增加递减,但是回归系数不具有统计学意义 (\(p=0.32\))。年龄每增加 1 岁,血清维生素平均下降 \(0.864 \:\mu\text{mol/L, 95% CI:} (-2.57, 0.840)\)

summary(lm(seruvitc ~ height, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ height, data = vitC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -45.106 -19.805   5.761  17.936  48.293 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)   
## (Intercept)   115.90      41.19   2.814  0.00603 **
## height        -37.76      24.96  -1.513  0.13394   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.32 on 89 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  0.02506,    Adjusted R-squared:  0.01411 
## F-statistic: 2.288 on 1 and 89 DF,  p-value: 0.1339
confint(lm(seruvitc ~ height, data = vitC))
##                 2.5 %    97.5 %
## (Intercept)  34.05040 197.75111
## height      -87.36559  11.84396

血清维生素 C 浓度随着身高增加递减,但是回归系数不具有统计学意义 (\(p=0.134\))。身高每增加 1cm,血清维生素平均下降 \(0.378 \:\mu\text{mol/L, 95% CI:} (-0.874, 0.118)\)

summary(lm(seruvitc ~ cigs, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ cigs, data = vitC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -47.138 -19.534   3.265  17.863  44.862 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   55.137      2.620  21.049   <2e-16 ***
## cigsSmoker   -14.804      7.253  -2.041   0.0442 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.43 on 90 degrees of freedom
## Multiple R-squared:  0.04424,    Adjusted R-squared:  0.03362 
## F-statistic: 4.166 on 1 and 90 DF,  p-value: 0.04417
confint(lm(seruvitc ~ cigs, data = vitC))
##                 2.5 %     97.5 %
## (Intercept)  49.93334 60.3416643
## cigsSmoker  -29.21385 -0.3944881

血清维生素C 浓度与在吸烟人群中较低,与不吸烟人群相比,吸烟人群的血清维生素C 浓度平均低\(14.8 \:\mu\text{mol/L, 95% CI: } (0.394, 29.2)\),这个浓度差具有临界统计学意义\((p=0.044)\)

summary(lm(seruvitc ~ weight, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ weight, data = vitC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -44.705 -18.388   4.413  17.210  46.281 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 53.04017   12.90016   4.112 8.73e-05 ***
## weight       0.00967    0.18463   0.052    0.958    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 23.61 on 89 degrees of freedom
##   (1 observation deleted due to missingness)
## Multiple R-squared:  3.082e-05,  Adjusted R-squared:  -0.0112 
## F-statistic: 0.002743 on 1 and 89 DF,  p-value: 0.9583
confint(lm(seruvitc ~ weight, data = vitC))
##                  2.5 %     97.5 %
## (Intercept) 27.4078254 78.6725063
## weight      -0.3571766  0.3765173

维生素浓度和体重关系几乎可以忽略 \((p=0.96)\)

summary(lm(seruvitc ~ sex, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ sex, data = vitC)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -44.73 -20.23   6.59  17.27  53.91 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   46.091      3.461  13.319  < 2e-16 ***
## sexWomen      13.638      4.791   2.847  0.00547 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22.95 on 90 degrees of freedom
## Multiple R-squared:  0.0826, Adjusted R-squared:  0.07241 
## F-statistic: 8.104 on 1 and 90 DF,  p-value: 0.005472
confint(lm(seruvitc ~ sex, data = vitC))
##                 2.5 %   97.5 %
## (Intercept) 39.215886 52.96593
## sexWomen     4.120219 23.15630

血清维生素C 浓度与在女性中较高,与男性相比,女性的血清维生素C 浓度平均高\(13.6 \:\mu\text{mol/L, 95% CI:} (4.12, 23.2)\),这个浓度差具有显著统计学意义\((p=0.005)\)

summary(lm(seruvitc ~ ctakers, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ ctakers, data = vitC)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -57.74 -15.42   5.81  18.61  35.36 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   48.644      2.598  18.726  < 2e-16 ***
## ctakersYes    22.093      5.716   3.865 0.000209 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22.19 on 90 degrees of freedom
## Multiple R-squared:  0.1424, Adjusted R-squared:  0.1328 
## F-statistic: 14.94 on 1 and 90 DF,  p-value: 0.0002094
confint(lm(seruvitc ~ ctakers, data = vitC))
##                2.5 %   97.5 %
## (Intercept) 43.48306 53.80461
## ctakersYes  10.73684 33.44917

血清维生素C 浓度与在服用补充剂的人中较高,与不服用补充剂的人相比,服用者的血清维生素C 浓度平均高\(22.1 \:\mu\text{mol/L, 95% CI: } (10.7, 33.4)\),这个浓度差具有显著统计学意义\((p=0.00021)\)

  1. 拟合一个多元线性回归模型,因变量为血清维生素 C 浓度,预测变量使用 性别,吸烟状态,和 是否服用维生素补充剂。解释输出结果的数字的含义。跟这些预测变量单独和血清维生素 C 浓度建立的简单线性回归模型作比较。说明哪些结果发生了改变,为什么。
summary(lm(seruvitc ~ sex + cigs + ctakers, data = vitC))
## 
## Call:
## lm(formula = seruvitc ~ sex + cigs + ctakers, data = vitC)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.656 -19.068   2.244  17.620  38.028 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   44.972      3.545  12.686  < 2e-16 ***
## sexWomen      10.658      4.514   2.361 0.020439 *  
## cigsSmoker   -11.567      6.659  -1.737 0.085865 .  
## ctakersYes    20.251      5.515   3.672 0.000413 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.27 on 88 degrees of freedom
## Multiple R-squared:  0.2296, Adjusted R-squared:  0.2033 
## F-statistic: 8.742 on 3 and 88 DF,  p-value: 3.884e-05
print(anova(lm(seruvitc ~ sex + cigs + ctakers, data = vitC)), digits = 5)
## Analysis of Variance Table
## 
## Response: seruvitc
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## sex        1   4270  4270.0  9.4354 0.0028320 ** 
## cigs       1   1497  1497.0  3.3080 0.0723454 .  
## ctakers    1   6102  6101.8 13.4831 0.0004125 ***
## Residuals 88  39824   452.5                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
confint(lm(seruvitc ~ sex + cigs + ctakers, data = vitC))
##                  2.5 %    97.5 %
## (Intercept)  37.927129 52.017379
## sexWomen      1.686636 19.629637
## cigsSmoker  -24.799261  1.665767
## ctakersYes    9.290800 31.210572

从这个多元线性回归的输出报告来看,血清维生素 C 浓度

  • 在吸烟者中较低 \(-11.6 \:\mu\text{mol/L, 95% CI:} (-24.8, +1.67), p = 0.086\)
  • 在女性中较高 \(+10.7 \:\mu\text{mol/L, 95% CI:} (1.69, 19.6), p = 0.020\)
  • 在服用维生素补充剂的人中较高 \(+20.3 \:\mu\text{mol/L, 95% CI:} (9.29, 31.2), p = 0.0004\)

故,本次数据告诉我们,服用维生素补充剂是最强的预测变量。在多元线性回归模型的结果中可以看到:

  • 性别之间维生素 C 浓度差变小了 (\(+13.6 \rightarrow +10.7\))
    这是因为女性中有较多人服用维生素补充剂。即便如此,性别差在多元线性回归模型中仍然是有意义的。
a <- Epi::stat.table(list("Vitamin C taker"=ctakers, "Gender" = sex), list(count(),percent(ctakers)), data = vitC, margins = TRUE)
print(a, digits = c(percent = 2))
##  ---------------------------------- 
##           ---------Gender---------- 
##  Vitamin       Men   Women   Total  
##  C taker                            
##  ---------------------------------- 
##  No             37      36      73  
##              84.09   75.00   79.35  
##                                     
##  Yes             7      12      19  
##              15.91   25.00   20.65  
##                                     
##                                     
##  Total          44      48      92  
##             100.00  100.00  100.00  
##  ----------------------------------
  • 吸烟与非吸烟者之间的维生素C 浓度差也变小了(\(-14.8 \rightarrow -11.6\)),因为尽管吸烟与非吸烟者的维生素补充剂服用比例差不不大,但是吸烟者中大部分是男性。 (详见下表)
    吸烟者和非吸烟者之间维生素 C 浓度差经过多元线性回归调整后变得不再有统计学意义 \((p=0.086)\)
a <- Epi::stat.table(list("Vitamin C taker"=ctakers, "Smoker" = cigs), list(count(),percent(ctakers)), data = vitC, margins = TRUE)
print(a, digits = c(percent = 2))
##  ------------------------------------- 
##           -----------Smoker----------- 
##  Vitamin   Non-smoker  Smoker   Total  
##  C taker                               
##  ------------------------------------- 
##  No                63      10      73  
##                 78.75   83.33   79.35  
##                                        
##  Yes               17       2      19  
##                 21.25   16.67   20.65  
##                                        
##                                        
##  Total             80      12      92  
##                100.00  100.00  100.00  
##  -------------------------------------
a <- Epi::stat.table(list("Gender" = sex, "Smoker" = cigs), list(count(),percent(sex)), data = vitC, margins = TRUE)
print(a, digits = c(percent = 2))
##  ------------------------------------ 
##          -----------Smoker----------- 
##  Gender   Non-smoker  Smoker   Total  
##  ------------------------------------ 
##  Men              36       8      44  
##                45.00   66.67   47.83  
##                                       
##  Women            44       4      48  
##                55.00   33.33   52.17  
##                                       
##                                       
##  Total            80      12      92  
##               100.00  100.00  100.00  
##  ------------------------------------
  1. 在前一个模型中加入年龄,身高,体重作为新的预测变量。先解释新的模型中报告的个数值的意义,利用方差分析表格比较两个模型的差别 (先手计算,再用 R 计算确认你的答案)。

由于身高体重有缺损值(serial=24),所以要比较预测变量增加前后的模型,需要先把之前的模型中 serial=24 的观察对象删除掉才公平。

Model1 <- lm(seruvitc ~ sex + cigs + ctakers, data = vitC[-24,])
summary(Model1);anova(Model1)
## 
## Call:
## lm(formula = seruvitc ~ sex + cigs + ctakers, data = vitC[-24, 
##     ])
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.792 -18.208   2.208  17.590  36.972 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)   46.028      3.552  12.960  < 2e-16 ***
## sexWomen       9.764      4.487   2.176 0.032277 *  
## cigsSmoker   -12.255      6.589  -1.860 0.066266 .  
## ctakersYes    19.832      5.453   3.637 0.000467 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.01 on 87 degrees of freedom
## Multiple R-squared:  0.2259, Adjusted R-squared:  0.1992 
## F-statistic: 8.461 on 3 and 87 DF,  p-value: 5.394e-05
## Analysis of Variance Table
## 
## Response: seruvitc
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## sex        1   3689  3688.5  8.3528 0.0048609 ** 
## cigs       1   1679  1679.1  3.8024 0.0543987 .  
## ctakers    1   5841  5841.0 13.2272 0.0004669 ***
## Residuals 87  38418   441.6                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model2 <- lm(seruvitc ~ sex + cigs + ctakers + age + weight + height, data = vitC[-24,])
summary(Model2);anova(Model2)
## 
## Call:
## lm(formula = seruvitc ~ sex + cigs + ctakers + age + weight + 
##     height, data = vitC[-24, ])
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -40.561 -17.718   4.229  18.747  35.584 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  65.3516    89.4816   0.730 0.467217    
## sexWomen     10.3666     7.2848   1.423 0.158428    
## cigsSmoker  -11.7996     6.7574  -1.746 0.084439 .  
## ctakersYes   19.8593     5.5473   3.580 0.000574 ***
## age          -0.3533     0.8397  -0.421 0.674988    
## weight        0.1073     0.2231   0.481 0.631741    
## height       -1.5730    42.2590  -0.037 0.970396    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 21.29 on 84 degrees of freedom
## Multiple R-squared:  0.2327, Adjusted R-squared:  0.1779 
## F-statistic: 4.245 on 6 and 84 DF,  p-value: 0.0008801
## Analysis of Variance Table
## 
## Response: seruvitc
##           Df Sum Sq Mean Sq F value    Pr(>F)    
## sex        1   3689  3688.5  8.1366 0.0054597 ** 
## cigs       1   1679  1679.1  3.7040 0.0576682 .  
## ctakers    1   5841  5841.0 12.8848 0.0005562 ***
## age        1    205   205.3  0.4529 0.5028317    
## weight     1    133   133.0  0.2934 0.5895062    
## height     1      1     0.6  0.0014 0.9703964    
## Residuals 84  38079   453.3                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

利用偏 \(F\) 检验的公式

\[ F=\frac{(205.2889295+132.9899543+0.6280691)/3}{38079.42/84} = 0.2492713 \]

anova(Model1, Model2)
## Analysis of Variance Table
## 
## Model 1: seruvitc ~ sex + cigs + ctakers
## Model 2: seruvitc ~ sex + cigs + ctakers + age + weight + height
##   Res.Df   RSS Df Sum of Sq      F Pr(>F)
## 1     87 38418                           
## 2     84 38079  3    338.91 0.2492 0.8617

所以检验统计量对应的\(p=0.86\) 告诉我们没有证明据证明调整了性别,吸烟状况,服用补充剂与否之后,增加的年龄,体重,身高作为预测变量和观察对象的血清维生素C 浓度有关系。模型 2 比模型 1 不能解释更多的模型残差 (不比模型 1 更加拟合数据)。

27.5.2 红细胞容积与血红蛋白

Data set of haemoglobin and PCV explained
Variable name content
hb Haemoglobin (gm/dl)
pcv Pack cell volume %
age Age (years)
  1. 把数据导入 R,并且建立因变量为血红蛋白,预测变量为 PCV 和 年龄的多元线性回归模型
library(haven)
haem <- read_dta("../Datas/haem.dta")
psych::describe(haem)
##     vars  n  mean   sd median trimmed   mad  min  max range  skew kurtosis   se
## hb     1 12 12.53 1.70   12.8   12.56  1.70  9.6 15.1   5.5 -0.26    -1.39 0.49
## pcv    2 12 38.58 8.14   37.5   38.80 11.12 25.0 50.0  25.0 -0.10    -1.59 2.35
## age    3 12 32.75 8.98   31.5   32.40  9.64 20.0 49.0  29.0  0.31    -1.20 2.59
Model3 <- lm(hb ~ pcv + age, data = haem)
summary(Model3)
## 
## Call:
## lm(formula = hb ~ pcv + age, data = haem)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -1.4134 -1.0023  0.3025  0.6622  1.8674 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)  
## (Intercept)  5.06057    1.96798   2.571   0.0301 *
## pcv          0.10557    0.04285   2.463   0.0360 *
## age          0.10355    0.03887   2.664   0.0259 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 1.146 on 9 degrees of freedom
## Multiple R-squared:  0.6298, Adjusted R-squared:  0.5475 
## F-statistic: 7.655 on 2 and 9 DF,  p-value: 0.01143
haem$e_hat <- Model3$residuals
haem$y_hat <- Model3$fitted.values
print(haem)
## # A tibble: 12 × 5
##       hb   pcv   age  e_hat y_hat
##    <dbl> <dbl> <dbl>  <dbl> <dbl>
##  1  11.1    35    20  0.274  10.8
##  2  10.7    45    22 -1.39   12.1
##  3  12.4    47    25 -0.211  12.6
##  4  14      50    28  0.762  13.2
##  5  13.1    31    28  1.87   11.2
##  6  10.5    30    31 -0.938  11.4
##  7   9.6    25    32 -1.41   11.0
##  8  12.5    33    35  0.331  12.2
##  9  13.5    35    38  0.810  12.7
## 10  13.9    40    40  0.475  13.4
## 11  15.1    45    45  0.629  14.5
## 12  13.9    47    49 -1.20   15.1
  1. 利用 R 的矩阵计算重现回归模型的计算结果
  • 计算因变量和两个预测变量各自的和
sumy <- sum(haem$hb)
sumx1 <- sum(haem$pcv)
sumx2 <- sum(haem$age)
  • 计算因变量和两个预测变量各自的平方和
sumy2 <- sum((haem$hb)^2)
sumx1y <- sum(haem$hb*haem$pcv)
sumx2y <- sum(haem$hb*haem$age)
sumx12 <- sum((haem$pcv)^2)
sumx22 <- sum((haem$age)^2)
sumx1x2 <- sum(haem$pcv*haem$age)
  • 生成一个数值为 1 的变量,名为 one
one <- rep(1,12)
  • matrix() 命令生成矩阵
Rownames <- NULL
for(i in 1:12) {
  a <- paste("row", i, sep = "")
  Rownames <- c(Rownames,a); rm(a)
  }

Y <- matrix(haem$hb ,dimnames = list(Rownames, "hb"))
Y
##         hb
## row1  11.1
## row2  10.7
## row3  12.4
## row4  14.0
## row5  13.1
## row6  10.5
## row7   9.6
## row8  12.5
## row9  13.5
## row10 13.9
## row11 15.1
## row12 13.9
X <- matrix(c(one, haem$pcv, haem$age), nrow = 12, dimnames = list(Rownames, c("one", "pcv", "age")))
X
##       one pcv age
## row1    1  35  20
## row2    1  45  22
## row3    1  47  25
## row4    1  50  28
## row5    1  31  28
## row6    1  30  31
## row7    1  25  32
## row8    1  33  35
## row9    1  35  38
## row10   1  40  40
## row11   1  45  45
## row12   1  47  49
  • 用公式 (27.4) 计算估计 \(\mathbf{\hat\beta}\) 矩阵
XX <- t(X) %*% X # these are the sum of squares of each variable and the sum of the cross products of the pairs of variables
XX
##     one   pcv   age
## one  12   463   393
## pcv 463 18593 15276
## age 393 15276 13757
(data.frame(sumx1,sumx12,sumx2,sumx22, sumx1x2))
##   sumx1 sumx12 sumx2 sumx22 sumx1x2
## 1   463  18593   393  13757   15276
XY <- t(X) %*% Y # this is the cross-product matrix of predictors against outcome
XY
##         hb
## one  150.3
## pcv 5887.7
## age 5026.0
(data.frame(sumy, sumx1y, sumx2y))
##    sumy sumx1y sumx2y
## 1 150.3 5887.7   5026
betahat <- solve( t(X) %*% X ) %*% t(X) %*% Y
betahat
##            hb
## one 5.0605666
## pcv 0.1055671
## age 0.1035513
###or equivalently you can use
betahat <- solve( crossprod(X) ) %*% crossprod( X, Y )
betahat
##            hb
## one 5.0605666
## pcv 0.1055671
## age 0.1035513

可以看到 betahat 的结果和多元回归模型输出的回归系数估计是一致的。

  • 计算拟合值
Fitted <- X%*%betahat
Fitted
##             hb
## row1  10.82644
## row2  12.08921
## row3  12.61100
## row4  13.23836
## row5  11.23258
## row6  11.43767
## row7  11.01338
## row8  12.16857
## row9  12.69036
## row10 13.42530
## row11 14.47089
## row12 15.09623
  • 估计回归系数的方差协方差矩阵
e_hat <- Y-Fitted # residuals
e_hat
##               hb
## row1   0.2735607
## row2  -1.3892125
## row3  -0.2110005
## row4   0.7616445
## row5   1.8674188
## row6  -0.9376680
## row7  -1.4133839
## row8   0.3314258
## row9   0.8096378
## row10  0.4746999
## row11  0.6291083
## row12 -1.1962310
SSres <- t(e_hat) %*% e_hat # residual sum of squares
SSres
##          hb
## hb 11.81094
Sigma2 <- SSres %*% (1/(12-(2+1))) # residual variance
Sigma2
##        [,1]
## hb 1.312327
# multiply the inverse of the cross-product matrix for the predictors
# by the residual variance to get the variance-covariance matrix of
# the coefficients
V <- solve( crossprod(X) ) * as.numeric(Sigma2)
V
##             one           pcv           age
## one  3.87296385 -0.0632072065 -0.0404536966
## pcv -0.06320721  0.0018365202 -0.0002336447
## age -0.04045370 -0.0002336447  0.0015104882
# the square root of the diagonal terms in the above matrix are the standard errors shown in the regression output
sqrt(diag(V))
##        one        pcv        age 
## 1.96798472 0.04285464 0.03886500