专栏首页科研猫R语言从入门到精通:Day13

R语言从入门到精通:Day13

在前面两次的教程中,我们学习了方差分析和回归分析,它们都属于线性模型,即它们可以通过一系列连续型 和/或类别型预测变量来预测正态分布的响应变量。但在许多情况下,假设因变量为正态分布(甚至连续型变量)并不合理,比如:结果变量可能是类别型的,如二值变量(比如:是/否、通过/未通过、活着/死亡)和多分类变量(比如差/良好/优秀)都显然不是正态分布;结果变量可能是计数型的(比如,一周交通事故的数目,每日酒水消耗的数量),这类变量都是非负的有限值,而且它们的均值和方差通常都是相关的(正态分布变量间不是如此,而是相互独立)。广义线性模型就包含了非正态因变量的分析,本次教程的主要内容就是关于广义线性模型中流行的模型:Logistic回归(因变量为类别型)和泊松回归(因变量为计数型)。

开始本次的教程之前,同样的,我们默认大家已经了解了广义线性模型的统计学理论背景,直接进入R语言的函数学习。

温馨提示

1、本节内容重点内容较多,

务必紧跟红色标记。

2、测试数据及代码

见文末客服小姐姐二维码。

基础模型构建

R中可通过函数glm()(还可用其他专门的函数)拟合广义线性模型。它的形式与lm()类似,只是多了一些参数。函数的基本形式为(可以左右滑动哦:

glm(formula, family=family(link=function), data=) 

其中参数formula和函数lm()中的用法类似,参数family则对应连接函数,不同的连接函数对应不同的回归模型。我们列出了概率分布(family)和相应默认的连接函数(function)。

表1: 概率分布(family)和连接函数对应表

因此可用如下代码拟合Logistic回归模型(可以左右滑动哦):

glm(Y~X1+X2+X3, family=binomial(link="logit"), data=mydata)

可用如下代码 拟合泊松回归模型:

glm(Y~X1+X2+X3, family=binomial(link="log"), data=mydata)

之前学习过的标注线性模型也可以用函数glm()拟合,如下代码的拟合结果相同。

glm(Y~X1+X2+X3, family=gaussian(link="identity"), data=mydata)
lm(Y~X1+X2+X3, data=mydata) 

函数glm()和函数lm()的相同之处很多,与函数lm()连用的很多函数都可以和函数glm()连用,下表中展示了一部分和函数glm()连用的函数。

表2:与函数glm()连用的函数

不管是标准线性模型还是正在讨论的广义线性模型,回归诊断都是不可或缺的。一般来说,前面标准线性模型中的诊断方法都可以用在广义线性模型的诊断中。这里有一些实用的建议:评价模型的适用性时,可以绘制初始响应变量的预测值与残差的图形、还可以列出帽子值(hat value)学生化残差值Cook距离统计量的近似值以及绘制这些统计量的参考图,当然你还可以找一些辅助函数,比如包car中的函数influencePlot()(这个函数会绘制一个综合的诊断图,帮助你判断模型适用性)。

其实上面的内容已经概括了R中广义线性模型拟合的主要过程,下面给出分别关于Logistic 回归和poisson回归的两个示例。

Logistic回归

以AER包中的数据框Affairs为例,我们将通过探究婚外情的数据来阐述Logistic 回归的过程。该数据从601 个参与者身上收集了9个变量,包括一年来婚外私通的频率以及参与者性别、年龄、婚龄、是否有小孩、宗教信仰程度(5分制,1分表示反对,5分表示非常信仰)、学历、职业(7种分类),还有对婚姻的自我评分(5分制,1表示非常不幸福,5表示非常幸福)。原数据中的婚外情(affairs)次数被记录下来,但是这里我们更关心二值型结果(有过一次婚外情/没有过婚外情),可以将affairs转化为二值型因子ynaffair,然后将ynaffair作为logistic回归的因变量。下面是把所有变量都加入模型中的拟合结果。

图1:加入所有变量的logistic回归模型

可以看到,图中只有age、yearsmarried、religiousness和rating对方程的贡献是显著的。因此只保留这四个变量再做一次回归分析。

图2:保留贡献显著的变量之后的回归模型

去掉之后的拟合效果是否和之前有差异呢?用函数anova()对两个模型进行卡方检验,看到差异并不显著(p=0.2108),可以认为两个模型拟合程度一样好。

图3,两个模型之间的比较

与标准线性模型不一样的是,在Logistic回归中,因变量是Y=1的对数优势比(log)。回归系数的含义是当其他预测变量不变时,一单位预测变量的变化可引起的因变量对数优势比的变化。在上面的例子中,yearsmarried的回归系数为0.10062,可以解释为yearsmarried增加一年,婚外情的优势比将乘以e0.10062=1.106(保持年龄、宗教信仰和婚姻评定不变),而如果增加10年,优势比将乘以1.10610,即2.7。如果这样还不够直观,还可以使用predict()函数,观察预测变量在各个水平时对结果概率的影响。图4中,当其他变量都取均值,随着yearsmarried的增加,出现婚外情的概率从0.136增加到0.260。

图4,评价预测变量对因变量的影响

对于抽样于二项分布的样本而言,观测到的响应变量的方差大于期望的二项分布的方差(过度离势)时会导致奇异的标准误检验和不精确的显著性检验,此时需要将二项分布改为类二项分布(quasibinomial distribution)。检测过度离势的一种方法是比较二项分布模型的残差偏差与残差自由度,如果两者的比值比1大很多,便可认为存在过度离势。另一种方法是对过度离势进行检验(拟合模型两次,第一次使用family="binomial",第二次使用family="quasibinomial",然后对两个模型进行检验)。第二种方法的检验中最后的p值为0.340(代码已提供),显然不显著(p>0.05),这说明我们的模型不存在过度离势。

Logistic回归还有很多变种,比如:稳健logistic回归(robust包中的函数glmRob())、多项分布logistic回归(mlogit包中的函数mlogit())、序数logistic回归(rms包中的函数lrm()),它们的拟合过程都大同小异,但是评价模型优度和诊断更加复杂。

泊松回归

当通过一系列连续型和/或类别型预测变量来预测计数型结果变量时,泊松回归是一个非常有用的工具。示例将使用robust包中的 Breslow癫痫数据,响应变量为sumY(随机化后八周内癫痫发病数),预测变量为治疗条件(Trt)、年龄(Age)和前八周内的基础癫痫发病数(Base)(虽然整个数据集中有12个变量,但是我们只关注其中四个)。图5展示了一部分数据的分布特征。从图中可以清楚地看到因变量的偏倚特性以及可能的离群点。同时,药物治疗下癫痫发病数似乎变小了,且方差也变小了(泊松分布中,较小的方差伴随着较小的均值)。与标准最小二乘回归不同,泊松回归并不关注方差异质性。(事实上,所有的建模分析中,观察数据分布特点都是必不可少的步骤,在本次教程中的两个示例中我们都保留了这一步,而在实际的建模分析中需要按照数据分布特点来选择不同模型拟合数据,否则很容易事倍功半。)

图5,示例数据分布情况

接下来进行回归分析。分析结果中,三个变量在p<0.05的情况下都非常显著。同时,变量Base、Age和Trt的三个回归系数分别为0.0227、0.0227和-0.1527。这说明保持其他变量不变,年龄增加一岁,期望的癫痫发病数将乘以e0.0227=1.023。这意味着年龄的增加与较高的癫痫发病数相关联。更为重要的是,一单位Trt的变化(即从安慰剂到治疗组),期望的癫痫发病数将乘以e-0.1527=0.86,也就是说,保持基础癫痫发病数和年龄不变,服药组相对于安慰剂组癫痫发病数降低了20%。

图6,poisson回归分析结果

同样,还需要评价泊松模型的过度离势。泊松分布的方差和均值相等。当响应变量观测的方差比依据泊松分布预测的方差大时,泊松回归可能发生过度离势。处理计数型数据时经常发生过度离势,且过度离势会对结果的可解释性造成负面影响。与Logistic回归类似,此处如果残差偏差与残差自由度的比例远远大于1,那么表明存在过度离势。对于癫痫数据,它的比例为10.17(计算代码已提供,见文末客服二维码),远大于1。在解决过度离势问题之前,推荐另一个检验poisson回归的过度离势的方法,即qcc包中的函数qcc.overdispersion.test(),这个函数的结果也说明这个回归模型确实存在过度离势的问题。通过用family="quasipoisson"替换family="poisson", 仍然可以使用glm()函数对该数据进行拟合。这与Logistic回归处理过度离势的方法是相同的。图7中是修改参数之后的回归模型,所得的回归系数估计与泊松方法相同,但标准误变大了许多。此处,标准误越大将会导致Trt(和Age)的p值越大于0.05。当考虑过度离势,并控制基础癫痫数和年龄时,并没有充足的证据表明药物治疗相对于使用安慰剂能显著降低癫痫发病次数。

图7,过度离势的解决方法

同样的poisson回归也有很多扩展的形式,如时间段变化的poisson回归(需要使用glm()函数中的offset选项)、零膨胀的泊松回归(pscl包中的函数zeroinfl()可做零膨胀泊松回归)、稳健泊松回归(robust包中的函数glmRob()可以拟合稳健广义线性模型,包含稳健泊松回归,当存在离群点和强影响点时,该方法会很有效。)。

小结&预告

到目前为止,R中基本统计分析就告一段落了,后面会介绍一些高级的数据挖掘分析,如主成分分析和聚类分析等等,在这些统计分析中,将看看处理潜变量的统计模型,即那些你坚信存在并能解释可观测变量的、无法被观测到的、 理论上的变量。具体而言,我们将学习如何使用因子分析方法检测和检验这些无法被观测到的变量的假设。

本期干货

·

- R语言回归分析 -

本文分享自微信公众号 - 科研猫(DoctorTommy),作者:小浣熊

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-10-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【临床研究】一个你无法逃避的问题:多元回归分析中的变量筛选

    临床模型研究,说到底是做一个模型,那么模型应该如何纳入自变量,纳入哪些自变量,这都是至关重要的问题。线性回归,逻辑回归和Cox比例风险回归模型是被广泛使用的多元...

    用户6317549
  • R语言从入门到精通:Day6

    距离上次R语言系列更新已经过去快一周了,先跟大家说声不好意思,实话实说更新速度的确慢了一点

    用户6317549
  • 医生必备技能,万字长文让你明白临床模型研究应该如何做

    对于大部分临床医生来说,往往是没有能力去做基础科研的,因为没有时间、经费和实验室。但是每家单位对文章的要求又是这么强硬,没有文章就无法进职称,该怎么办?

    用户6317549
  • 只用过synchronized却不知ReentrantLock

    在说ReentrantLock之前,必须先说一说锁。锁是为了线程安全而诞生的,我们常用的锁就是synchronized,通过下面程序看一下什么叫锁,锁有什么用。...

    大猫的Java笔记
  • pinpoint插件开发之二:从零开始新建一个插件

    在上一章《pinpoint插件开发之一:牛刀小试,调整gson插件》我们初步体验了pinpoint插件的构建和使用,本章我们从零开始创建一个全新插件,体验完整的...

    程序员欣宸
  • ServiceMesh入门的起点:构建一个微服务网关

    本文是在看了国外 Solo 公司 CTO 的博客之后整理的,本来是想按原文翻译,但是考虑到我自己在公司实践的思路,还是想把他的思路和我自己的思路做一些结合。所以...

    黑光技术
  • 07-08 创建计算字段使用函数处理数据第7章 创建计算字段第8章 使用函数处理数据

    上述例子中,存储在表中的数据都不是应用程序所需要的。我们需要直接从数据库中检索出转换、计算或格式化过的数据,而不是检索出数据,然后再在客户端应用程序中重新格式化...

    用户1250179
  • Hystrix 自动降级与依赖隔离1.背景2.Hystrix说明

    目前对于一些非核心操作,如增减库存后保存操作日志 发送异步消息时(具体业务流程),一旦出现MQ服务异常时,会导致接口响应超时,因此可以考虑对非核心操作引入服务降...

    JavaEdge
  • 人脸表情识别实战:你的喜怒哀乐飞桨统统get!

    【飞桨开发者说】李增保,2019年于安徽工业大学取得学士学位,目前在东南大学攻读硕士研究生学位,主要的研究方向为分布式无人机集群协同控制、算法设计与优化等。

    用户1386409
  • 前海征信大数据算法:风险概率预测

    感谢大家过去一年的关注与支持,有更好的建议或需求欢迎回复小编。新的一年你们将是人工智能、机器学习领域内的主角,越努力越幸运!

    机器学习AI算法工程

扫码关注云+社区

领取腾讯云代金券