基于逆CDF方法的R函数pr1编写问题求助
解决你的逆CDF模拟R函数问题
Hey there! 首先得给你点个赞,你推导的逆CDF公式完全正确!咱们再理一遍:原CDF在10<x<20时是 $F_X(x) = \frac{(x-10)^3}{1000}$,令 $u=F_X(x)$ 解出 $x=10(1+u^{1/3})$,这个步骤一点毛病都没有。
接下来我帮你补全并写出正确的pr1函数,顺便解释每个环节:
pr1 <- function(n) { # 生成n个(0,1)区间的均匀随机数——逆CDF方法的核心就是用均匀分布映射目标分布 u <- runif(n) # 用你推导的逆公式计算对应样本值 x <- 10 * (1 + u^(1/3)) # 返回生成的随机样本 return(x) }
怎么验证函数是否靠谱?
你可以生成一个大样本,把经验CDF和理论CDF画出来对比,一眼就能看出对不对:
# 生成10000个样本(样本量越大,经验CDF越贴近理论值) sample_data <- pr1(10000) # 绘制经验CDF plot(ecdf(sample_data), main = "经验CDF vs 理论CDF", xlab = "x", ylab = "F(x)") # 叠加理论CDF曲线 curve(ifelse(x <=10, 0, ifelse(x <20, (x-10)^3/1000, 1)), from = 5, to = 25, add = TRUE, col = "red", lwd = 2) # 加个图例区分两条线 legend("topleft", legend = c("经验CDF", "理论CDF"), col = c("black", "red"), lty = c(1,1), lwd = c(1,2))
如果两条线几乎重合,就说明你的函数工作完全正常啦。
可能踩坑的地方
如果你之前的代码报错,大概率是这些小问题:
- 函数定义时没加
{}包裹代码块,R语法对这个很严格; - 计算时运算符优先级搞错了,比如把
10*(1+u^(1/3))写成10*1+u^(1/3),结果就完全错了; - 另外,R里开三次方用
u^(1/3)完全没问题,因为runif生成的u都是(0,1)之间的正数,不用担心负数开方的问题。
内容的提问来源于stack exchange,提问作者Han
相关产品推荐
相关产品推荐

