2015-09-30 18 views
6

単純な配列を持ち、それに対応する確率分布があるとします。R:確率密度分布からデータを生成する

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) 

私は同じディストリビューションを使用して、データの別のセットを生成することができます方法はあります。操作は確率的であるため、最初の分布と正確に一致する必要はありませんが、それから生成されます。

私は自分で簡単な解決策を見つけることに成功しました。ありがとう!

答えて

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

+0

これは素晴らしいことです!ありがとうございました! – puslet88

+2

これは素晴らしい答えです! 'stackoverflow'パッケージに追加します。 –

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. のようにあなたの区間外に描画し、あなたがリンクで説明したアルゴリズムを使用することができるだけで拒否することができます。曲線から描くように

+2

のように見えるこれはただの平滑化密度曲線から描いていない、データへのガウス雑音を追加することはありませんか? –

+1

@NealFultz平滑化された密度曲線はガウス分布の混合であることを覚えておいてください。そこで、各コンポーネントから直接サンプリングしています。しかし、はい、あなたも正しいです。 –

+0

デフォルト設定( 'kernel =" gaussian "')に適しています。 @ NealFultz右。 –

3

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

このアプローチは、 '密度'の 'n'引数に強く依存することに注意してください。あなたは 'n'以上の一意の値を得ることはありません。あなたは 'n 'の値とそれに対応する確率で離散確率関数からサンプリングしているだけです。アプリケーションに応じて、これはうまくいくかもしれません。 –

+0

それは良い点です、そして、データに合うように 'n'が操作されるかもしれません。私の目的のために、これは実際にも機能します。ここから選択する正解と有用な答えが多すぎます。もう一度ありがとう! – puslet88

関連する問題