从抽样重复样本和唯一样本的频率估算人口规模


14

有一个Web服务,我可以在其中请求有关随机物品的信息。对于每个请求,每个项目都有相等的机会被退回。

我可以继续请求商品,并记录重复的商品和唯一商品的数量。如何使用此数据来估算项目总数?


2
您要估计的不是样本数量,而是总体数量(网络服务返回的唯一项目总数)。
GaBorgulya 2011年

Answers:


8

这本质上是优惠券收集者问题的变体。

如果总共有项目,并且您抽样了个样本并进行了替换,那么识别出唯一项目的概率为 其中给出第二类斯特林数s u P r U = u | n s = S 2s u n nsu S2su

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

现在,您需要的是的先验分布,应用贝叶斯定理,并获得的后验分布。NPr(N=n)N


这似乎丢失了一些信息,因为它没有说明观察项目2、3、4,...次的频率
whuber

2
@whuber:似乎没有使用该信息,但是如果您进一步调查,您应该发现唯一项目的数量已经足够了。例如,如果您从个种群中替换了4个样本,则得到一个样本中的3个和另一个项目中的1的概率为,而两个项目中的每一个都得到2,则没有不管是多少,所以知道详细的频率不会提供比简单地知道在样本中找到两个唯一项有关的总体信息。4n n43n
亨利

关于唯一项数量足够的有趣之处。因此,频率可以作为对假设(独立性和均等概率)的检验,但是在其他方面则是不必要的。
ub

5

我已经根据第二类斯特林数和贝叶斯方法给出了建议。

对于那些发现斯特林数太大或贝叶斯方法太困难的人,可以使用更粗略的方法

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

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

然后使用数值方法反算。

例如,以GaBorgulya的 且观察到的为例 ,这可能为我们提供了的估计值。s=300U=265n^1180

如果那是人口总数,那么它会给我们带来大约25的方差,而265两侧的任意两个标准差将分别为255和275(如我所说,这是一种粗略的方法)。255将给我们大约895的估计值,而275将给我们大约1692的估计值。示例的1000恰好在此间隔内。 Un


1
(+1)有趣的是,如果比率非常小,那么基本上就没有关于信息,因此不能期望对进行很好的估计。如果很大,则是一个很好的估计。因此,我们需要一些在中端工作的产品。s/nnns/nU
主教

也是其中,是第阶泰勒级数逼近。使用给出了一个估计器。可以通过在分母中添加常数(如1)来获得小连续性校正。但是,此估算器在示例中的效果不如在数值上求解那样好。1(11/n)s(1fk(s/n))/fk(s/n)fk(x)=i=0kxi/i!kexk=1小号 ñn~=ssUUsn^
主教

3

您可以使用capture-recapture方法该方法也作为Rcapture R包实现


这是一个用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个项目被查看了两次,234个项目仅被查看了一次。

现在从该样本中估计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 Chao模型收敛,它估计 = 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 2011年

这似乎是一种合理的方法。但是,我不会使用R,因此需要了解其背后的数学原理。Wiki页面涵盖2种事件情况-如何将其应用于这种情况?
hoju 2011年

1
@Ga我明白了:您为数据创建了300 x 300矩阵!这段代码的低效率使我感到困惑:使用`closedp.0(Y,dfreq = TRUE,dtype =“ nbcap”,t = 300)会更简单直接,其中Y是频率矩阵{{1,234}, {2,27},{3,4}}(您两次计算并实际显示!)。更重要的是,收敛失败令人震惊,这表明底层代码或模型存在问题。(对“ M0” 的文档进行详尽搜索后,找不到该方法的任何引用或描述...)
whuber

1
@whuber我按照您的建议简化了代码(dfreq = TRUE,dtype =“ nbcap”,t = 300)。再次感谢。
GaBorgulya 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.