1

観測されたビン数のヒストグラムがあります。観測されたカウントに基づいてシミュレーションを実行し、同じ数の観測がどのように異なって発生したかを確認したいと思います。観測されたカウントをベクトルの要素として、ヒストグラムをベクトルに変換します。rbinom(n, size, prob)ビンの頻度に基づく確率で(から) 二項分布から生成された乱数を使用して、各ビンをシミュレートします。

私の問題は、観測されたカウントがゼロのビンをシミュレートすることです。ビンのカウントがゼロの場合、prob=0 であるため、そのビンのシミュレートされたカウントは常にゼロです。これは非物理的であり、私が望むものではありません。現在、ビン カウント 0 をビン カウント 1 でオーバーライドすることで、この問題に対処しています。これの影響がよくわからないため、許容範囲を超えてシミュレーションにバイアスをかけているかどうかはわかりません。私は、アドホックな方法よりも優れた、またはより洗練された問題の解決策を探しています。

何か案は?ありがとうございました。

関連するコードは次のとおりです。

sim.vector <- function(x, n = length(x)) {
  sum.vector <- round(sum(x), 0)  # the number of observations
  x.dummy <- x
  x.dummy[x.dummy == 0] <- 1  # override bins with zero counts
  f <- x.dummy / sum(x) # the frequency of each bin
  x.sim <- rep(0, n)
  while(sum.vector != sum(x.sim)) {  # make sure the simulation has the same
                                     # number of total counts as the observation
    for (i in 1:n) {
      p.target <- f[i]  # set the probability of each bin to the frequency
      x.sim[i] <- rbinom(1, sum.vector, p.target)  # create a random binomial
    }
  }
  return(x.sim)
}
4

2 に答える 2

0

あなたがやろうとしていることは、ブートストラップによく似ています。ここでは、n個の値の配列から始める場合、その配列からランダムに選択されたn個の値を置換して取得します。お気づきのように、ブートストラップは、まだ持っていない値を提供しません。

ゼロビンを設定する方法はOKです。生態学者が使用する1つの手法は、ゼロ値を彼らが作ることができる最小の測定誤差に設定することです。たとえば、木を数える場合、最小の誤カウントは1になります。分布の平均値を維持することが重要な場合は、0から1に変更しても平均が大きくなりすぎないようにしてください。

もう1つのオプションは、ビンをパラメトリック分布に適合させることです。あなたの分野の人々は彼らが使用する典型的な分布を持っていますか、それともデータは分布を示唆していますか?それでもビンが必要な場合は、近似されたパラメトリック分布をビンに入れることができます。幸運を。

ビンカウントを生成するより速い方法は次のとおりです。

# you have three bins which we label 1,2,3
# change to 1:n where n = number of your bins
binIndex = 1:3
# you have 2 values in bin 1, 3 values in bin 2, 1 value in bin 3
count1 = c(2,3,1)

# create a vector with all bin labels
unbin = mapply(function(bin1,ct1){
    rep(bin1,times=ct1)
},binIndex,count1)

unbin = unlist(unbin)
print(unbin)

# generate "bootstrapBinCount" of bootstrapped bins
bootstrapBinCount = 10

# in general, use lapply instead of while/for loops in R - it's orders of magnitude faster
# newBins is a list of binCounts
# to access the first bin count, try newBins[[1]]
newBins = lapply(1:bootstrapBinCount,function(x){
    # generate a bootstrap from the list of bin labels by sampling with replacement
    bootstrap1 = sample(unbin, size=length(unbin), replace = TRUE)
    # count the number of times each bin label shows up
    rebin = table(bootstrap1)
    # get the names of the labels that showed up
    names1 = as.integer(names(rebin))
    # fill in the counts from rebin, but also include cases where there are no values     for a given bin label
    rebinPlusZeroes = rep(0,times=length(binIndex))
    rebinPlusZeroes[names1] = as.integer(rebin)

    return(rebinPlusZeroes)
})

print(str(newBins))
于 2012-04-24T17:41:04.417 に答える
0

頻度推定でゼロカウントに対処するこの問題は、スムージングと呼ばれることがあります (特に自然言語処理コミュニティでは、数千の「ビン」を扱うため、ゼロカウントが一般的です)。カウントを使用する代わりに、疑似カウントを使用します。

あなたがしていることに似た1つの簡単なアプローチは、ラプラスの「連続のルール」と呼ばれます:各ビンに1つ追加するだけです(ゼロだけではありません)。より一般的には、加算平滑化で別の数 (通常は 1 未満) を追加できます。ベイジアン的には、これは二項確率で事前ディリクレを使用することに対応します。

より洗練されたアプローチは、グッド チューリング スムージングです。

設定でより意味のあるデータの別の確率モデルがある場合は、それを使用することもできます (Eric が提案したように)。

于 2012-04-24T18:05:45.620 に答える