计数数据泊松回归的简要介绍
回归是一种统计方法,可用于确定一个或多个预测变量与响应变量之间的关系。
泊松回归是一种特殊类型的回归,其中响应变量是“计数数据”。以下示例说明了可以使用泊松回归的情况:
示例 1:泊松回归可用于根据进入特定大学课程时的 GPA 和性别来检查从特定大学课程毕业的学生人数。在这种情况下,“毕业学生人数”是响应变量,“课程入学时的 GPA”是连续预测变量,“性别”是分类预测变量。
示例 2:泊松回归可用于根据天气条件(“晴天”、“阴天”、“雨天”)以及城市中是否发生特殊事件(“是”)来检查特定路口的交通事故数量或没有”)。在这种情况下,“道路事故数量”是响应变量,而“天气状况”和“特殊事件”都是分类预测变量。
示例 3:泊松回归可用于根据一天中的时间、一周中的某一天以及是否正在进行促销(“是或否”)来检查商店中您前面排队的人数”)。在这种情况下,“排在你前面的人数”是响应变量,“一天中的时间”和“一周中的某一天”都是连续预测变量,“正在进行的销售”是分类预测变量。
示例 4:泊松回归可用于根据天气条件(“晴天”、“阴天”、“雨天”)和路线难度(“轻松”、“雨天”)检查完成铁人三项的人数。中等”、“困难”)。在这种情况下,“完成比赛的人数”是响应变量,而“天气条件”和“课程难度”都是分类预测变量。
执行泊松回归将允许您查看哪些预测变量(如果有)对响应变量具有统计显着影响。
对于连续预测变量,您将能够解释该变量的 1 个单位的增加或减少如何与响应变量数字的百分比变化相关联(例如,“GPA 每增加 1 个单位与响应变量增加 12.5%)。
对于分类预测变量,您将能够解释一组计数(例如,在晴天完成铁人三项的人数)与另一组(例如,完成一项铁人三项的人数)相比的百分比变化。雨天参加铁人三项)。
泊松回归的假设
在执行泊松回归之前,我们必须确保满足以下假设,以便我们的泊松回归结果有效:
假设1:响应变量是计数数据。在传统的线性回归中,响应变量是连续数据。然而,要使用泊松回归,我们的响应变量必须由计数数据组成,其中包括0 或更大的整数(例如0、1、2、14、34、49、200 等)。我们的响应变量不能包含负值。
假设2:观察结果是独立的。数据集中的每个观测值必须彼此独立。这意味着一个观察结果不应该能够提供有关另一观察结果的信息。
假设3:账户分布服从泊松分布。因此,观察到的计数和预期计数应该相似。测试这一点的一个简单方法是绘制预期计数和观察到的计数并查看它们是否相似。
假设 4:模型的均值和方差相等。这是基于计数分布遵循泊松分布的假设。对于泊松分布,方差与均值具有相同的值。如果满足这个假设,那么就具有等分散性。然而,这一假设经常被违反,因为过度分散是一个常见问题。
示例:R 中的泊松回归
现在我们将回顾如何在 R 中执行泊松回归的示例。
背景
假设我们想知道给定县的一名高中棒球运动员根据他的学区(“A”、“B”或“C”)和他的学校成绩获得了多少奖学金。大学入学考试(从0到100测量)。 )。
以下代码创建我们将使用的数据集,其中包括 100 名棒球运动员的数据:
#make this example reproducible set.seed(1) #create dataset data <- data.frame(offers = c(rep(0, 50), rep(1, 30), rep(2, 10), rep(3, 7), rep(4, 3)), division = sample(c("A", "B", "C"), 100, replace = TRUE), exam = c(runif(50, 60, 80), runif(30, 65, 95), runif(20, 75, 95)))
了解数据
在实际将泊松回归模型拟合到该数据集之前,我们可以通过可视化数据集的前几行并使用dplyr库运行汇总统计来更好地理解数据:
#view dimensions of dataset dim(data) #[1] 100 3 #view first six lines of dataset head(data) # offers division exam #1 0 A 73.09448 #2 0 B 67.06395 #3 0 B 65.40520 #4 0 C 79.85368 #5 0 A 72.66987 #6 0 C 64.26416 #view summary of each variable in dataset summary(data) # offers division exam # Min. :0.00 To:27 Min. :60.26 # 1st Qu.:0.00 B:38 1st Qu.:69.86 # Median: 0.50 C:35 Median: 75.08 # Mean:0.83 Mean:76.43 # 3rd Qu.:1.00 3rd Qu.:82.87 # Max. :4.00 Max. :93.87 #view mean exam score by number of offers library(dplyr) data %>% group_by (offers) %>% summarize (mean_exam = mean(exam)) # A tibble: 5 x 2 # offers mean_exam # #1 0 70.0 #2 1 80.8 #3 2 86.8 #4 3 83.9 #5 4 87.9
从上面的结果我们可以观察到以下几点:
- 数据集中有 100 行和 3 列
- 一名球员收到的报价最少为零,最多为四,平均为 0.83。
- 在此数据集中,“A”组有 27 名球员,“B”组有 38 名球员,“C”组有 35 名球员。
- 考试最低分60.26分,最高分93.87分,平均分76.43分。
- 一般来说,获得更多奖学金的玩家往往有更高的考试分数(例如,没有收到奖学金的玩家的平均考试分数为 70.0,收到 4 份奖学金的玩家的平均审查分数为 87.9)。
我们还可以创建一个直方图,根据划分来可视化玩家收到的报价数量:
#load ggplot2 package library(ggplot2) #create histogram ggplot(data, aes(offers, fill = division)) + geom_histogram(binwidth=.5, position="dodge")
我们可以看到大多数玩家没有收到或只收到一份报价。这是遵循泊松分布的典型数据集:很大一部分响应值为零。
拟合泊松回归模型
接下来,我们可以使用glm()函数调整模型并指定我们要使用family=”fish”作为模型:
#fit the model model <- glm(offers ~ division + exam, family = "fish" , data = data) #view model output summary(model) #Call: #glm(formula = offers ~ division + exam, family = "fish", data = data) # #Deviance Residuals: # Min 1Q Median 3Q Max #-1.2562 -0.8467 -0.5657 0.3846 2.5033 # #Coefficients: #Estimate Std. Error z value Pr(>|z|) #(Intercept) -7.90602 1.13597 -6.960 3.41e-12 *** #divisionB 0.17566 0.27257 0.644 0.519 #divisionC -0.05251 0.27819 -0.189 0.850 #exam 0.09548 0.01322 7.221 5.15e-13 *** #--- #Significant. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 # #(Dispersion parameter for fish family taken to be 1) # # Null deviance: 138,069 on 99 degrees of freedom #Residual deviance: 79,247 on 96 degrees of freedom #AIC: 204.12 # #Number of Fisher Scoring iterations: 5
从结果中我们可以观察到以下几点:
- 泊松回归系数、估计标准误差、z 分数和相应的 p 值均已提供。
- 审核系数为0.09548 ,这表明审核增加 1 个单位的报价数量的预期对数为0.09548 。解释这一点的一种更简单的方法是取指数值,即e 0.09548 = 1.10 。这意味着入学考试每多加一分,收到的录取通知书数量就会增加 10%。
- B 组的系数为0.1756 ,这表明 B 组球员的预期报价数量比 A 组球员高0.1756 。解释此值的更简单方法是取指数,即e 0.1756 = 1.19 。这意味着 B 组的玩家收到的报价比 A 组的玩家多 19%。请注意,这种差异在统计上并不显着 (p = 0.519)。
- C 组的系数为-0.05251 ,这表明 C 组球员的报价数量的预期对数比 A 组球员低0.05251 。解释此值的更简单方法是取指数值,即e 0.05251 = 0.94 。这意味着 C 组的玩家收到的邀请比 A 组的玩家少 6%。请注意,这种差异在统计上并不显着 (p = 850)。
还提供了有关模型偏差的信息。我们对剩余偏差特别感兴趣,它在96 个自由度中的值为79,247 。使用这些数字,我们可以执行卡方拟合优度检验,以查看模型是否适合数据。以下代码说明了如何执行此测试:
pchisq(79.24679, 96, lower.tail = FALSE) #[1] 0.8922676
此检验的 p 值为0.89 ,远高于 0.05 显着性水平。我们可以得出结论,数据相当适合模型。
查看结果
我们还可以使用以下代码创建一个图表,显示根据部门和入学考试结果获得的预期奖学金数量:
#find predicted number of offers using the fitted Poisson regression model data$phat <- predict(model, type="response") #create plot that shows number of offers based on division and exam score ggplot(data, aes(x = exam, y = phat, color = division)) + geom_point(aes(y = offers), alpha = .7, position = position_jitter(h = .2)) + geom_line() + labs(x = "Entrance Exam Score", y = "Expected number of scholarship offers")
该图表显示了在入学考试中获得高分的球员的预期奖学金数量的最高数量。此外,我们可以看到 B 区(绿线)的球员一般应该比 A 区或 C 区的球员收到更多的报价。
报告结果
最后,我们可以以总结我们的发现的方式报告回归结果:
运用泊松回归来根据分区和入学考试成绩预测棒球运动员获得的奖学金数量。入学考试每多获得一分,收到的录取通知书数量就会增加 10% ( p < 0.0001) 。未发现这种划分具有统计显着性。