假设我有一个简单的数组,其对应的概率分布如下。
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)
有没有方法可以使用相同的分布生成另一组数据。由于操作是概率性的,因此它不必完全匹配初始分布,但将仅从该分布中生成。
我自己成功找到了一个简单的解决方案。谢谢!
假设我有一个简单的数组,其对应的概率分布如下。
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)
有没有方法可以使用相同的分布生成另一组数据。由于操作是概率性的,因此它不必完全匹配初始分布,但将仅从该分布中生成。
我自己成功找到了一个简单的解决方案。谢谢!
从?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)
你可以像拒绝采样中所述一样拒绝区间外的抽样。
或者,你可以使用链接中描述的算法。rnorm
,它就很容易被修改。 - Anders Ellern Bilgrauexpected_sample_size <- 2;
new_sample <- list();
while(length(new_sample) < expected_sample_size ){
new_item <- rnorm(1, sample(data, size = 1, replace = TRUE), data_pdf$bw);
if(new_item >0 & new_item < 1){ new_sample[length(new_sample)+1] <- new_item}
}
- puslet88sample(pdf_of_data$x, 1e6, TRUE, pdf_of_data$y)
density
中的n
参数。您最多只能获得n
个唯一值。您只是从具有n
个值和相应概率的离散概率函数中进行抽样。根据您的应用程序,这可能完全可以接受。 - Anders Ellern Bilgraun
可能被操纵以适应数据。对于我的目的来说,这实际上也可以。这里有太多正确和有用的答案可供选择了。再次感谢! - puslet88
ecdf
函数。它可以为你完成大部分工作。 - IRTFMecdf
函数在这种情况下有什么帮助。我们有一个概率密度函数,可以使用cumsum
计算出累积分布函数,然后再将其反转以获取分位函数,并从中进行绘制。ecdf
生成一个来自分布的数据的累积分布函数。 - user295691