2011-10-27 2 views
0

多項分布からサンプルしたいと思います。私は、サンプルを使用していくつかの確率を指定することでこれを行います。 例:3つのカテゴリがあり、10回サンプルしたいと思います。サンプルを含む多項分布から巨大なサンプル(1e09)を描く

> my_prob = c(0.2, 0.3, 0.5) 
> x = sample(c(0:2), 100, replace = T, prob = my_prob) 
> head(x) 
[1] 2 0 2 1 1 2 

私の設定は次の点でのみ異なります。たくさんのサンプル(1e09など)が必要です。実際、私は各カテゴリの頻度にのみ興味があります。 だから、上記の例では、これは意味します:

> table(x) 
x 
0 1 2 
27 29 44 

は、誰もがアイデアはどのように可能な限り、このように効率的に計算することがありますか?

おかげで、あなたはrmultinomが必要 シュテフィ

+5

分析分布式を使用して限界内の度数分布を得ることができた場合、なぜその分布からサンプリングしたいのですか? –

+1

私はあなたが何か苦労しているのを恐れています。どんな統計的有意性を達成するためにも、このような大きなサンプルが必要とは思われません。たとえ非常に長いテールの分布をサンプリングしたいとしても、変換関数を使う方がはるかに良いでしょう。 Googleの「数値レシピ」などのトピック –

答えて

6

my_prob <- c(0.2,0.3,0.5) 
number_of_experiments <- 10 
number_of_samples <- 100 
experiments <- rmultinom(n=number_of_experiments, size=number_of_samples, prob=my_prob) 
experiments 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] 
    [1,] 14 18 15 19 14 17 23 18 24 15 
    [2,] 33 34 36 30 40 30 27 38 24 30 
    [3,] 53 48 49 51 46 53 50 44 52 55 
+0

実際にこれは完璧にうまく動作します、ありがとう、 – steffi

+0

はい。私にとっては、巨大な(〜1e09)サンプルサイズで動作します。もっと必要な場合は、Richie Cottonの答えからトリックを使用してください – Max

1

問題は、あなたがRAMに長さ1E9のベクトルに合うことができないということであれば、あなたは繰り返しサンプル数が少ないため、テーブルを計算し、合計を追加することができます。 Max said同様

n_total <- 1e9 
n_chunk <- 1e6 
n_iter <- n_total/n_chunk 
my_prob = c(0.2, 0.3, 0.5) 
totals <- numeric(3) 
for(i in seq_len(n_iter)) 
{ 
    totals <- totals + table(sample(0:2, n_chunk, replace = TRUE, prob = my_prob)) 
} 
totals 
stopifnot(sum(totals) == n_total) 

、あなたは、サンプルの上にrmultinomを好むかもしれません。変数experimentsrowSumsを取得してください。

関連する問題