前面已经介绍了线性模型,本系列将介绍广义线性模型(Generalized Linear Model,GLM)。广义线性模型的大多方法都与线性模型类似,因此本系列主要介绍它的不同之处。示例数据如下:
data <- mtcars
广义线性模型主要针对因变量服从指数族分布的情况。凡是概率(密度)函数能写成如下形式的分布都属于指数族分布:
:指数族分布的自然参数,可以为一个常数,也可以为由常数构成的向量。
离散型分布中的二项分布、泊松分布,连续型分布中的正态分布、伽马分布(包括指数分布、卡方分布等)都属于指数族分布。
广义线性模型的形式如下:
和 分别为自变量和样本个数;
是广义线性模型的连接函数,其功能是将服从指数族分布的变量的数学期望 与线性表达式连接起来。
stats
工具包中用于运行广义线性模型的函数是glm
,它的前三个参数如下:
glm(formula, family = gaussian, data, ...)
相比lm
函数,glm
函数的第二个参数是family
,这也是其独有的参数:
formula:模型表达式;
family:因变量的概率分布形式,默认值为正态分布;
data:表达式中的变量所在的数据框。
其他重要参数如weights
、subset
和offset
等在线性回归系列的推文中已经有所介绍,在本系列中不再涉及。
常见的family
类型及其默认的连接函数:
binomial(link = "logit") # 二项分布
poisson(link = "log") # 泊松分布
gaussian(link = "identity") # 高斯分布(正态分布)
inverse.gaussian(link = "1/mu^2") # 逆高斯分布
Gamma(link = "inverse") # 伽马分布
link:连接函数形式。
常见连接函数的形式:
identity: ;
inverse: ;
sqrt: ;
logit: ;
log: ;
cloglog: ;
1/mu^2: ;
probit:正态分布的累积概率函数(概率分布函数)的反函数;
cauchit:柯西分布的累积概率函数(概率分布函数)的反函数。
各分布族可选的连接函数:
分布族 | 连接函数 |
---|---|
binomial | logit、probit、cauchit、log、cloglog |
poisson | log、identity、sqrt |
gaussian | 1/mu^2、inverse、identity、log |
inverse.gaussian | 1/mu^2、inverse、identity、log |
Gamma | inverse、identity、log |
由于线性模型要求因变量服从正态分布,而正态分布也属于指数族分布,因此线性模型也属于广义线性模型。以下通过两个例子比较lm
和glm
函数使用的异同。
例1 模型表达式:y ~ x
若y服从正态分布,则为线性模型(此处暂不考虑线性模型的其他假设),可以使用lm
函数对模型进行估计:
model.11 <- lm(hp ~ wt, data)
coef(summary(model.11))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.820922 32.32462 -0.05633236 9.554506e-01
## wt 46.160050 9.62530 4.79569988 4.145827e-05
glm
函数在family
参数为默认值时,实际上就是在运行线性模型:
model.12 <- glm(hp ~ wt, data = data)
coef(summary(model.12))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) -1.820922 32.32462 -0.05633236 9.554506e-01
## wt 46.160050 9.62530 4.79569988 4.145827e-05
可以看出,
model.12
和model.11
的输出结果完全一致;由于
data
是glm
函数的第三个参数,因此上述模型的data = data
不能简写为data
。
当y不服从正态分布,如泊松分布时,即使模型表达式形如线性模型,也仍然不是线性模型:
model.13 <- glm(hp ~ wt, family = poisson(link = "identity"), data)
coef(summary(model.13))
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -8.024698 6.603967 -1.215133 2.243154e-01
## wt 48.088336 2.169059 22.170136 6.670846e-109
可以看出,模型输出结果与前两个模型存在细微差别;
由于泊松分布族的默认连接函数为
log
,因此为了保持表达式为y ~ x
,需要手动指定连接函数。
例2 模型表达式:log(y) ~ x
在线性回归系列中已经介绍此类表达式也可以用线性模型进行估计,其假设为log(y)
服从正态分布:
model.21 <- lm(log(hp) ~ wt, data)
coef(summary(model.21))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.7633626 0.20794635 18.097757 1.083203e-17
## wt 0.3476751 0.06192018 5.614892 4.108319e-06
如果认为其为连接函数为log
的广义线性模型,则需要根据分布形式确定family
参数并指定连接函数为log
:
model.22 <- glm(hp ~ wt, family = gaussian(link = "log"),
data = data)
coef(summary(model.22))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.1327761 0.23273917 17.757114 1.827254e-17
## wt 0.2576024 0.05977168 4.309773 1.619811e-04
可以看出,尽管选择的分布形式都是正态分布,但
model.22
与model.21
的结果并不一致,这是因为lm
函数视log(y)
整体为因变量,而glm
函数视y
为因变量。
使用glm
函数实现线性模型结果的方法如下:
model.23 <- glm(log(hp) ~ wt, data = data)
coef(summary(model.23))
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.7633626 0.20794635 18.097757 1.083203e-17
## wt 0.3476751 0.06192018 5.614892 4.108319e-06
总结:由于广义线性模型是使用最大似然方法进行模型估计的,该方法依赖于因变量的分布形式,因此一旦分布形式不一致,即使模型表达式一样其估计结果也会存在差异。
往期推荐阅读:
《数据处理通识》专辑-base | 使用apply族函数进行向量化运算
《制表与可视化》专辑-ggplot2 | ggplot2作图语法入门
《数学模型》专辑-car | 线性回归(三)——残差分析和异常点检验
《地理计算与分析》专辑-spdep | 如何在R语言中计算空间自相关指数