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

如何在R中根据概率密度计算自定义连续分布的均值(期望)

计算自定义概率密度函数的期望与模拟验证

已定义的概率密度函数

你已经实现了分段概率密度函数(PDF)的R代码:

myfunc <- function(x){
  ifelse(x >= 0 & x < 0.5, 1,
         ifelse (x >= 0.5 & x < 1, 0.2,
                 ifelse(x >= 1 & x < 2, 0.8*(x-1), 0)))
}

方法一:通过积分计算精确期望

期望的数学定义是 $E[X] = \int_{-\infty}^{+\infty} x \cdot f(x) dx$,由于该PDF仅在$[0,2]$区间非零,我们可以直接用R内置的integrate()函数计算:

# 定义被积函数:自变量x乘以对应的概率密度值
integrand <- function(x) x * myfunc(x)

# 计算0到2区间的积分
ev_integral <- integrate(integrand, lower = 0, upper = 2)
print(ev_integral)

运行结果会输出精确的期望数值(约为0.8667,即26/30),和你手动计算的结果一致。


方法二:蒙特卡洛模拟估算期望

通过大量模拟该分布的随机样本,计算样本均值即可逼近真实期望,核心是用逆变换采样法生成符合该分布的样本:

1. 定义累积分布函数(CDF)

根据PDF分段推导CDF:

mycdf <- function(x){
  ifelse(x < 0, 0,
         ifelse(x >=0 & x <0.5, x,
                ifelse(x >=0.5 & x <1, 0.2*x + 0.4,
                       ifelse(x >=1 & x <2, 0.6 + 0.4*(x-1)^2, 1))))
}

2. 定义CDF的逆函数(用于采样)

求解$u=F(x)$的逆,得到从均匀分布到目标分布的映射:

inv_cdf <- function(u){
  ifelse(u < 0.5, u,
         ifelse(u >=0.5 & u <0.6, 5*u - 2,
                ifelse(u >=0.6 & u <1, 1 + sqrt((u - 0.6)/0.4), NA)))
}

3. 生成样本并计算均值

生成大量均匀随机数,代入逆CDF得到目标样本,再计算样本均值:

# 设置随机种子保证结果可复现
set.seed(123)
# 生成100万个样本(样本量越大,结果越精确)
n_samples <- 1e6
u_samples <- runif(n_samples)
x_samples <- inv_cdf(u_samples)

# 计算样本均值
ev_sim <- mean(x_samples)
print(ev_sim)

运行后得到的样本均值会接近0.867,样本量越大,结果越接近真实期望。


内容的提问来源于stack exchange,提问作者Reader 123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:25:01