从0开始学习R语言--Day12--泊松分布
今天我们来看一个很经典的回归模型:泊松分布。
泊松分布
我们一般会把泊松分布用于预测问题,比如想知道成年人每天接到的骚扰电话次数,医院每天的急诊病人等。但在一些方面,跟我们想的会有出入。例如你不能将其应用在预测下周你的体重会是多少,看起来同是预测问题,但其背后隐含了数据的关系。
在预测每天接到的骚扰电话次数事件时,昨天接到的电话次数,跟今天的是没有关系的,急诊病人数量也一样,但如果是预测下周一个人的体重,那么其实会发现,下周的体重会跟下周前一天1有关系,在一个特定的区间内浮动,类似的,也就能推导到一周前。当然,如果要把泊松分布应用在预测急诊病人的数量,那么就需要特殊的前置条件,比如最近爆发了传染性较强的病毒,所以急诊病人数量会在一段时间内维持在一个比较高的数值。
所以,使用泊松分布的关键就在于,判断每个数据点之间是否有联系,从概率学上来讲,就是每一个数据点,都代表了一次独立概率事件,他们之间是互不影响的,只要满足这种特点,就能运用泊松分布,当然也不要忽略一些数值条件(比如泊松分布要求Y是整数),你不能说预测班里身高超过1米8的人有10.5个吧。
下面我们用一段实例来说明:
library(tidyverse)
library(ggplot2)set.seed(123) # 固定随机种子,确保结果可复现
n <- 500 # 样本量# 生成自变量:天气质量(weather,0~10)和是否促销(promotion,0/1)
weather <- runif(n, min = 0, max = 10)
promotion <- rbinom(n, size = 1, prob = 0.3) # 30%的日期有促销# 生成因变量:每日冰淇淋销量(sales),使用泊松分布
true_beta <- c(1.5, 0.2, 0.8) # 真实系数:截距、weather、promotion
log_lambda <- true_beta[1] + true_beta[2] * weather + true_beta[3] * promotion
sales <- rpois(n, lambda = exp(log_lambda)) # 生成泊松分布的计数数据# 构建数据框
df <- data.frame(sales, weather, promotion)
# 使用 glm() 拟合泊松回归模型
model <- glm(sales ~ weather + promotion, family = poisson(link = "log"), # 指定泊松分布和对数链接data = df)# 查看模型摘要
summary(model)# 新数据预测
new_data <- data.frame(weather = c(8, 3), # 天气8分 vs 3分promotion = c(1, 0) # 有促销 vs 无促销
)# 预测销量
pred_sales <- predict(model, newdata = new_data, type = "response")
pred_sales # 输出预测值# 检查是否过离散(Overdispersion)
library(AER)
dispersiontest(model)# 天气 vs 销量(按促销分组)
ggplot(df, aes(x = weather, y = sales, color = factor(promotion))) +geom_point(alpha = 0.6) +geom_smooth(method = "glm", method.args = list(family = poisson), se = FALSE) +labs(title = "天气和促销对冰淇淋销量的影响",x = "天气评分", y = "销量",color = "促销(1=是)") +theme_minimal()
输出:
Estimate Std. Error z value Pr(>|z|)
(Intercept) 1.508115 0.028471 52.97 <2e-16 ***
weather 0.200169 0.003801 52.66 <2e-16 ***
promotion 0.787791 0.020243 38.92 <2e-16 ***1 2
49.267146 8.236879
从输出中我们可以得知,当天气达到8分且有促销时,预测的销量为49.2;若天气只有3分且没有促销时,预测的销量为8.2。而且我们能观察到天气和促销的P值小于0.05,这说明这两个变量都对销量有很大的影响。