如何将含随机效应的多住宅时间序列数据用于随机森林回归建模
R环境下多住宅空气污染监测数据整合与随机森林异质性控制方案
一、标准化数据集构建(直接适配随机森林输入要求)
按以下步骤处理三个点位的原始数据,不需要复杂的格式转换:
- 给每个住宅的原始数据集新增
home_id分组字段,分别赋值唯一标识(如H1/H2/H3),后续所有异质性控制都围绕这个字段实现 - 统一所有共有字段的命名、单位、编码规则:时间戳、室内PM2.5、CO2、温度、各类二进制居民活动变量(烹饪、吸烟、清扫、开窗等)必须在三个数据集中保持完全一致的字段名,活动变量统一编码为0(未发生)/1(发生)
- 独有字段统一命名:各住宅独立测量的室外PM2.5值不需要做宽表拆分,全部统一命名为
outdoor_pm25即可,因为每条数据行已经绑定了对应的home_id,不会出现值混淆 - 时间序列校验:统一三个数据集的时间步长(如均为5分钟/10分钟间隔),短时间缺失值用线性插值补全,长时间缺失直接剔除对应行,禁止跨住宅插补数据
- 补充时间特征:从时间戳字段提取小时、星期几两个时间维度变量,用来控制室内PM2.5的昼夜、周度节律影响
对应的R实现代码:
library(tidyverse) library(lubridate) # 读入三个住宅的原始监测数据 home1 <- read_csv("home1_raw.csv") %>% mutate(home_id = "H1") home2 <- read_csv("home2_raw.csv") %>% mutate(home_id = "H2") home3 <- read_csv("home3_raw.csv") %>% mutate(home_id = "H3") # 设定统一字段列表,确保三个数据集字段对齐 selected_cols <- c("timestamp", "indoor_pm25", "co2", "temp", "outdoor_pm25", "cook", "smoke", "window_open", "clean", "home_id") # 行绑定整合为总数据集 combined_data <- bind_rows(home1[,selected_cols], home2[,selected_cols], home3[,selected_cols]) %>% # 格式转换适配随机森林要求 mutate( home_id = as.factor(home_id), hour = hour(timestamp), weekday = wday(timestamp, label = TRUE), # 二进制活动变量可以保留数值型,也可以转因子,不影响结果 across(c(cook, smoke, window_open, clean), as.integer) ) %>% # 剔除含缺失值的行,按需替换为插补逻辑 drop_na()
二、住宅固有异质性控制方法
不用硬套线性混合模型的随机效应设定,树模型的异质性处理逻辑和线性模型有区别,以下两种方案可直接落地:
- 基础方案(适配所有主流随机森林包):直接把
home_id作为分类特征放入自变量集。树模型在节点分裂时会自动识别不同住宅的基线污染水平、建筑通风特性等固有差异,相当于自动为不同住宅匹配独立的分裂规则,对异质性的控制效果和分层建模无显著差异。不要对home_id做独热编码,ranger、randomForest等包原生支持因子型分类变量,分裂效率更高。 - 严谨方案(完全剥离组间差异干扰):建模前对所有连续型变量做住宅组内均值中心化,也就是每个变量的观测值减去该变量在对应住宅内的均值,处理后所有连续变量的住宅间基线差异被完全消除,此时模型捕捉到的活动变量效应完全来自住宅内部的时间序列变异,不会被跨住宅的系统性差异干扰。
对应的中心化代码:
combined_data_centered <- combined_data %>% group_by(home_id) %>% mutate( across(c(indoor_pm25, co2, temp, outdoor_pm25), ~.x - mean(.x, na.rm = TRUE)) ) %>% ungroup() %>% # 加入PM2.5滞后项控制时间自相关,lag_n对应前n个时间步的观测值 mutate( pm25_lag1 = lag(indoor_pm25, 1), pm25_lag3 = lag(indoor_pm25, 3) ) %>% drop_na()
时间序列自相关是这类监测数据建模最容易忽略的干扰项,加入滞后项后变量重要性的排序结果会稳定很多,不会出现假阳性的高重要性变量。
三、模型构建与核心活动变量识别
- 建模时以
indoor_pm25为因变量,自变量包含环境指标(CO2、温度、室外PM2.5、PM2.5滞后项、小时、星期)、所有二进制活动变量、home_id - 变量重要性必须选择**置换重要性(Permutation Importance)**计算方式,不要用默认的节点不纯度减少值,后者对高基数变量存在固有偏差,置换重要性直接反映单个变量被随机打乱后模型预测误差的上升幅度,数值越高代表变量的预测能力越强,完全匹配识别高贡献活动类型的需求。
对应的建模与重要性提取代码:
library(ranger) set.seed(123) # 固定随机种子保证结果可复现 rf_model <- ranger( formula = indoor_pm25 ~ . - timestamp, # 排除时间戳字段,其余字段全部作为自变量 data = combined_data_centered, num.trees = 1000, importance = "permutation", # 开启置换重要性计算 mtry = floor(sqrt(ncol(combined_data_centered)-2)) # 默认参数即可,可按需调参 ) # 提取并排序变量重要性,活动类变量的排序就是预测能力强弱结果 var_imp <- importance(rf_model) %>% sort(decreasing = TRUE) print(var_imp)
- 稳健性校验:可以单独提取每个活动变量的部分依赖图,观察该变量从0变为1时室内PM2.5的边际变化量,如果变化量显著大于0且在三个住宅中方向一致,说明该活动对PM2.5的影响是稳定的。
内容的提问来源于stack exchange,提问作者fp2000
相关产品推荐
相关产品推荐

