Topic 6 SCI 文章之计数变量泊松回归

2023-11-12

这期继续说说统计这些事,泊松分布大家可能熟悉些,但是用它来做模型还是需要细细品味一下**。**

泊松回归,也被称为对数线性模型,当结果变量是一个计数(即数值型,但不像连续变量的范围那么大)时,使用泊松回归。研究中统计变量的例子包括一个人有多少次心脏病发作或中风,在过去的一个月中他服用了多少天(插入你最喜欢的非法药物),或者,在生存分析中,从爆发到感染有多少天。泊松分布是唯一的,因为它的均值和方差相等。这通常是由于零通胀。有时可能有两个过程在起作用:一个决定事件是否发生,另一个决定事件发生时发生了多少次。使用我们的计数变量,这可能是一个示例,其中包含个人有无心脏病:那些没有心脏病导致的数据过多的零和那些有心脏病减弱尾部向右与越来越多的心脏病发作。这就是为什么逻辑回归和泊松回归一起出现在研究中:在泊松分布中有一个固有的二分结果。但是,如果不进一步进行泊松回归,就无法理解逻辑问题中的命中点。

01****泊松回归的概念

———————

泊松回归适用于在给定时间内响应变量为事件发生数目的情况,它假设 Y 服从泊松分布,线性模型的拟合形式为

图片

其中 λ 是 Y 的均值(也等于方差),此时,连接函数 log(λ),概率分布为泊松分布。

R中的泊松回归是一种回归分析模型,用于预测分析,其中有多个可能的结果是可数的。R语言提供了计算和评估泊松回归模型的内置函数 glm(),其中参数 family=poisson() 即为泊松回归,如下:

glm(Y ~ X1 + X2 + X3, family=poisson(),data=mydata)

下面举两个实例做模型,这两个例子都是参考R 包里面自带的数据,当我们使用时需要搞清自己的因变量是哪种类型,才能够选择准确的模型,上面已经说过,泊松回归因变量是有多个可数的结果,即结果是可以计算的,才能够选择泊松回归构建临床预测模型。

02 计数变量实例解析

—————————

软件包安装及数据读取,并且对数据进行整理,利用网络上的例子:一所高中的学生获得的奖项数量。预测获奖人数的因素包括学生就读的课程类型(例如,职业课程、普通课程或学术课程)和他们的数学期末考试分数,数据分布情况如下:

install.packages("sandwich")
install.packages("msm")
require(ggplot2)
require(sandwich)
require(msm)
p <- read.csv("https://stats.idre.ucla.edu/stat/data/poisson_sim.csv")
p <- within(p, {
  prog <- factor(prog, levels=1:3, labels=c("General", "Academic", 
                                            "Vocational"))
  id <- factor(id)
})
summary(p)
     id        num_awards           prog          math      
 1      :  1   Min.   :0.00   General   : 45   Min.   :33.00  
 2      :  1   1st Qu.:0.00   Academic  :105   1st Qu.:45.00  
 3      :  1   Median :0.00   Vocational: 50   Median :52.00  
 4      :  1   Mean   :0.63                    Mean   :52.65  
 5      :  1   3rd Qu.:1.00                    3rd Qu.:59.00  
 6      :  1   Max.   :6.00                    Max.   :75.00  
 (Other):194                                                  
ggplot(p, aes(num_awards, fill = prog)) +
  geom_histogram(binwidth=.5, position="dodge")+
  theme_bw()

图片

过度离势

抽样于二项分布的数据的期望方差是 σ2 = nπ(1-π),n为观测数,π为属于Y=1组的概率。所谓过度离势,即观测到的响应变量的方差大于期望的二项分布的方差。过度离势会导致奇异的标准 误检验和不精确的显著性检验。检测过度离势的一种方法是比较二项分布模型的残差偏差与残差自由度,如下:

图片

当其值大于1非常多时,则认为存在过度离势,同样的,也可以对其进行检验。

