如何为example_data生成符合置信区间与均值要求的sample_pred列
为R数据框生成符合要求的sample_pred列
假设predictions_df包含x、prediction、prediction_lower_ci、prediction_upper_ci列,example_data包含x列,以下是实现需求的具体方法:
方法1:基于正态分布生成(均值更贴合prediction)
通过正态分布生成随机数,再截断到CI区间内,既能保证值落在要求范围,又能让均值接近目标prediction:
library(dplyr) # 合并预测区间和目标值到example_data example_data <- example_data %>% left_join(predictions_df, by = "x") # 按x分组生成符合要求的sample_pred example_data <- example_data %>% group_by(x) %>% mutate( # 以CI范围的1/4作为标准差,可根据需求调整 pred_sd = (prediction_upper_ci - prediction_lower_ci)/4, # 生成正态随机数并截断到CI区间 sample_pred = pmax(prediction_lower_ci, pmin(prediction_upper_ci, rnorm(n(), mean = prediction, sd = pred_sd))) ) %>% ungroup() %>% select(-pred_sd) # 移除临时计算列
方法2:调整均匀分布(实现简单)
若偏好均匀分布,可通过偏移量调整均值,使其贴合prediction:
library(dplyr) example_data <- example_data %>% left_join(predictions_df, by = "x") %>% group_by(x) %>% mutate( ci_mid = (prediction_lower_ci + prediction_upper_ci)/2, offset = prediction - ci_mid, # 计算均值偏移量 # 生成调整后的均匀分布随机数,再截断到CI区间 sample_pred = pmax(prediction_lower_ci, pmin(prediction_upper_ci, runif(n(), min = prediction_lower_ci - offset, max = prediction_upper_ci - offset))) ) %>% ungroup() %>% select(-ci_mid, -offset)
验证结果正确性
运行以下代码检查是否满足要求:
example_data %>% group_by(x) %>% summarise( 所有值在CI内 = all(sample_pred >= prediction_lower_ci & sample_pred <= prediction_upper_ci), sample_pred均值 = mean(sample_pred), 目标prediction = first(prediction), 均值差绝对值 = abs(sample_pred均值 - 目标prediction) )
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

