• 45.2.1 evalCpp() 转换单一计算表达式
  • 45.2.2 cppFunction() 转换简单的C++函数—Fibnacci例子
  • 45.2.3 sourceCpp() 转换C++程序—正负交替迭代例子
  • 45.2.4 sourceCpp() 转换C++源文件中的程序—正负交替迭代例子
  • 45.2.5 sourceCpp() 转换C++源程序文件—卷积例子
  • 45.2.6 随机数例子
  • 45.2.7 bootstrap例子
  • 45.2.8 在Rmd文件中使用C++源程序文件
  • 46 R与C++的类型转换
  • 46.1 wrap() 把C++变量返回到R中
  • 46.2 as() 函数把R变量转换为C++类型
  • 46.3 as() wrap() 的隐含调用
  • 47 Rcpp 属性
  • 47.1 Rcpp属性介绍
  • 47.2 在C++源程序中指定要导出的C++函数
  • 47.2.1 特殊注释 //[[Rcpp::export]]
  • 47.2.2 修改导出的函数名
  • 47.2.3 可导出的函数
  • 47.3 在R中编译链接C++代码
  • 47.3.1 sourceCpp() 函数中直接包含C++源程序字符串
  • 47.3.2 cppFunction() 函数中直接包含C++函数源程序字符串
  • 47.3.3 evalCpp() 函数中直接包含C++源程序表达式字符串
  • 47.3.4 depends 指定要链接的库
  • 47.4 Rcpp属性的其它功能
  • 47.4.1 自变量有缺省值的函数
  • 47.4.2 异常传递
  • 47.4.3 允许用户中断
  • 47.4.4 把R代码写在C++源文件中
  • 47.4.5 invisible 要求函数结果不自动显示
  • 47.4.6 在C++中调用R的随机数发生器
  • 48 Rcpp提供的C++数据类型
  • 48.1 RObject类
  • 48.2 IntegerVector类
  • 48.2.1 IntegerVector示例1:返回完全数
  • 48.2.2 IntegerVector示例2:输入整数向量
  • 48.3 NumericVector类
  • 48.3.1 示例1:计算元素 \(p\) 次方的和
  • 48.3.2 示例2: clone 函数
  • 48.3.3 示例3:向量子集
  • 48.4 NumericMatrix类
  • 48.4.1 示例1:计算矩阵各列模的最大值
  • 48.4.2 示例2:把输入矩阵制作副本计算元素平方根
  • 48.4.3 示例3:访问列子集
  • 48.5 Rcpp的其它向量类
  • 48.5.1 Rcpp的LogicalVector类
  • 48.5.2 Rcpp的CharacterVector类型
  • 48.6 Rcpp提供的其它数据类型
  • 48.6.1 Named类型
  • 48.6.2 List类型
  • 48.6.3 Rcpp的DataFrame类
  • 48.6.4 Rcpp的Function类
  • 48.6.5 Rcpp的Environment类
  • 49 Rcpp糖
  • 49.1 简单示例
  • 49.2 向量化的运算符
  • 49.2.1 向量化的四则运算
  • 49.2.2 向量化的赋值运算
  • 49.2.3 向量化的二元逻辑运算
  • 49.2.4 向量化的一元运算符
  • 49.3 用Rcpp访问数学函数
  • 49.4 用Rcpp访问统计分布类函数
  • 49.5 在Rcpp中产生随机数
  • 49.6 返回单一逻辑值的函数
  • 49.7 返回糖表达式的函数
  • 49.7.1 is_na
  • 49.7.2 seq_along
  • 49.7.3 seq_len
  • 49.7.4 pmin pmax
  • 49.7.5 ifelse
  • 49.7.6 sapply lapply
  • 49.7.7 sign
  • 49.7.8 diff
  • 49.8 R与Rcpp不同语法示例
  • 49.9 用RcppArmadillo执行矩阵运算
  • 49.9.1 生成多元正态分布随机数
  • 49.9.2 快速计算线性回归
  • 50 用Rcpp帮助制作R扩展包
  • 50.1 不用扩展包共享C++代码的方法
  • 50.2 生成扩展包
  • 50.2.1 利用已有基于Rcpp属性的源程序制作扩展包
  • 50.2.2 DESCRIPTION文件
  • 50.2.3 NAMESPACE文件
  • 50.3 重新编译
  • 50.4 建立C++用的接口界面
  • 51 R编程例子
  • 51.1 R语言
  • 51.1.1 用向量作逆变换
  • 51.1.2 斐波那契数列计算
  • 51.1.3 穷举所有排列
  • 51.1.4 可重复分组方式穷举
  • 51.1.5 升降连计数
  • 51.1.6 高斯八皇后问题
  • 51.1.7 最小能量路径
  • 51.2 概率
  • 51.2.1 智者千虑必有一失
  • 51.2.2 圆桌夫妇座位问题
  • 51.3 科学计算
  • 51.3.1 城市间最短路径
  • 51.3.2 Daubechies小波函数计算
  • 51.3.3 房间加热温度变化
  • 51.4 统计计算
  • 51.4.1 线性回归实例
  • 51.4.2 核回归与核密度估计
  • 51.4.3 二维随机模拟积分
  • 51.4.4 潜周期估计
  • 51.4.5 ARMA(1,1)模型估计
  • 51.4.6 VAR模型平稳性
  • 51.4.7 贮存可靠性评估
  • 51.5 数据处理
  • 51.5.1 小题分题型分数汇总
  • 51.5.2 类别编号重排
  • 51.6 文本处理
  • 51.6.1 用R语言下载处理《红楼梦》htm文件
  • 52 使用经验
  • 52.1 文件管理
  • 52.1.1 文件备份
  • 52.1.2 工作空间
  • 52.2 程序格式
  • A R Markdown文件格式
  • A.1 R Markdown文件
  • A.2 R Markdown文件的编译
  • A.2.1 编译的实际过程
  • A.3 在R Markdown文件中插入R代码
  • A.4 输出表格
  • A.5 利用R程序插图
  • A.6 冗余输出控制
  • A.7 代码段选项
  • A.7.1 代码和文本输出结果格式
  • A.7.2 图形选项
  • A.7.3 缓存(cache)选项
  • A.8 章节目录链接问题
  • A.9 其它编程语言引擎
  • A.10 交互内容
  • A.11 属性设置
  • A.11.1 YAML元数据
  • A.11.2 输出格式
  • A.11.3 输出格式设置
  • A.11.4 目录设置
  • A.11.5 章节自动编号
  • A.11.6 Word输出章节自动编号及模板功能
  • A.11.7 HTML特有输出格式设置
  • A.11.8 关于数学公式支持的设置
  • A.11.9 输出设置文件
  • A.12 LaTeX和PDF输出
  • A.12.1 TinyTex的安装使用
  • A.12.2 Rmd中Latex设置
  • A.13 生成期刊文章
  • A.14 附录:经验与问题
  • A.14.1 Word模板制作
  • A.14.2 数学公式设置补充
  • B 用bookdown制作图书
  • B.1 介绍
  • B.2 一本书的设置
  • B.3 章节结构
  • B.4 书的编译
  • B.5 交叉引用
  • B.6 数学公式和公式编号
  • B.7 定理类编号
  • B.8 文献引用
  • B.9 插图
  • B.10 表格
  • B.10.1 Markdown表格
  • B.10.2 kable() 函数制作表格
  • B.10.3 R中其它制作表格的包
  • B.11 数学公式的设置
  • B.12 使用经验
  • B.12.1 学位论文
  • B.12.2 LaTeX
  • B.12.3 算法
  • B.12.4 中文乱码
  • B.12.5 图片格式
  • B.12.6 其它经验
  • B.13 bookdown的一些使用问题
  • C 用R Markdown制作简易网站
  • C.1 介绍
  • C.2 简易网站制作
  • C.2.1 网站结构
  • C.2.2 编译
  • C.2.3 内容文件
  • C.2.4 网站设置
  • C.3 用blogdown制作网站
  • C.3.1 生成新网站的框架
  • C.3.2 网页内容文件及其设置
  • C.3.3 初学者的工作流程
  • C.3.4 网站设置文件
  • C.3.5 静态文件
  • D 制作幻灯片
  • D.1 介绍
  • D.2 Slidy幻灯片
  • D.2.1 文件格式
  • D.2.2 幻灯片编译
  • D.2.3 播放控制
  • D.2.4 生成单页HTML
  • D.2.5 数学公式处理与输出设置文件
  • D.2.6 其它选项
  • D.2.7 slidy幻灯片激光笔失效问题的修改
  • D.3 MS PowerPoint幻灯片
  • D.4 Bearmer幻灯片格式
  • D.5 R Presentation格式
  • References
  • 编著:李东风
  • \[\begin{aligned} Y \sim & F(y;\mu) \\ g(\mu) =& \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p . \end{aligned}\] 其中 \(F(\cdot,\mu)\) 是参数为 \(\mu\) 的某种分布, 通常取 \(\mu = EY\) \(g(\cdot)\) 为某个线性或非线性函数, 称为联系函数(link function)。 模型也可以写成 Y | (x_1, \dots, x_p) \sim F(y;\, g^{-1}(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p)) .

    一个广义线性模型有如下三个部分:

  • 随机部分,给出因变量 \(Y\) 及其条件概率分布 \(Y \sim F(\cdot; \mu)\)
  • 系统部分,给出模型自变量的线性函数 \(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p\)
  • 联系函数 \(g(\cdot)\) , 将因变量分布参数(一般是均值) \(\mu\) 与自变量线性组合 \(\beta_0 + \beta_1 x_1 + \dots + \beta_p x_p\) 联系在一起。
  • 在广义线性模型中, 因变量的分布不一定是正态分布, 因变量的期望值 \(EY\) 不一定是自变量的线性函数, 因变量的方差不一定是恒定值。

    典型的因变量分布有二项分布、泊松分布等。

    本章内容参考了Paul Roback和Julie Legler的教材《超越多元线性回归–用R语言进行广义线性模型和多水平模型应用》 ( Roback and Legler 2021 )

  • https://bookdown.org/roback/bookdown-BeyondMLR/
  • 36.1.2 指数族分布

    设随机变量 \(Y\) 的概率密度函数或概率质量函数 \(f(y)\) 可以表达为 f(y; \theta) = \exp\left\{ a(y) b(\theta) + c(\theta) + d(y) \right\}, 且 \(f(\cdot;\theta)\) 的支撑集不依赖于 \(\theta\) , 则称 \(Y\) 服从 单参数指数族分布

    单参数指数族分布与广义线性模型有密切联系, 其中 \(b(\cdot)\) 称为经典联系函数, 作为广义线性模型中 \(g(\cdot)\) 的一种重要选择。

    对单参数指数族分布随机变量 \(Y\) , = -\frac{c'(\theta)}{b'(\theta)}, \quad \text{Var}(Y) = \frac{b''(\theta) c'(\theta) - c''(\theta) b'(\theta)}{[b'(\theta)]^3} .

    单参数指数族分布包含了许多常见分布, 如方差已知的正态分布、泊松分布、二项分布等。

    考虑一元线性回归模型 Y = a + b x + \varepsilon, \ \varepsilon \sim \text{N}(0, \sigma^2), 正态N( \(\mu, \sigma^2)\) (其中 \(\sigma^2\) 已知)的密度函数写成单参数指数族为 \[\begin{aligned} f(y; \mu) =& \frac{1}{\sqrt{2\pi \sigma^2}} \exp\left\{ -\frac{1}{2 \sigma^2} (y - \mu)^2 \right\} \\ =& \exp\left\{ \left[\frac{y}{\sigma^2} \mu \right] + \left[-\frac{\mu^2}{2\sigma^2} \right] + \left[-\frac{1}{2} \ln 2\pi - \frac{1}{2} \ln \sigma^2 - \frac{1}{2\sigma^2} y^2 \right] \right\} \\ =& \exp\{ a(y) b(\theta) + c(\theta) + d(y) \}. \end{aligned}\] 这里参数为 \(\theta = \mu\) 。 一元线性回归模型可以写成 \[\begin{aligned} Y \sim & \text{N}(\theta, \sigma^2), \\ g(\theta) =& \theta = a + b x, \end{aligned}\] 其中 \(g(\theta)=\theta\) 是恒等函数, 这是经典联系函数 \(b(\theta)=\theta\)

    泊松分布的概率质量函数为 f(y; \lambda) = \frac{\lambda^y}{y!} e^{-\lambda} = \exp\{y \ln \lambda - \lambda - \ln(y!) \}, \ y=0,1,\dots, 是单参数指数族分布。 参数为 \(\lambda = EY\) 。 经典联系函数为 \(g(\theta) = \ln\theta\) , 一元泊松回归模型可以写成 \[\begin{aligned} Y \sim & \text{Poisson}(\theta), \\ g(\theta) =& \ln(\theta) = a + b x . \end{aligned}\]

    二项分布B( \(n,p\) )当 \(n\) 已知, 以 \(p\) 为参数时,是单参数指数族分布, 其概率质量函数为 \[\begin{aligned} f(y; p) =& \binom{n}{y} p^y (1-p)^{n-y}, \ y=0,1,\dots,n \\ =& \binom{n}{y} (1-p)^n \left( \frac{p}{1-p} \right)^y \\ =& \exp\left\{ y \ln \frac{p}{1-p} + n \ln(1-p) + \ln \binom{n}{y} \right\} \\ =& \exp\{ a(y) b(\theta) + c(\theta) + d(y) \}, \end{aligned}\] 这里 \(\theta = p = \frac{1}{n} EY\) , 其中 \(n\) 已知。 \(b(p) = \ln \frac{p}{1-p}\) , 称 \(\ln \frac{p}{1-p}\) \(\text{logit}(p)\) , 是二项分布的经典联系函数。 \[\begin{aligned} \text{logit}(p) =& \ln \frac{p}{1-p}, \ p \in (0, 1), \\ \quad \text{logit}^{-1}(u) =& \frac{e^u}{1 + e^u} = \frac{1}{1 + e^{-u}} \in (0, 1), \ u \in (-\infty, \infty) . \end{aligned}\] 一元逻辑斯谛回归模型可以写成 \[\begin{aligned} Y \sim & \text{B}(n, \theta), \\ g(\theta) =& \text{logit}(\theta) = a + b x . \end{aligned}\]

    对于以上的三个分布, 使用经典联系函数将因变量分布参数与自变量线性组合联系起来可以给出一些粗浅的解释。

  • 对于正态分布因变量, 因为正态分布可以在 \((-\infty, \infty)\) 取值, 其期望值也可以在 \((-\infty, \infty)\) 取值, 所以其期望值 \(\mu\) 可以不进行变换地用自变量线性组合 \(a + b x\) 表示。
  • 对于泊松分布因变量, 泊松分布仅取非负整数值, 其期望 \(\lambda\) 仅取正值, 所以不能直接用自变量线性组合 \(a + bx\) 表示, 因为 \(a + bx\) 可能取到负值; 而期望 \(\lambda\) \(\exp\{a + b x\}\) 表示则不会出现 \(\lambda\) 取负值的问题。
  • 对于二项分布因变量, 其分布参数 \(p\) 仅在 \((0,1)\) 区间内取值, 所以不能直接用自变量线性组合 \(a + bx\) 表示, 因为 \(a + bx\) 可能取到负值或者大于1的值, 而 \(\text{logit}^{-1}(a + b x)\) 则可以将 \((-\infty, \infty)\) 映射到 \((0,1)\) 内, 保证了 \(p\) 的取值在允许范围内。
  • 设随机变量 \(Y\) 的分布受到自变量 \(x_1, \dots, x_p\) 的影响, 在给定 \(x_1, \dots, x_p\) 的条件下 \(Y\) 服从泊松分布, 则可以用泊松回归描述 \(Y\) \(x_1, \dots, x_p\) 的关系: \[\begin{aligned} Y \sim& \text{Poisson}(\lambda), \\ g(\lambda) =& \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p . \end{aligned}\] 其中 \(g(\lambda)\) 经常取为经典联系函数 \(\ln\lambda\)

    即使给定 \(x_1, \dots, x_p\) \(Y\) 服从泊松分布, 参数 \(\lambda\) \(x_1, \dots, x_p\) 的关系也不一定恰好被 \(g(\lambda) = \beta_0 + \beta_1 x_1 + \dots + \beta_p x_p\) 确定, 泊松回归模型是 \(Y | (x_1, \dots, x_p)\) 分布的一种简化模型。

    泊松回归的假定:

  • \(Y | (x_1, \dots, x_p)\) 服从泊松分布;
  • 不同的观测相互独立;
  • \(Y | (x_1, \dots, x_p)\) 的分布均值与分布方差相等, 这一点与线性回归不同;
  • \(g(\lambda)\) \(x_1, \dots, x_p\) 服从线性关系, 这是对模型的简化假设。
  • 36.2.2 最大似然估计

    考虑单个自变量的泊松回归, 设 \(Y_i \sim \text{Poisson}(\lambda_i)\) , \(\ln \lambda_i = \beta_0 + \beta_1 x_i\) , 于是单个观测 \((x_i, y_i)\) 对于似然函数的贡献为 \frac{\lambda_i^{y_i}}{y_i!} e^{-\lambda_i}, 对于对数似然函数的贡献为 y_i \ln\lambda_i - \ln y_i! - \lambda_i = y_i (\beta_0 + \beta_1 x_i) - \ln y_i! - e^{\beta_0 + \beta_1 x_i}, 其中 \(-\ln y_i!\) 在对数似然函数中是常数项, 所以对数似然函数为 \ell (\beta_0, \beta_1) = \text{常数} + \sum_{i=1}^n \left\{ y_i (\beta_0 + \beta_1 x_i) - e^{\beta_0 + \beta_1 x_i} \right\} .

    可以用Newton-Raphson迭代方法进行最大似然估计的数值求解, 并且可以使用Fisher得分方法改造Newton-Raphson方法, 具体方法是在迭代中用负信息阵的当前估计值代替对数似然函数的海色阵。 这样还可以从最大值点处的信息阵的逆矩阵给出参数估计的协方差阵估计。 这种利用Fisher得分的Newton-Raphson迭代方法, 等价于迭代再加权最小二乘方法, 每步迭代是一个加权最小二乘计算, 加权按照当前的方差倒数来计算。

    36.2.3 偏差与偏差分析

    线性回归模型使用残差平方和以及方差分析评估模型的拟合优劣。 因为广义线性模型是对因变量分布参数的拟合而非直接对因变量值的拟合, 所以没有原来的残差以及残差平方和的概念, 而是用偏差(deviance)代替。

    设要评估的模型的对数似然函数在最大似然估计处的值为 \(\ell_M\) , 为了比较, 考虑一个参数最复杂的“饱和模型”, 使得因变量得到最大程度的解释。 在方差分析中对因素的每种组合都单独使用一个参数。 在饱和模型中, 应该每一组不同的自变量组合都单独设置一个因变量独立参数值, 但是在R统计软件 glm() 计算时实际是对每个观测单独使用参数。 计算饱和模型的对数似然函数的最大值 \(\ell_S\) 。 饱和模型的自由参数(独立参数)个数是最多的。

    要评估的模型的偏差(deviance)定义为 \text{Dev} = -2[\ell_M - \ell_S], 偏差一定是非负的, 对于某些广义线性模型, 如果模型M很好地解释了数据, 则模型M与饱和模型S应该效果相近, 在一定条件下偏差近似服从卡方分布, 自由度等于两个模型独立参数的个数差, 当偏差不超过卡方的 \(1-\alpha\) 分位数时可以认为模型M是充分的。

    类似于线性模型中的平方和分解, 偏差也可以进行分解。 有两个模型 \(M_0\) \(M_1\) \(M_0\) \(M_1\) 的特例, 即 \(M_0\) \(M_1\) 的参数取特定值或满足特定约束后的模型, 称 \(M_1\) 为完全模型, 称 \(M_0\) 为简化模型, 称这两个模型有嵌套关系。 为了在 \(M_1\) 的假设下检验 \(M_0\) 是否成立, 计算似然比统计量 -2[\ell_0 - \ell_1] = -2[\ell_0 - \ell_S] + 2[\ell_1 - \ell_S] = \text{Dev}_0 - \text{Dev}_1, 当 \(M_0\) \(M_1\) 效果相同的零假设成立时统计量服从卡方分布, 自由度等于两个模型的独立参数个数差, 这个统计量可以用两个模型的偏差之差计算。

    36.2.4 残差分析

    对于泊松回归, 也可以定义残差, 但是不像线性回归那样只有观测值减去预测值这一种, 因为广义线性模型中自变量预测的是因变量的期望值而非因变量本身。

    以一元泊松回归为例。 响应残差(response residual)定义为 \(e_i = y_i - \hat\mu_i\) , 而 \(\hat\mu_i\) 估计为 \(g^{-1}(\hat\beta_0 + \hat\beta_1 x_i)\) , 其中 \(g(\cdot)\) 是联系函数, 对泊松回归一般取为 \(\ln\) , 所以 \(\hat\mu_i = \exp(\hat\beta_0 + \hat\beta_1 x_i)\)

    定义标准化残差或Pearson残差为 e_i^{(P)} = \frac{y_i - \hat\mu_i}{\sqrt{\hat\mu_i}} .

    定义偏差残差(deviance residual)为 e_i^{(D)} = \text{sgn}(y_i - \hat\mu_i) \left\{ 2 \left[ y_i (\ln y_i - \ln\hat\mu_i) - (y_i - \hat\mu_i) \right] \right\}^{1/2} . 其平方和恰好等于模型的残差偏差(residual deviance)。 偏差残差一般与Pearson残差近似相等。

    glm() 结果, 可以用 residuals() 函数提取各种残差, 指定 type="response" "pearson" "deviance" , 缺省为 type="deviance"

    36.2.5 菲律宾家庭人数研究案例

    36.2.5.1 数据与探索性分析

    本例子来自 ( Roback and Legler 2021 )§4.4。 数据是菲律宾统计局的2015年调查数据, 从4万户家庭数据中随机抽取了1500个家庭的子集。 因变量是家庭中除了户主以外的人数, 自变量包括户主年龄、家庭贫困与否、所在地区。 家庭贫困与否, 用住房屋顶是否主要使用廉价材料来表征。 因为因变量是计数的, 所以考虑使用泊松回归作为初始的模型。 泊松分布参数 \(\lambda\) 是除了户主以外的家庭人数的期望值。

    读入数据并展示前几行:

    基本R软件的配套(默认安装)扩展包stats提供了 glm() 函数, 用来进行广义线性模型建模。 对家庭人口数问题, 以 total 为因变量, 以户主年龄 age 为自变量, 先建立仅有一个自变量的模型:

    可以建立一个没有自变量的模型作为基准模型, 称这个模型为空模型(null model):

    从探索性数据分析结果发现年龄对平均人口数的影响并不是单调的, 而是在中间达到最大值。 所以有可能需要增加年龄的二次项。 平均年龄约为53, 为了避免共线问题,增加 \((\text{age}-53)^2\) 项:

    其它自变量对家庭人口数也可以有影响。 先增加location变量, 这是一个有5个水平的因子, 建模时会被转化为4个二值哑变量:

    流行病学研究中, 经常要研究某种病的发病率如何受到自变量的影响。 虽然这属于二项分布, 但是因为发病率都比较低, 可以用泊松分布作为近似模型。 设 \(T\) 为总人数和累计时间(如人年单位), \(\lambda\) \(T\) 对应的平均发病人数, 则针对参数 \rho = \lambda / T 这样才可以对人口数不同的地区使用统一的模型。 利用泊松回归, \log(\lambda) = \beta_0 + \beta_1 x + \log(T) , glm() 公式中可以用 offset() 表示系数固定等于1的自变量。

    例36.1 ISwR包的eba1977包含类丹麦的4个城市肺癌发病率数据, 以年龄和城市为自变量建模。

    在泊松回归这样的因变量为计数变量问题中, 可能会出现如下的问题:

  • 零过多数据(zero inflated data)。 数据中存在比泊松分布应有的个数更多的零。 这一般是来自于两个总体的混合, 其中一个总体服从泊松分布, 而另一个总体总是等于零。
  • 过度离势(over dispersion)问题。 数据中因变量的方差显著地高于泊松分布应有的方差。 这可能来自于缺少了重要的解释变量导致不同组被混在一起变成了混合泊松分布, 或者观测的独立性不成立, 如果存在过度离势, 参数估计的标准误差会过于低估, 导致显著性检验结果过于乐观, 使得本来不显著的自变量变得显著。
  • g(p) =& \beta_0 + \beta_1 x_1 + \dots + \beta_k x_k . \end{aligned}\] 其中 \(m\) 为试验次数, \(Y\) \(m\) 次试验中成功次数, \(p\) 为给定 \(x_1, \dots, x_k\) 条件下的成功概率。 一般取联系函数 \(g(p)\) 为logit函数 \text{logit}(p) = \ln \left( \frac{p}{1-p} \right) . 此模型称为逻辑斯谛回归模型。 \(\frac{p}{1-p}\) 是成功概率与失败概率的比值, 称为发生比(odds,或优势)。 \(\ln\frac{p}{1-p}\) 称为对数发生比。

    逻辑斯谛回归模型有如下的模型假定:

  • 因变量表示成败型结果,为零壹变量或者已知试验次数中成功次数;
  • 各个观测独立;
  • 如果某个观测的试验次数为 \(m\) ,成功概率为 \(p\) , 则因变量方差为 \(m p (1-p)\) , 方差不等于常数值,与期望值 \(mp\) 有关系;
  • 对数发生比 \(\ln \frac{p}{1-p}\) 与自变量之间为线性关系。
  • 仅有一个自变量 \(x\) 时, 数据可以是 \((x_i, y_i), i=1,2,\dots,n\) , 其中 \(y_i\) 仅取0或取1, \[\begin{aligned} y_i \sim& \text{b}(1, p_i), \\ \text{logit}(p_i) =& a + b x_i, \ i=1,2,\dots, n . \end{aligned}\]

    数据也可以是 \((x_i, y_i, z_i), i=1,2,\dots,n\) , 其中 \(y_i\) 代表第 \(i\) 个观测的成功数, \(z_i\) 代表失败数, \[\begin{aligned} y_i \sim& \text{B}(m_i, p_i), \\ \text{logit}(p_i) =& a + b x_i, \ i=1,2,\dots, n . \end{aligned}\] 其中 \(m_i = y_i + z_i\) 是第 \(i\) 个观测的试验次数, 是非随机的正整数值。

    36.3.2 最大似然估计

    先考虑观测的因变量是二值因变量情形。 数据为 \((x_i, y_i)\) , \(i=1,\dots, n\) , 一个观测对似然函数的贡献为 p_i^{y_i} (1 - p_i)^{1 - y_i}, p_i = \text{logit}^{-1}(a + b x_i) = \frac{e^{a + b x_i}}{1 + e^{a + b x_i}}, 对数似然函数为 \[\begin{aligned} \ell(a, b) =& \sum_{i=1}^n \left\{ y_i \ln p_i + (1-y_i) \ln(1-p_i) \right\} \\ =& \sum_{i=1}^n \left\{ y_i \ln \frac{p_i}{1-p_i} + \ln(1-p_i) \right\} \\ =& \sum_{i=1}^n \left\{ y_i (a + b x_i) - \ln(1 + e^{a + b x_i}) \right\} . \end{aligned}\]

    若观测是二项数据 \((x_i, m_i, y_i)\) , 其中 \(y_i \sim \text{B}(m_i, p_i)\) , p_i = \text{logit}^{-1}(a + b x_i), 则第 \(i\) 个观测对似然函数的贡献为 \binom{m_i}{y_i} p_i^{y_i} (1 - p_i)^{m_i - y_i}, 对于对数似然函数的贡献为 \[\begin{aligned} & \ln \binom{m_i}{y_i} + y_i \ln p_i + (m_i - y_i) \ln(1 - p_i) \\ =& \ln \binom{m_i}{y_i} + y_i \ln \frac{p_i}{1 - p_i} + m_i \ln(1 - p_i) \\ =& \ln \binom{m_i}{y_i} + y_i \ln(a + b x_i) - m_i \ln(1 + e^{a + b x_i}) , \end{aligned}\] 忽略与待估参数 \(a, b\) 无关的常数项后, 对数似然函数为 因变量的对数似然函数为 \[\begin{align} \ell(a, b) =& \sum_{i=1}^n \left[ y_i \ln p_i + (m_i - y_i) \ln(1 - p_i) \right] \tag{36.1} \\ =& \sum_{i=1}^n \left[ y_i \ln(a + b x_i) - m_i \ln(1 + e^{a + b x_i}) \right] . \end{align}\]

    需要用数值迭代算法求最大似然估计。 若样本为满足模型的随机样本, 最大似然估计是相合估计, 渐近有效估计, 具有渐近正态分布。

    得到最大似然估计 \((\hat a, \hat b)\) 后, 一般用信息阵的逆矩阵估计其协方差阵, 信息阵为: I(a,b) = - E \left[ \frac{\partial^2 \ell(a,b)}{\partial (a, b) \partial (a, b)^T} \right] , 在用数值迭代算法计算最大似然估计时, 一般会得到最大值点处的对数似然函数的海色阵, 加上负号并求逆矩阵, 就可以作为参数协方差阵估计。

    有了参数估计的协方差阵估计, 就得到了参数估计的标准误差。 设参数估计为 \(\hat\theta\) , 估计的方差开平方根作为其抽样分布标准差估计, 称为标准误差,记为 \(\text{SE}(\hat\theta)\) 。 Z = \frac{\hat\theta}{\text{SE}(\hat\theta)}, 可以用 \(Z\) 统计量检验 \(H_0: \theta=0\) , 在 \(H_0\) 成立、大样本且满足适当正则性条件时 \(Z\) 近似服从标准正态分布。 也可以用 \(Z^2\) 近似服从 \(\chi^2(1)\) 分布进行检验。 这样对回归系数进行的检验称为Wald类型的检验。 此检验对中小样本有一定缺陷, 当参数的实际数值绝对值较大时, 容易错判成不显著。 另一种可用的方法是下面所述的利用偏差统计量的方法。

    36.3.3 偏差分析

    当因变量是多次试验的二项分布结果时, 虽然可以计算比例与模型预测概率的差, 但残差平方和与线性正态情形的回归模型的残差平方和不同, 所以用偏差(deviance)代替了残差平方和。

    \(y_i \sim \text{B}(m_i, p_i)\) , 设 \(\hat p_i = \text{logit}^{-1}(\hat a + \hat b x_i)\) , \(\hat y_i = m_i \hat p_i\) , 定义逻辑斯谛回归的偏差为 = 2 \sum_{i=1}^n \left[ y_i \log \left( \frac{y_i}{\hat y_i} \right) + (m_i - y_i) \log \left( \frac{m_i - y_i}{m_i - \hat y_i} \right) \right] .

    当因变量观测值 \(y_i\) 与预测值 \(\hat y_i\) 都很接近时, 偏差 \(G^2\) 的值比较小; 当模型不准确时,偏差的值比较大。 记此模型为 \(M\) , 设模型 \(M\) \(p\) 个回归系数, 模型 \(M\) 拟合充分时一定条件下偏差服从自由度为 \(n-p\) 的卡方分布。 下面解释上述偏差公式。

    在R软件的 glm() 函数计算时, “饱和模型”(称为模型S)就是对每个观测估计一个不同的 \(\hat y_i\) , 即 \(\hat p_i = y_i / m_i\) , \(\hat y_i = y_i\) 。这样有 \(n\) 个参数。 但是要注意, 饱和模型使用 \(n\) 个参数, 默认假定了各个观测的自变量组合都是互不相同的, 因为某一个特定的自变量组合如果在多个观测中重复出现应该给出相同的预测值, R中并没有自动进行各个观测的自变量组合互不相同的验证。

    在模型S下, 最大化的对数似然函数值为 (36.1) 式中 \(p_i = y_i / m_i\) ; 在模型 \(M\) 下, 最大化的对数似然函数值为 (36.1) 式中 \(p_i = \hat p_i\) ; 于是两个模型的对数似然函数差的 \(-2\) 倍为 \[\begin{aligned} =& -2 \left[ \max\ln(L_M) - \max\ln(L_S) \right] \\ =& -2 \sum_{i=1}^n \left[ y_i \log\hat p_i + (m_i - y_i) \log(1 - \hat p_i) \right] \\ & + 2 \sum_{i=1}^n \left[ y_i \log \frac{y_i}{m_i} + (m_i - y_i) \log(1 - \frac{y_i}{m_i}) \right] \\ =& 2 \sum_{i=1}^n \left[ y_i \frac{y_i}{\hat y_i} + (m_i - y_i) \log(\frac{m_i - y_i}{m_i - \hat y_i}) \right] \end{aligned}\] 其中 \(\hat y_i = m_i \hat p_i\) 是模型M的预测值。 可见偏差是模型M与饱和模型S比较的对数似然比统计量, 相应的检验是似然比检验。 在“模型 \(M\) 与模型 \(S\) 相同”的零假设成立时, \(G^2\) 在大样本情况下近似服从 \(\chi^2(n - p)\) 分布, \(p\) 为回归参数 \(\boldsymbol{\beta}\) 的维数, 在上述推导中有两个回归参数 \(a, b\) ,所以 \(p=2\) 。 在R软件输出中偏差显示为“残差偏差”(residual deviance)。 可以将残差偏差按照 \(n-p\) 自由度的卡方分布计算右侧p值, 因为是将模型与饱和模型比较, 所以p值小于检验水平 \(\alpha\) 时认为模型拟合不足。

    如果有两个模型 \(M\) \(C\) \(C\) \(M\) 的特例(比如令 \(M\) 中某个参数等于0), 称这两个模型有嵌套关系, 模型 \(C\) 嵌套于 \(M\) 中。 所有模型都是饱和模型 \(S\) 的嵌套模型。 计算 \(M\) \(C\) 的残差偏差 \(G_M^2\) \(G_C^2\) , 则其差值 \(G_M^2 - G_C^2\) 在两个模型相同的零假设下近似服从卡方分布, 自由度等于两个模型的参数个数之差。 可以用这样的方法检验两个嵌套模型是否有显著差异。 在R中用 anova() 函数加 test="Chisq" 选项进行这样的检验。

    R的输出结果有 null deviance , 这是空模型(仅有截距项、没有自变量的模型)的残差偏差, 即空模型与完全模型的比较。 null deviance 是所有模型的 residual deviance 中最大的。 将模型偏差(残差偏差)与空模型的偏差进行比较, 就可以检验所有自变量的系数(除截距项以外的回归系数)同时为0的零假设。 空模型嵌套在所有其它模型中。

    因为偏差统计量的近似卡方分布是大样本性质, 有文献认为, 偏差统计量在自变量都是类别变量, 数据为列联表数据, 且每个单元格观测数都达到5或10以上时比较准确; 如果自变量中有连续测量的自变量, 使得每个单元格重复试验次数很少, 偏差统计量的分布不一定准确。

    36.3.4 足球罚球得分概率案例

    考虑足球比赛罚球得分的概率, 研究得分概率是否与罚球球队当前是否比分领先有关系。 若干次罚球的汇总表格数据如下:

    = \frac{p_1}{p_2} \frac{1 - p_2}{1 - p_1} , 比两个组的概率之比 \(\frac{p_1}{p_2}\) 还多了 \(\frac{1 - p_2}{1 - p_1}\) 这一项。

    定义自变量 X = \begin{cases} 1, & \text{罚球球队比分领先}, \\ 0, & \text{比分不领先}, \end{cases} 则问题用逻辑回归表示, \[\begin{aligned} Y \sim& \text{B}(m, p), \\ \ln\frac{p}{1-p} =& \beta_0 + \beta_1 X . \end{aligned}\] 问题的数据比较简单, 可以看成只有 \(X=0\) \(X=1\) 两个观测, 于是当 \(X=0\) (罚球球队比分不领先时), 记这时罚球成功概率为 \(p_0\) , \ln\frac{p_0}{1-p_0} = \beta_0; 当 \(X=1\) ,即罚球球队比分领先时, 记这时罚球成功概率为 \(p_1\) ,则 \ln\frac{p_1}{1-p_1} = \beta_0 + \beta_1; 由此可以解释 \(\beta_1\) 的含义为: \[\begin{aligned} \beta_1 =& (\beta_0 + \beta_1) - \beta_0 = \ln\frac{p_1}{1-p_1} - \ln\frac{p_0}{1-p_0} \\ =& \ln \frac{\frac{p_1}{1-p_1}}{\frac{p_0}{1-p_0}}, \end{aligned}\] 其中 \(\frac{\frac{p_1}{1-p_1}}{\frac{p_0}{1-p_0}}\) 是比分领先相对于比分不领先时的优势比(odds ratio), 所以 \(e^{\beta_1}\) 等于优势比。

    用二项分布的分布概率可以写出模型的似然函数为 \[\begin{aligned} L(\beta_0, \beta_1) =& \binom{24}{22} p_1^{22} (1 - p_1)^{2} \ \binom{180}{141} p_0^{141} (1 - p_1)^{39} \\ \propto & \left( \frac{e^{\beta_0 + \beta_1}}{1 + e^{\beta_0 + \beta_1}}\right)^{22} \left(1 - \frac{e^{\beta_0 + \beta_1}}{1 + e^{\beta_0 + \beta_1}}\right)^{2} \left(\frac{e^{\beta_0}}{1 + e^{\beta_0}}\right)^{141} \left(1 - \frac{e^{\beta_0}}{1 + e^{\beta_0}}\right)^{39} . \end{aligned}\] 可以用数值优化方法求得最大似然估计 \(\hat\beta_0 = 1.2852\) , \(\hat\beta_1 = 1.1127\) 。 从而优势比的估计为 \(e^{1.1127} = 3.04\) , 与直接计算优势比完全相同。

    使用R的 glm() 函数来计算这个例子。 将因变量输入为由成功数与失败数两列组成的矩阵。

    数据框Michelin中包含了Zagat Survey 2006考察的164家法餐馆的顾客评分和是否被米其林推荐收录。 数据中每一行是一个评分值对应的数据, 变量 Food 是Zagat评分,取值从15到28, InMichelin 是某一评分被米其林收录家数, NotInMichelin 是未被米其林收录家数, mi 是该评分的总家数, proportion 是收录比例。

    以是否收录作为因变量, 以Zagat评分作为自变量,建立逻辑斯谛回归:

    考虑在某地的4个不同区域进行关于是否修建铁路的意见征询投票的数据分析, 赞同修建铁路的比例可能受到所在区域到要修建的铁路的距离(单位:英里)的影响, 距离越远越容易反对修建, 可能受到投票人中黑人比例的影响。 数据如下:

    黑人百分比

    文件“data/remiss.csv”中保存了癌症病人康复的数据, 变量remiss为康复与否(1为康复,0为未康复), 另外的6个变量为可能影响康复概率的自变量。 研究这些自变量对康复概率的影响, 并筛选最有解释能力的自变量。

    读入数据:

    逻辑斯谛回归是因变量为二值变量时的广义线性模型。 在有些应用问题中, 因变量是有序变量, 比如满意程度取“低”、“中”、“高”, 这时不应该分别对“中对低”、“高对低”用二值的逻辑斯谛回归建模, 因为“高”和“中”之间也是可比的, 分别建模的结果不一定能保证这个次序。

    采用如下的理论模型。 设某个潜在的连续取值的因变量为 \(Z\) , 服从如下的逻辑斯谛分布: F(x; \eta) = \text{logit}^{-1}(x-\eta), 易见 \(E Z = \eta\) 。 设观测到的取有序因子值的因变量 \(Y\) 是将 \(Z\) 的值按照如下的分点 \zeta_0 = -\infty < \zeta_1 < \dots < \zeta_{K-1} < \zeta_K = +\infty 将实数轴分为 \(K\) 段,各段分别编码为 \(1,2,\dots, K\) \[\begin{aligned} P(Y \leq k) =& P(Z \leq \zeta_k) = \text{logit}^{-1}(\zeta_k - \eta), \\ \text{logit}[P(Y \leq k)] =& \zeta_k - \eta . \end{aligned}\]

    设潜在变量 \(Z\) 的均值 \(\eta\) 依赖于自变量的线性组合, 则有如下的有序因子值的因变量的“比例发生比逻辑斯谛回归”(POLR)模型: \[\begin{align} \text{logit}[P(Y \leq k \;|\; x)] = \zeta_k - \beta x, k=2,3,\dots, K . \tag{36.2} \end{align}\] 这里 \(k=1\) 作为一个基线值。 因为 \(\zeta_k\) 未知,所以回归的截距项也归入到 \(\{ \zeta_k \}\) 中。 模型左边是因变量类别为 \(k\) 以及低于 \(k\) 的概率的对数发生比, 如果自变量的值不变, 对于不同的 \(k\) 这些对数发生比只差一个常数, 发生比只差一个倍数, 所以称为“比例发生比逻辑斯谛回归”模型; 因为是对 \(P(Y \leq k)\) \(k=1,2,\dots,K\) 依次建模, 所以也称为累积逻辑斯谛回归模型。

    注意 (36.2) 式左侧是小于等于的概率的一个单调增函数, 右侧用了自变量线性组合的相反数, 所以正系数代表了当自变量值增大时因变量取较高类别的概率变大。

    MASS包的 polr() 函数可以建立这种模型。 以MASS包的housing数据为例, 这是一个有四个分类变量的交叉频数表, 调查房主满意度有关情况, 四个分类变量是:

  • Sat :房主满意度,取值为Low, Medium, High,是有序因子;
  • Infl :房主对物业服务影响的评价,取值为Low, Medium, High;
  • Type :房屋类型,包括Tower, Atrium, Apartment, Terrace;
  • Cont :住户之间的交往情况,取值为Low, High。
  • housing是长表格式, 每个分类变量占一列, 另外 Freq 列保存单元格频数。

    Roback, Paul, and Julie Legler. 2021. Beyond Multiple Linear Regression - Applied Generalized Linear Models and Multilevel Models in r . Chapman; Hall/CRC. https://bookdown.org/roback/bookdown-BeyondMLR/ .