pchisq(summary(m1)$dispersion * fit$df.residual, fit$df.residual, lower = F)
[1] 0.4746369

利用上述数据拟合泊松回归模型,整个过程包括模型结果的数据整理,如下:

m1 <- glm(num_awards ~ prog + math, family="poisson", data=p)
summary(m1)
Call:
glm(formula = num_awards ~ prog + math, family = "poisson", data = p)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-2.2043  -0.8436  -0.5106   0.2558   2.6796  

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)    -5.24712    0.65845  -7.969 1.60e-15 ***
progAcademic    1.08386    0.35825   3.025  0.00248 ** 
progVocational  0.36981    0.44107   0.838  0.40179    
math            0.07015    0.01060   6.619 3.63e-11 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 287.67  on 199  degrees of freedom
Residual deviance: 189.45  on 196  degrees of freedom
AIC: 373.5

Number of Fisher Scoring iterations: 6

cov.m1 <- vcovHC(m1, type="HC0")
cov.m1
            (Intercept)  progAcademic progVocational          math
(Intercept)     0.417313917 -0.0501798114  -9.053756e-02 -5.996339e-03
progAcademic   -0.050179811  0.1030719195   8.710937e-02 -6.688459e-04
progVocational -0.090537557  0.0871093744   1.603340e-01  5.649134e-05
math           -0.005996339 -0.0006688459   5.649134e-05  1.088927e-04

std.err <- sqrt(diag(cov.m1))
r.est <- cbind(Estimate= coef(m1), "Robust SE" = std.err,
               "Pr(>|z|)" = 2 * pnorm(abs(coef(m1)/std.err), lower.tail=FALSE),
               LL = coef(m1) - 1.96 * std.err,
               UL = coef(m1) + 1.96 * std.err)

r.est
with(m1, cbind(res.deviance = deviance, df = df.residual,
               p = pchisq(deviance, df.residual, lower.tail=FALSE)))
                Estimate  Robust SE     Pr(>|z|)          LL          UL
(Intercept)    -5.2471244 0.64599839 4.566630e-16 -6.51328124 -3.98096756
progAcademic    1.0838591 0.32104816 7.354745e-04  0.45460476  1.71311353
progVocational  0.3698092 0.40041731 3.557157e-01 -0.41500870  1.15462716
math            0.0701524 0.01043516 1.783975e-11  0.04969947  0.09060532
## update m1 model dropping prog
m2 <- update(m1, . ~ . - prog)
## test model differences with chi square test
anova(m2, m1, test="Chisq")

s <- deltamethod(list(~ exp(x1), ~ exp(x2), ~ exp(x3), ~ exp(x4)), 
                 coef(m1), cov.m1)

## exponentiate old estimates dropping the p values
rexp.est <- exp(r.est[, -3])
## replace SEs with estimates for exponentiated coefficients
rexp.est[, "Robust SE"] <- s

rexp.est
(s1 <- data.frame(math = mean(p$math),
                  prog = factor(1:3, levels = 1:3, labels = levels(p$prog))))
predict(m1, s1, type="response", se.fit=TRUE)
## calculate and store predicted values
p$phat <- predict(m1, type="response")

## order by program and then by math
p <- p[with(p, order(prog, math)), ]

## create the plot
ggplot(p, aes(x = math, y = phat, colour = prog)) +
  geom_point(aes(y = num_awards), alpha=.5, position=position_jitter(h=.2)) +
  geom_line(size = 1) +
  labs(x = "Math Score", y = "Expected number of awards")+theme_bw()

图片

03 计数变量实例解析

————————

为阐述泊松回归模型的拟合过程,并探讨一些可能出现的问题,我们选择使用robust包中的breslow(癫痫数据)数据。安装R包及数据读取,并且解读数据的意义,从下面我们可以看出响应变量为:sumY(随机化后八周内癫痫发病数),是一个计算变量,再看自变量也就是预测变量为:

  1. 治疗条件(Trt),包括两种药物组和安慰剂组

  2. 年龄(Age);

  3. 前八周的基础癫痫发病数(Base)。

