You need to enable JavaScript to run this app. 如何在R中创建行人事件与州人口的比率以优化线性模型分析
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中创建行人事件与州人口的比率以优化线性模型分析

问题背景
  • 你目前已完成分州日度交通事故数据聚合、线性回归拟合的全流程,但现有回归系数缺乏跨场景的实际解释意义:比如路口项估计值0.009192的影响强度,会因为不同州的人口规模差异被稀释——人口基数小的州本身事故总量低,小系数对应的实际影响几乎可以忽略。
  • 现有数据来自美国国家公路交通安全管理局的公开事故数据集,样例结构包含州编码、行人事件计数PEDS、路口类型标识TYP_INT、事故发生日期等核心字段。
核心调整思路

要让指标和州人口规模挂钩,本质是把绝对数的行人事件计数,换算成以州人口为分母的标准化比率,消除不同州人口基数差异带来的数值偏差。
具体实现分两步:

  • 准备和事故表州编码一一匹配的2019年各州常住人口基准数据
  • 在日度聚合环节,把绝对数的行人事件数除以对应州的人口数,换算成固定尺度的比率。行业通用做法是换算为每10万人口对应的事件数,避免极小值带来的回归解读不便。

注意:你原来计算的intersection指标是当日事故中路口类型的均值,本身是0-1区间的占比,和人口规模没有关系,不需要做人口标准化处理。

代码调整细节

1. 循环聚合阶段的修改

在原来的分州聚合逻辑中,插入人口匹配和比率计算步骤,替换原来仅计算绝对数的聚合逻辑:

# 预准备的州人口映射表:两列结构,STATE 与事故表的州编码完全对齐
# state_pop_map <- data.frame(
#   STATE = c(1,2,3,...),
#   state_pop = c(4903185, 731545, 727347, ...) # 2019年对应州的常住人口数
# )

state <- unique(df$STATE)
for(i in state){
  # 获取当前处理州的人口基准值
  current_pop <- state_pop_map %>% filter(STATE == i) %>% pull(state_pop)
  
  df1<- df %>%
    filter(STATE==i) %>%
    dplyr::select(c(STATE,PEDS,DAY,MONTH,YEAR,TYP_INT)) %>%
    mutate(date = as.Date(as.character(paste(YEAR, MONTH, DAY, sep = "-"),"%Y-%m-%d"))) %>%
    group_by(date) %>%
    summarise(
      pedday = sum(PEDS), # 当日行人事件绝对总数
      intersection = mean(TYP_INT), # 当日所有事故中路口类型的均值
      state_pop = current_pop, # 关联当前州的人口基准
      # 计算人口标准化后的行人事件率:每10万人口对应的当日行人事件数
      ped_rate_day = pedday / state_pop * 100000
    )

  # 绘图部分同步替换y轴指标为标准化比率
  setwd("~/Desktop/Statistics790/States_ts/figures")
  plots<-df1 %>% 
    ggplot()+
    geom_line(aes(x=date,y=ped_rate_day))+
    ylim(0, max(df1$ped_rate_day, na.rm = T))+
    theme_bw()
  ggsave(paste0("state_",i,".png"),width=8,height=6)

  ts1<-ts(df1,start=c(2019,1,1), frequency=365)
  setwd("~/Desktop/Statistics790/States_ts")
  ts1 %>% write.csv(paste0("state_",i,".csv"),row.names = F)
}

2. 回归分析阶段的修改

把原来以绝对数pedday为因变量的模型,替换为以人口标准化后的比率ped_rate_day为因变量:

setwd("~/Desktop/Statistics790/States_ts")
for(i in state){
  print(paste0("-------------------------Analysis for State: ",i," -------------------------------"))
  df <- read.csv(paste0("state_",i,".csv"))
  print("------Linear Model (人口标准化后) ------")
  # 用每10万人口的行人事件率作为因变量,消除人口规模的影响
  print(summary(lm(ped_rate_day ~ intersection, data = df)))
}
调整后的结果解读
  • 此时回归输出的路口项系数,代表当日路口事故占比每提升1个单位(即当日所有事故均发生在路口),每10万人口对应的日行人事件数的变化幅度。
  • 这个解读完全不受州人口规模的影响,跨州对比的系数结果具备实际参考价值,不会再出现“小州系数影响微乎其微”的问题。

内容的提问来源于stack exchange,提问作者Moe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.25 09:45:07