如何在R中合并不同时间尺度的数据集(小时观测与日气象数据)
解决方案:合并数据集并构建混合效应模型
以下是在R中完成气象数据与动物观测数据合并、并构建混合效应模型的最优步骤:
1. 加载必要工具包
首先加载处理日期、数据操作和混合效应模型的核心包:
library(lubridate) # 高效处理日期时间格式 library(dplyr) # 数据清洗与合并 library(lme4) # 拟合混合效应模型
2. 数据预处理与日期标准化
关键是将两个数据集的日期格式统一,以便后续合并:
处理气象数据集
将气象数据中的字符串日期转换为标准格式,并提取纯日期部分(因气象数据为日均值,小时信息无合并意义):
# 样本气象数据 date <- c("1/1/2020 3:00", "1/2/2020 3:00","1/3/2020 3:00") temp <- c(18, 25, 10) press <- c(.25, .5, 1.25) met <- data.frame(date, press, temp) # 标准化日期 met <- met %>% mutate(datetime = dmy_hm(date), # 将字符串转为datetime格式(日/月/年 时:分) date_only = as_date(datetime)) %>% # 提取纯日期 select(-date, -datetime) # 清理冗余列
处理观测计数数据集
将分散的月、日、小时列合并为标准日期格式(需补充年份,这里与气象数据统一为2020年):
# 样本观测数据 month <- c(1, 1, 1, 1, 1, 1, 1, 1, 1) day <- c(1, 1, 1, 2, 2, 2, 3, 3,3) hour <- c(10, 11, 12, 10, 11, 12,10, 11, 12) obs <- c(14, 88, 67, 198, 3, 54, 2, 80, 36) counts <- data.frame(month, day, hour, obs) # 构建统一日期列 counts <- counts %>% mutate(date_only = make_date(year = 2020, month = month, day = day))
3. 合并数据集
使用left_join按纯日期列合并,确保保留所有观测数据(即使对应日期无气象数据时也不会丢失):
merged_data <- left_join(counts, met, by = "date_only")
合并后的数据会将每日的气象变量(temp、press)匹配到当天所有小时的观测计数上。
4. 构建混合效应模型
针对计数型数据,优先选择泊松或负二项混合效应模型(负二项用于处理过度离散情况):
泊松混合效应模型
假设小时为随机效应(控制不同小时的观测差异),气象变量为固定效应:
# 拟合模型 poisson_model <- glmer(obs ~ temp + press + (1 | hour), data = merged_data, family = poisson(link = "log")) # 查看模型结果 summary(poisson_model)
负二项混合效应模型(处理过度离散)
若泊松模型出现过度离散(可通过残差分析判断),改用负二项模型:
nb_model <- glmer.nb(obs ~ temp + press + (1 | hour), data = merged_data) summary(nb_model)
你可根据实际研究设计调整随机效应(例如将day作为随机效应),以更准确控制组内变异。
内容的提问来源于stack exchange,提问作者Benjamin Colbert
相关产品推荐
相关产品推荐

