基于模拟步长数据集的加权瑞利分布按天数层级求和的实现方法问询
加权瑞利分布求和实现方案
看起来你已经完成了帕累托步长数据的模拟,现在需要基于每个days层级的样本权重(也就是n列的值)来加权求和瑞利分布的概率密度函数(PDF)。我来一步步帮你实现这个需求:
1. 先明确瑞利分布的PDF定义
你给出的瑞利PDF公式是:
rayleigh_distr <- sum(n*function (x) x*exp(-1*(x/2*sigma)^2)/sigma^2)
先把这个转换成可调用的R函数,我按你给出的公式形式实现(如果需要调整公式细节可以直接修改函数内容):
# 定义瑞利分布PDF函数 rayleigh_pdf <- function(x, sigma) { x * exp(-1 * (x / (2 * sigma))^2) / sigma^2 }
2. 提取每个days层级的权重
你的df_sim里已经用dplyr::add_count生成了n列,代表每个days对应的样本数量(也就是权重)。我们先把每个唯一days对应的权重提取出来,避免重复计算:
library(dplyr) # 获取每个days层级的唯一权重数据 group_weights <- df_sim %>% distinct(days, n) %>% # 去重,保留每个days对应的n arrange(days) # 可选,按days排序方便查看
3. 实现加权求和的函数
接下来我们写一个函数,输入x值、sigma参数和你的数据集,输出加权后的瑞利PDF值:
weighted_rayleigh <- function(x, sigma, weight_df) { # 提取所有层级的权重 n_values <- weight_df$n # 计算每个权重对应的瑞利PDF值,再加权求和 sum(n_values * rayleigh_pdf(x, sigma)) }
扩展:如果每个days层级有独立的sigma
如果你的每个days层级需要使用不同的sigma值(比如从数据中拟合得到),只需要调整函数,把sigma和days绑定即可:
# 假设df_sim里新增了sigma列,每个days对应一个sigma值 weighted_rayleigh_grouped_sigma <- function(x, data_df) { # 提取每个days的n和sigma group_data <- data_df %>% distinct(days, n, sigma) # 按组计算n*PDF(x, sigma)后求和 sum(group_data$n * rayleigh_pdf(x, group_data$sigma)) }
4. 实际使用示例
单个x值的计算
假设我们设置sigma=500(和你帕累托模拟的scale参数一致),计算x=600时的加权PDF值:
sigma <- 500 x_test <- 600 # 计算结果 result <- weighted_rayleigh(x_test, sigma, group_weights) cat("x=", x_test, "时的加权瑞利PDF值:", result, "\n")
生成完整的分布曲线
如果需要可视化加权后的分布,可以生成一系列x值,批量计算并绘图:
# 生成x值序列(根据你的步长数据范围调整) x_seq <- seq(0, 2000, by=20) # 批量计算每个x对应的加权PDF值 pdf_values <- sapply(x_seq, weighted_rayleigh, sigma=sigma, weight_df=group_weights) # 绘制曲线 plot(x_seq, pdf_values, type="l", lwd=2, xlab="步长值", ylab="加权瑞利PDF", main="基于days层级权重的加权瑞利分布")
小提示
你模拟数据时的这段代码可能有个小笔误:
sim_data[,1:50] <- sim_data[50]*(-1)
这里sim_data[50]取的是第50行,如果你想把前50列赋值为第50列的负值,应该写成sim_data[,50],不过这对当前的加权分布计算没有影响~
内容的提问来源于stack exchange,提问作者N. J.
相关产品推荐
相关产品推荐

