如何在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
相关产品推荐
相关产品推荐