#########possion regression
install.packages("robust")
library(robust)
summary(breslow.dat)
   ID              Y1                Y2               Y3               Y4              Base       
 Min.   :101.0   Min.   :  0.000   Min.   : 0.000   Min.   : 0.000   Min.   : 0.000   Min.   :  6.00  
 1st Qu.:119.5   1st Qu.:  2.000   1st Qu.: 3.000   1st Qu.: 2.000   1st Qu.: 3.000   1st Qu.: 12.00  
 Median :147.0   Median :  4.000   Median : 5.000   Median : 4.000   Median : 4.000   Median : 22.00  
 Mean   :168.4   Mean   :  8.949   Mean   : 8.356   Mean   : 8.441   Mean   : 7.305   Mean   : 31.22  
 3rd Qu.:216.0   3rd Qu.: 10.500   3rd Qu.:11.500   3rd Qu.: 8.000   3rd Qu.: 8.000   3rd Qu.: 41.00  
 Max.   :238.0   Max.   :102.000   Max.   :65.000   Max.   :76.000   Max.   :63.000   Max.   :151.00  
      Age               Trt          Ysum             sumY            Age10           Base4       
 Min.   :18.00   placebo  :28   Min.   :  0.00   Min.   :  0.00   Min.   :1.800   Min.   : 1.500  
 1st Qu.:23.00   progabide:31   1st Qu.: 11.50   1st Qu.: 11.50   1st Qu.:2.300   1st Qu.: 3.000  
 Median :28.00                  Median : 16.00   Median : 16.00   Median :2.800   Median : 5.500  
 Mean   :28.34                  Mean   : 33.05   Mean   : 33.05   Mean   :2.834   Mean   : 7.805  
 3rd Qu.:32.00                  3rd Qu.: 36.00   3rd Qu.: 36.00   3rd Qu.:3.200   3rd Qu.:10.250  
 Max.   :42.00                  Max.   :302.00   Max.   :302.00   Max.   :4.200   Max.   :37.750  

