R:从概率密度分布生成数据

时间:2015-09-30 16:48:36

标签: r random probability-density

假设我有一个简单的数组,具有相应的概率分布。

library(stats)    
data <- c(0,0.08,0.15,0.28,0.90)
pdf_of_data <- density(data, from= 0, to=1, bw=0.1)

有没有办法可以使用相同的发行版生成另一组数据。由于操作是概率性的,它不再需要与初始分布完全匹配,而只是从它生成。

我确实成功找到了一个简单的解决方案。谢谢!

3 个答案:

答案 0 :(得分:8)

?density文档中的示例中,您(几乎)得到答案。

所以,这样的事情应该这样做:

library("stats")    
data <- c(0,0.08,0.15,0.28,0.90)
pdf_of_data <- density(data, from= 0, to=1, bw=0.1)

# From the example.
N <- 1e6
x.new <- rnorm(N, sample(data, size = N, replace = TRUE), pdf_of_data$bw)

# Histogram of the draws with the distribution superimposed.
hist(x.new, freq = FALSE)
lines(pdf_of_data)

Imgur

你可以在rejection sampling. {{}}}中拒绝间隔之外的抽奖 或者,您可以使用链接中描述的算法。

答案 1 :(得分:6)

最好的办法是生成经验累积密度函数,近似反函数,然后转换输入。

复合表达式看起来像

random.points <- approx(
  cumsum(pdf_of_data$y)/sum(pdf_of_data$y),
  pdf_of_data$x,
  runif(10000)
)$y

产量

hist(random.points, 100)

enter image description here

答案 2 :(得分:3)

从曲线中绘制:

dic = {'a': [1,2,3], 'b': [3,4,5]}
dic['a'] = list(set(dic['a'] + [2,3,4]))
dic