You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中实现传入分布函数列表生成比例分布函数的方法

问题与解决方案

背景

我定义了多个正态分布的概率密度函数:

A <- function(x) dnorm(x, mean = 3, sd = 1)
B <- function(x) dnorm(x, mean = 6, sd = 1)
C <- function(x) dnorm(x, mean = 2, sd = 2)

通过pdqr包,我可以手动生成基于这些函数乘积的比例分布函数:

x <- seq(1, 10, by = 0.1)

P <- data.frame(x) %>%
  mutate(A = A(x),
         B = B(x),
         C = C(x)) %>%
  mutate(y = A * B * C) %>%
  pdqr::new_d(type = "continuous")

但手动处理2-10个分布函数过于繁琐,希望编写一个foo函数,通过传入分布函数列表(如P <- foo(list(A, B, C)))自动生成目标分布函数,需要解决两个核心问题:

  • 利用列表中的函数生成每个x对应的概率向量;
  • 将所有概率向量逐行相乘得到y,进而生成分布函数。

解决方案

以下是可运行的foo函数实现:

library(dplyr)

foo <- function(dist_funs, x_seq = seq(1, 10, by = 0.1)) {
  # 初始化包含x序列的数据框
  result_df <- data.frame(x = x_seq)
  
  # 遍历分布函数列表,计算每个函数在x序列上的取值
  for (fun_idx in seq_along(dist_funs)) {
    current_fun <- dist_funs[[fun_idx]]
    result_df[[paste0("dist_", fun_idx)]] <- current_fun(x_seq)
  }
  
  # 逐行计算所有概率值的乘积
  result_df$y <- apply(result_df[, -1], 1, prod)
  
  # 生成连续分布函数
  pdqr::new_d(result_df, type = "continuous")
}

# 使用示例
P <- foo(list(A, B, C))

关键说明

  • 传入分布函数时请用list()而非c(),list()能保留每个函数的独立结构,避免被强制转换为函数向量;
  • 函数默认使用seq(1, 10, by = 0.1)作为x序列,也可通过x_seq参数自定义范围和步长;
  • 用apply逐行计算乘积,自动适配任意数量的输入分布函数(2-10个均适用)。

内容的提问来源于stack exchange,提问作者Johan Vos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 14:29:09