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

R:从概率密度分布生成数据,r,random,probability-density,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) 库(stats) 数据从?density文档中的示例中,您(几乎)得到了答案 所以,像这样的东西应该可以做到: library("stats") data <- c(0,0.08,0.15,0.28,0.90) pdf_

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

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)
库(stats)

数据从
?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)
library(“stats”)

从曲线中绘制的数据:

sample(pdf_of_data$x, 1e6, TRUE, pdf_of_data$y)

最好的方法是生成经验累积密度函数,近似求逆,然后变换输入

这个复合表达式看起来像

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

这不就是在数据中添加高斯噪声,而不是从平滑密度曲线中提取吗?@NealFultz请记住,平滑密度曲线是高斯分布的混合物——每个观测值一个。所以我们只是直接从每个成分中取样。但是,是的,你也是对的。@NealFultz是对的。但是我想它很容易通过使用适当的函数而不是
rnorm
来修改。谢谢,这真是太棒了!我猜拒绝抽样看起来是这样的:
expected\u sample\u使用这种方法有一个限制,尽管在原始分布预测某个数字的概率为0的情况下,新样本可能仍然包含它,因为在使用概率密度分布后添加了变化。在我看来,注意,这种方法强烈依赖于
density
中的
n
参数。您永远不会得到超过
n
唯一值的值。您只是从一个离散概率函数中采样,该函数具有
n
值和相应的概率。根据您的应用程序,这可能很好。这是一个很好的观点,
n
可能会被操纵以适应数据。就我而言,这实际上也很有效。有太多正确和有用的答案可供选择。再次感谢!这太棒了!非常感谢。这是一个奇妙的答案!我将把它添加到
stackoverflow
包中。您可能想看看
ecdf
函数。它为您做了很多。@42-我不知道
ecdf
函数在这种情况下有什么帮助。我们有一个pdf,我们可以将它集成(与
cumsum
)得到一个cdf,我们将其反转得到一个分位数函数,然后我们可以从中提取
ecdf
根据从分发中提取的数据生成cdf。
hist(random.points, 100)