在R中确定鸟类死亡率集中的日期(中位数/置信区间?)
分析鸟类死亡率日期区间的建议
核心思路调整
你之前直接对日期列计算四分位数/中位数的问题在于:日期是自变量,死亡率(Value)是因变量,应该围绕死亡率的分布来定位对应的日期区间,而非直接对日期做统计。你的数据存在极端峰值(7月末的3002),属于严重偏态分布,常规线性模型和无加权的日期统计完全不适用。
具体操作步骤
1. 按死亡率权重定位关键日期
要找“多数死亡率”对应的区间,本质是找累计死亡率占比达到阈值(如80%/90%)的日期范围,这比中位数/四分位数更贴合需求:
# 按日期排序,确保数据时间顺序正确 df <- df[order(df$DateObserved), ] # 计算累计死亡率占比 df$cumulative_pct <- cumsum(df$Value) / sum(df$Value) # 筛选累计占比10%-90%的区间,可自行调整阈值 target_range <- df$DateObserved[df$cumulative_pct >= 0.1 & df$cumulative_pct <= 0.9] cat("多数死亡率对应的日期区间:", min(target_range), "至", max(target_range), "\n")
这个方法直接聚焦“死亡率贡献最大的时间段”,完全避开非正态分布的问题。
2. 可视化验证(直观确认区间)
用柱状图叠加累计占比曲线,可直观看到峰值集中区域:
library(ggplot2) ggplot(df, aes(x = DateObserved)) + geom_col(aes(y = Value), fill = "steelblue") + geom_line(aes(y = cumulative_pct * sum(df$Value)), color = "red", size = 1) + scale_y_continuous(sec.axis = sec_axis(~./sum(df$Value), name = "累计死亡率占比")) + labs(x = "日期", y = "周死亡率") + theme(axis.text.x = element_text(angle = 45, hjust = 1))
红色曲线的陡峭上升段就是死亡率集中的核心区间,和累计占比计算结果对应。
3. 避坑提醒
- 不要对日期列做无加权统计:数据中多数日期死亡率极低,少数日期贡献了几乎所有死亡,无加权的日期统计会被低死亡日期拉偏,没有实际意义。
- 线性模型不适合偏态数据:你的数据是典型“事件集中爆发”模式,线性模型假设的均匀分布完全不匹配,拟合结果无参考价值。
- 可按死亡率分箱细化:若需要更细致划分,比如取前20%为高死亡区间:
# 按死亡率80分位数设定高死亡阈值 high_threshold <- quantile(df$Value, 0.8) high_dates <- df$DateObserved[df$Value >= high_threshold]
针对你提供数据的具体结果
用你的数据集计算,累计死亡率80%的区间是2022-07-10至2022-07-31,与数据中的峰值完全吻合,是真正的“多数死亡率集中区间”。
内容的提问来源于stack exchange,提问作者user2196886
相关产品推荐
相关产品推荐

