サンプリングされた重複および一意の頻度から母集団サイズを推定する


14

ランダムなアイテムに関する情報を要求できるWebサービスがあります。リクエストごとに、各アイテムが返される可能性が等しくなります。

アイテムをリクエストし続け、重複の数と一意の数を記録できます。このデータを使用してアイテムの総数を推定するにはどうすればよいですか?


2
推定するのはサンプルサイズではなく、母集団のサイズ(Webサービスによって返される一意のアイテムの総数)です。
-GaBorgulya

回答:


8

これは、本質的にクーポンコレクターの問題の変形です。

合計でnアイテムがあり、置換でサンプルサイズsを取得した場合、u一意のアイテムを識別する確率は ここで、S2su第2種のスターリング数を与えます

Pr(U=u|n,s)=S2(s,u)n!(nu)!ns
S2(s,u)

ここで必要なのは、事前分布であり、ベイズの定理を適用し、Nの事後分布を取得します。Pr(N=n)N


これは、アイテムが2、3、4、...回観測された頻度を考慮していないため、一部の情報が失われているように見えます。
whuber

2
@whuber:情報を使用していないように見える場合がありますが、さらに調査すると、一意のアイテムの数が十分な統計値であることがわかります。たとえば、母集団から4つのアイテムを置き換えるサンプルを取得する場合、1つのアイテムが3つ、別のアイテムが1つ取得される確率は4です。n nに関係なく2つのアイテムをそれぞれ2つ取得するため、詳細な頻度を知っていても、サンプルで2つの一意のアイテムが見つかったことを知るよりも母集団に関する有用な情報は得られません。43n
ヘンリー

ユニークなアイテムの数の十分性に関する興味深い点。そのため、周波数は(独立性と等確率の)仮定のチェックとして機能しますが、それ以外の場合は不要です。
whuber

5

私はすでに、第2種のスターリング数とベイジアン法に基づいた提案を行っています。

スターリング数が大きすぎる、またはベイジアン法が難しすぎると感じる人のために、より大まかな方法​​を使用することができます

E[U|n,s]=n(1(11n)s)

var[U|n,s]=n(11n)s+n2(11n)(12n)sn2(11n)2s

数値的手法を使用して逆計算します。

例えば、とGaBorgulyaの例を取って と観測されたU = 265、これは私たちの見積もり与えるかもしれないのn1180人口のために。s=300U=265n^1180

それが母集団だった場合、の分散は約25になり、265の両側の任意の2つの標準偏差は約255と275になります(私が言ったように、これは大まかな方法​​です)。255は約895のnの推定値を与え、275は約1692を与えます。例の1000はこの間隔内で快適です。 Un


1
(1)ノートにそれの面白い、もし比は非常に小さい、その後、本質的に関する情報であるnが存在しないとすることができます一つは推定非常によく行うことを期待することはできませんので、nと。もし、S / Nが非常に大きいですそしてUは良い推定量です。そのため、ミッドレンジで機能するものが必要です。s/nnns/nU
枢機

また、ここで、F KX = Σ kはiは= 0、X I / I e xk次のテイラー級数近似です。k =の使用1(11/n)s(1fk(s/n))/fk(s/n)fk(x)=i=0kxi/i!kex推定を与えるN = k=1。smallsの連続性補正は、分母に定数(1など)を追加することで取得できます。数値的に解くために、この推定は、たとえばとしてうまくやっていないのnあなたがやったとしても、。n~=ssUUsn^
枢機

3

Rcapture Rパッケージとしても実装されいるcapture-recaptureメソッドを使用できます


Rでコーディングされた例を次に示します。WebサービスにN = 1000のアイテムがあると仮定します。n = 300のリクエストを行います。ランダムサンプルを生成します。1からkまでの要素に番号を付けます。ここで、kは見たアイテムの数です。

