在R中,如果只有概率密度函数可用,模拟任意单变量随机变量的最佳方法是什么?如何使用其概率函数最好地模拟任意单变量随机变量?
14
A
回答
11
这里是一个(慢)实施反cdf方法,当你只有一个密度。
den<-dnorm #replace with your own density
#calculates the cdf by numerical integration
cdf<-function(x) integrate(den,-Inf,x)[[1]]
#inverts the cdf
inverse.cdf<-function(x,cdf,starting.value=0){
lower.found<-FALSE
lower<-starting.value
while(!lower.found){
if(cdf(lower)>=(x-.000001))
lower<-lower-(lower-starting.value)^2-1
else
lower.found<-TRUE
}
upper.found<-FALSE
upper<-starting.value
while(!upper.found){
if(cdf(upper)<=(x+.000001))
upper<-upper+(upper-starting.value)^2+1
else
upper.found<-TRUE
}
uniroot(function(y) cdf(y)-x,c(lower,upper))$root
}
#generates 1000 random variables of distribution 'den'
vars<-apply(matrix(runif(1000)),1,function(x) inverse.cdf(x,cdf))
hist(vars)
1
使用累积分布函数http://en.wikipedia.org/wiki/Cumulative_distribution_function
就用它的倒数。 检查这里更好的画面http://en.wikipedia.org/wiki/Normal_distribution
这意味着:从这里选择随机数[0,1],并设置为CDF,然后检查值
它也被称为位数功能。
-1
您可以使用大都会黑社会从密度中获取样本。
6
为了澄清上述 “使用大都市黑斯廷斯” 的答案:
假设ddist()
是您的概率密度函数
类似:
n <- 10000
cand.sd <- 0.1
init <- 0
vals <- numeric(n)
vals[1] <- init
oldprob <- 0
for (i in 2:n) {
newval <- rnorm(1,mean=vals[i-1],sd=cand.sd)
newprob <- ddist(newval)
if (runif(1)<newprob/oldprob) {
vals[i] <- newval
} else vals[i] <- vals[i-1]
oldprob <- newprob
}
注:
- 完全未经测试
- 效率取决于候选分布(即,值为
cand.sd
)。 为了获得最大的效率,调cand.sd
至25-40%的录取率 - 结果将是自相关的...(虽然我猜你总是可以
sample()
结果,以争夺他们,或薄) - 可能需要丢弃的“烙印”,如果你的初始值是怪异
的经典方法这个问题是拒绝采样(例如见Press等人数值方法)
相关问题
- 1. 随机变量的概率
- 2. 确定随机变量的概率质量函数
- 3. 如何模拟随机变量?
- 4. 如何更改SystemVerilog随机变量的概率分布?
- 5. 如何在MATLAB中使用我自己的概率质量函数生成随机变量?
- 6. 在Python中分布随机变量的概率计算
- 7. 二元正态分布随机变量的概率
- 8. 任意变量,而函数调用
- 9. 概率随机数?
- 10. 如何从我自己的cdf中模拟iid随机变量?
- 11. 如何模拟随机正态变量Python
- 12. 给定一个具有概率密度函数f(x)的随机变量,如何计算R中随机变量的期望值?
- 13. 使用随机数来选择变量
- 14. PHP - 使用随机数回显变量?
- 15. 如何使像素变量随机?
- 16. 加/减随机数变量
- 17. 分配随机数变量
- 18. 任意概率分布方式的随机数发生器
- 19. 随机多变量
- 20. 如何创建任意数量的随机向量列?
- 21. 如何根据glm模型绘制变量的预测概率
- 22. 随机数生成使用srand()函数定义一个变量
- 23. 子函数的变量使用$变量
- 24. 随机数字的概率
- 25. c#概率和随机数
- 26. 概率和随机数
- 27. 高概率数的随机?
- 28. 如何使用JUnit,EasyMock或PowerMock模拟静态最终变量
- 29. PHP随机概率
- 30. 随机概率PHP
真棒的问题! – 2009-10-20 12:19:34