从0开始学习R语言--Day12--泊松分布

发布于:2025-05-31 ⋅ 阅读:(33) ⋅ 点赞:(0)

今天我们来看一个很经典的回归模型:泊松分布。

泊松分布

我们一般会把泊松分布用于预测问题,比如想知道成年人每天接到的骚扰电话次数,医院每天的急诊病人等。但在一些方面,跟我们想的会有出入。例如你不能将其应用在预测下周你的体重会是多少,看起来同是预测问题,但其背后隐含了数据的关系。

在预测每天接到的骚扰电话次数事件时,昨天接到的电话次数,跟今天的是没有关系的,急诊病人数量也一样,但如果是预测下周一个人的体重,那么其实会发现,下周的体重会跟下周前一天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,这说明这两个变量都对销量有很大的影响。