names(breslow.dat)
[1] "ID"    "Y1"    "Y2"    "Y3"    "Y4"    "Base"  "Age"   "Trt"   "Ysum"  "sumY"  "Age10" "Base4"
summary(breslow.dat[c(6, 7, 8, 10)]
  Base             Age               Trt          sumY       
 Min.   :  6.00   Min.   :18.00   placebo  :28   Min.   :  0.00  
 1st Qu.: 12.00   1st Qu.:23.00   progabide:31   1st Qu.: 11.50  
 Median : 22.00   Median :28.00                  Median : 16.00  
 Mean   : 31.22   Mean   :28.34                  Mean   : 33.05  
 3rd Qu.: 41.00   3rd Qu.:32.00                  3rd Qu.: 36.00  
 Max.   :151.00   Max.   :42.00                  Max.   :302.00 
 
 table(breslow.dat$sumY)
 0   3   4   6   7  10  11  12  13  14  15  16  19  20  22  24  26  28  29  30  32  33  39  42  51  53  55  59  65 
  1   1   1   4   2   4   2   2   5   4   2   3   1   1   2   1   2   1   1   2   1   1   1   2   1   1   1   1   1 
 66  70  74  95 123 143 302 
  1   1   1   1   1   1   1 

因变量的偏倚特性以及可能的离群点,初看图形时,药物治疗下癫痫发病数似乎变小,且方差也变小了(泊松分布中,较小的方差伴随着较小的均值)。 与标准最小二乘法回归不同,泊松回归并不关注方差异质性。

# plot distribution of post-treatment seizure counts
p1<-ggplot(breslow.dat, aes(Trt,sumY, fill = Trt))+
  geom_boxplot()+
  geom_point(aes(y = sumY), alpha=.5, position=position_jitter(h=.2))+
  labs(x = "Treatment", y = "Count")+
  guides(fill=FALSE)+
  theme_bw()
  
p2<-ggplot(breslow.dat, aes(sumY, fill = Trt)) +
  geom_histogram(binwidth=20, position="dodge")+
  guides(fill=FALSE)+
  theme_bw()+
  labs(x = "Seizure Score", y = "Frequency")+
  facet_grid(~Trt)

cowplot::plot_grid(p1, p2, nrow = 2, labels = LETTERS[1:2])

图片

下面拟合泊松分布,结果我们发现Age、Base 和 Trtprogabide 都是显著的,需要进行过度离势检测,如下:

# fit regression
fit <- glm(sumY ~ Base + Age + Trt, data=breslow.dat, family=poisson())
summary(fit)
Call:
glm(formula = sumY ~ Base + Age + Trt, family = poisson(), data = breslow.dat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-6.0569  -2.0433  -0.9397   0.7929  11.0061  

Coefficients:
               Estimate Std. Error z value Pr(>|z|)    
(Intercept)   1.9488259  0.1356191  14.370  < 2e-16 ***
Base          0.0226517  0.0005093  44.476  < 2e-16 ***
Age           0.0227401  0.0040240   5.651 1.59e-08 ***
Trtprogabide -0.1527009  0.0478051  -3.194   0.0014 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 2122.73  on 58  degrees of freedom
Residual deviance:  559.44  on 55  degrees of freedom
AIC: 850.71

Number of Fisher Scoring iterations: 5

# interpret model parameters
coef(fit)
(Intercept)         Base          Age Trtprogabide 
  1.94882593   0.02265174   0.02274013  -0.15270095 

exp(coef(fit))
(Intercept)         Base          Age Trtprogabide 
   7.0204403    1.0229102    1.0230007    0.8583864 

当其值大于1非常多时,则认为存在过度离势,同样的,也可以对其进行检验,

# evaluate overdispersion
deviance(fit)/df.residual(fit)
10.1717
######
install.packages("qcc")
library(qcc)
qcc.overdispersion.test(breslow.dat$sumY, type="poisson")
Overdispersion test Obs.Var/Theor.Var Statistic p-value
       poisson data          62.87013  3646.468       0
       
pchisq(summary(fit.od)$dispersion * fit$df.residual, fit$df.residual, lower = F)
[1] 5.844949e-102
对于泊松分布而言,当数据出现过度离势时,可使用 `family="quasipoisson"` 替换 `family="poisson""`的方法部分进行替换,此时,`glm()`结果依旧可用,如下:
#fit model with quasipoisson
fit.od <- glm(sumY ~ Base + Age + Trt, data=breslow.dat,
              family=quasipoisson())
summary(fit.od)

Call:
glm(formula = sumY ~ Base + Age + Trt, family = quasipoisson(), 
    data = breslow.dat)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-6.0569  -2.0433  -0.9397   0.7929  11.0061  

Coefficients:
              Estimate Std. Error t value Pr(>|t|)    
(Intercept)   1.948826   0.465091   4.190 0.000102 ***
Base          0.022652   0.001747  12.969  < 2e-16 ***
Age           0.022740   0.013800   1.648 0.105085    
Trtprogabide -0.152701   0.163943  -0.931 0.355702    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

(Dispersion parameter for quasipoisson family taken to be 11.76075)

    Null deviance: 2122.73  on 58  degrees of freedom
Residual deviance:  559.44  on 55  degrees of freedom
AIC: NA

Number of Fisher Scoring iterations: 5

04 关于结果解读

———————

在泊松回归中,年龄的回归参数为0.0227,表明保持其他预测变量不变,年龄增 加1岁,癫痫发病数的对数均值将相应增加0.03。截距项即当预测变量都为0时, 癫痫发病数的对数均值。由于不可能为0岁,且调查对象的基础癫痫发病数均不 为0,因此本例中截距项没有意义。通常在因变量的初始尺度(癫痫发病数而非发病数的对数)上解释回归系数比较容易。为此,需要指数化回归系数。

指数化后,保持其他变量不变,年龄增加1岁,期望的癫痫发病数将乘以1.023。这意味着年龄的增加与较高的癫痫发病数相关联。更为重要的是,1单位Trt的变 化(即从安慰剂到治疗组),期望的癫痫发病数将乘以0.86,也就是说,保持基础癫痫发病数和年龄不变,服药组相对于安慰剂组癫痫发病数降低了20%。

这期参考了几本基本资料的书,才搞清使用方法的选择,以及结果的解读,都很有意思,不是轻易能理解,这里我其实看了四五个例子,以及专业的视频教程学习,整理出来,有写的不对的地方,还请各位指正。

关注公众号,每日有更新!
在这里插入图片描述

Reference:

  1. Robert I. Kabacoff 著, 《R语言实战 》(第2版), 人民邮电出版社, 2016

  2. 张铁军 陈兴栋 刘振球 著,《R语言与医学统计图形》, 人民卫生出版社, 2018

  3. Cameron, A. C. and Trivedi, P. K. 2009. Microeconometrics Using Stata. College Station, TX: Stata Press.

  4. Cameron, A. C. and Trivedi, P. K. 1998. Regression Analysis of Count Data. New York: Cambridge Press.

  5. Cameron, A. C. Advances in Count Data Regression Talk for the Applied Statistics Workshop, March 28, 2009. http://cameron.econ.ucdavis.edu/racd/count.html .

  6. Dupont, W. D. 2002. Statistical Modeling for Biomedical Researchers: A Simple Introduction to the Analysis of Complex Data. New York: Cambridge Press.

  7. Long, J. S. 1997. Regression Models for Categorical and Limited Dependent Variables. Thousand Oaks, CA: Sage Publications.

  8. Long, J. S. and Freese, J. 2006. Regression Models for Categorical Dependent Variables Using Stata, Second Edition. College Station, TX: Stata Press.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Topic 6 SCI 文章之计数变量泊松回归 的相关文章

随机推荐

  • [Python3网络爬虫开发实战] Scrapy 对接 Selenium

    Scrapy 对接 Selenium Scrapy 抓取页面的方式和 requests 库类似 都是直接模拟 HTTP 请求 而 Scrapy 也不能抓取 JavaScript 动态渲染的页面 在前文中抓取 JavaScript 渲染的页面
  • openEuler22.03通过yum安装postgresql及使用

    1 在系统上搜索有无postgresql的安装包 root localhost yum search postgresql Last metadata expiration check 0 47 44 ago on Wed 08 Feb 2
  • 字符串合并

    题目描述 详细描述 将输入的两个字符串合并 对合并后的字符串进行排序 要求为 下标为奇数的字符和下标为偶数的字符分别从小到大排序 这里的下标意思是字符在字符串中的位置 对排序后的字符串进行操作 如果字符为 0 9 或者 A F 或者 a f
  • NGUI学习教程

    http dsqiu iteye com blog 2025177
  • 利用js去除无限debugger

    极简壁纸F12后悔无限debug 还会一直增加内存 导致卡机 将下面的代码放到开发者选项的Console里面 回车 就可以终止debug了 去除无限debugger Function prototype constructor back F
  • Ubuntu利用Samba映射磁盘到Windows(转)

    原文 https www linuxidc com Linux 2011 09 42621 htm 1 首先在Ubuntu安装好samba 具体步骤为 安装samba sudo apt get install samba 安装smbclie
  • NLP 利器 Gensim 中 word2vec 模型的内存需求,和模型评估方式

    Gensim 中 word2vec 模型的内存需求 和模型评估方式 本文为系列文章之一 前面的几篇请点击链接 NLP 利器 gensim 库基本特性介绍和安装方式 NLP 利器 Gensim 库的使用之 Word2Vec 模型案例演示 NL
  • Centos彻底完全删除已安装软件的办法

    参考来源 Centos彻底完全删除已安装软件的办法 zxpo 博客园 step1 输入查询命令rpm qa grep libreoffice 打印如下 Step2 先删除上面第一行的包 输入 sudo rpm e libreoffice7
  • Latex修改局部字体大小

    按从小到大排列 只需把这些标识符加到card中 或者其他局部 的字体之前即可起作用 tiny scriptsize footnotesize small normalsize large Large LARGE huge Huge
  • react 之环境搭建(使用webstorm)

    使用webstorm搭建react 五步 推荐链接 https www jetbrains com help webstorm react html 步骤一 webStorm中配置node js 参考上一篇文章 步骤二 管理员权限打开web
  • STL之算法——排序算法

    一 介绍 常用的STL排序算法包括sort reverse merge random shuffle 二 sort 对容器内元素进行排序 1 函数原型 sort iterator begin iterator end 默认以升序方式对元素进
  • Shamir秘密共享协议

    文章仅仅用来构建知识框架工后续的复习使用 本文章是转载于其他博文 原文链接 https blog csdn net z784561257 article details 82942581 假设一个秘密s 秘密分发者将s运用某种特定的算法分成
  • 17个Python的牛逼骚操作,你都OK吗?

    作者 Gautham Santhosh 机器之心编译 Python 是一门非常优美的语言 其简洁易用令人不得不感概人生苦短 在本文中 作者 Gautham Santhosh 带我们回顾了 17 个非常有用的 Python 技巧 例如查找 分
  • 原码,反码,补码的如何取值及其范围

    1 原码 为二进制表示十进制 正数 首位为0 后7位为该数的值 列如 0 0000001 1 0 0000100 4 由此可得出正数原码的范围为 1 负数 首位为符号位 1 后七位为该数的绝对值 列如1 0000001 1 1 000010
  • 小程序 margin-right无效,文字溢出?

    先来看下盒子模型 box sizing样式 告诉浏览器去理解你设置的边框和内边距的值是包含在width内 设置了 box sizing border box 盒子的宽度 border padding width 盒子的高度 border p
  • unix Mechanism vs Policy(机制与策略)

    http blog csdn net ostrichmyself article details 5333558 http blog csdn net liuhaobupt article details 5350950 http linu
  • TFT电路原理

    TFT Thin Film Transistor 薄膜晶体管 在TFT LCD中 TFT的功能就是一个开关管 常用的TFT是三端器件 利用施加于栅极的电压来控制源 漏电极间的电流 对于显示屏来说 每个像素从结构上可以看作为像素电极和共同电极
  • 做了一个XSS的闯关游戏,攻略贴上来

    游戏地址 http xss quiz int21h jp 第一关 比较简单 直接输入 http xss quiz int21h jp sid 2a75ff06e0147586b7ceb0fe68ee443b86a6e7b9 第二关 也相对简
  • 三极管工作原理分析,精辟、透彻,看后你就懂

    随着科学技的发展 电子技术的应用几乎渗透到了人们生产生活的方方面面 晶体三极管作为电子技术中一个最为基本的常用器件 其原理对于学习电子技术的人自然应该是一个重点 三极管原理的关键是要说明以下三点 1 集电结为何会发生反偏导通并产生Ic 这看
  • Topic 6 SCI 文章之计数变量泊松回归

    这期继续说说统计这些事 泊松分布大家可能熟悉些 但是用它来做模型还是需要细细品味一下 泊松回归 也被称为对数线性模型 当结果变量是一个计数 即数值型 但不像连续变量的范围那么大 时 使用泊松回归 研究中统计变量的例子包括一个人有多少次心脏病