N = 1000; population = 1:N # create a population of the integers from 1 to 1000
n = 300 # number of requests
set.seed(20110406)
observation = as.numeric(factor(sample(population, size=n,
  replace=TRUE))) # a random sample from the population, renumbered
table(observation) # a table useful to see, not discussed
k = length(unique(observation)) # number of unique items seen
(t = table(table(observation)))

シミュレーションの結果は

  1   2   3 
234  27   4 

したがって、300件のリクエストのうち、4回は3回、27回は2回、234回は1回しか表示されませんでした。

次に、このサンプルからNを推定します。

require(Rcapture)
X = data.frame(t)
X[,1]=as.numeric(X[,1])
desc=descriptive(X, dfreq=TRUE, dtype="nbcap", t=300)
desc # useful to see, not discussed
plot(desc) # useful to see, not discussed
cp=closedp.0(X, dfreq=TRUE, dtype="nbcap", t=300, trace=TRUE)
cp

結果:

Number of captured units: 265 

Abundance estimations and model fits:
                  abundance       stderr      deviance   df           AIC
M0**                  265.0          0.0  2.297787e+39  298  2.297787e+39
Mh Chao              1262.7        232.5  7.840000e-01    9  5.984840e+02
Mh Poisson2**         265.0          0.0  2.977883e+38  297  2.977883e+38
Mh Darroch**          553.9         37.1  7.299900e+01  297  9.469900e+01
Mh Gamma3.5**  5644623606.6  375581044.0  5.821861e+05  297  5.822078e+05

 ** : The M0 model did not converge
 ** : The Mh Poisson2 model did not converge
 ** : The Mh Darroch model did not converge
 ** : The Mh Gamma3.5 model did not converge
Note: 9 eta parameters has been set to zero in the Mh Chao model

したがって、唯一のMhチャオモデルが収束し、それは推定N = 1262.7を。 N^


編集:上記の方法の信頼性を確認するために、10000生成されたサンプルで上記のコードを実行しました。Mh Chaoモデルは毎回収束しました。概要は次のとおりです。

> round(quantile(Nhat, c(0, 0.025, 0.25, 0.50, 0.75, 0.975, 1)), 1)
    0%   2.5%    25%    50%    75%  97.5%   100% 
 657.2  794.6  941.1 1034.0 1144.8 1445.2 2162.0 
> mean(Nhat)
[1] 1055.855
> sd(Nhat)
[1] 166.8352

これは標準的なキャプチャ再キャプチャ実験ではないため、キャプチャ再キャプチャモデルの使用には何らかの正当化が必要と思われます。(おそらく300のキャプチャイベントとして表示できますが、closedpの呼び出しはそれを示していないようです。)
whuber

@whuberはい、サンプルを300のキャプチャイベントとして表示しました。「closedpの呼び出しがそれを示していないように見える」とはどういう意味ですか?(建設的な)批判に感謝し、間違っていることが判明した場合は回答を修正(または必要に応じて削除)させていただきます。
-GaBorgulya

これは合理的なアプローチのようです。しかし、私はRを使用しないので、その背後にある数学を理解する必要があります。wikiページには2つのイベントの状況が記載されています-このケースにどのように適用しますか?
-hoju

1
@Gaなるほど:データ用に300 x 300のマトリックスを作成しました!このコードの非効率性は私をだましました: `closedp.0(Y、dfreq = TRUE、dtype =" nbcap "、t = 300) 'を使用する方が簡単で、より直接的です{2,27}、{3,4}}(2回計算して実際に表示しました!)。要するに、収束の失敗は警告的であり、基礎となるコードまたはモデルに問題があることを示唆しています。(「M0」のドキュメントを徹底的に検索しても、このメソッドの参照や説明はありません...)
whuber

1
@whuberあなたの提案に従ってコードを簡略化しました(dfreq = TRUE、dtype = "nbcap"、t = 300)。再度、感謝します。
-GaBorgulya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.