Оценка численности населения по частоте выборки дубликатов и уникальных

14

Есть веб-сервис, где я могу запросить информацию о случайном предмете. Для каждого запроса каждый элемент имеет равные шансы на возврат.

Я могу продолжать запрашивать предметы и записывать количество дубликатов и уникальных. Как я могу использовать эти данные для оценки общего количества товаров?

hoju
источник
2
Вы хотите оценить не размер выборки, а размер совокупности (общее количество уникальных элементов, возвращаемых веб-сервисом).
ГаБоргуля

Ответы:

8

По сути, это вариант проблемы со сборщиком купонов.

Если всего элементов и вы взяли размер выборки s с заменой, то вероятность идентификации u уникальных элементов равна P r ( U = u | n , s ) = S 2 ( s , u ) n !nsu гдеS2(s,u)даетчисла Стирлинга второго рода

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 предметов из популяции , вероятность получить 3 из одного предмета и 1 из другого составляет 4n это получение 2 каждого из двух предметов, независимо от того, чтоn, поэтому знание подробных частот не дает более полезной информации о населении, чем простое знание, что в выборке были обнаружены два уникальных предмета. 43n
Генри
Интересный момент о достаточности количества уникальных предметов. Таким образом, частоты могут служить проверкой допущений (независимости и равной вероятности), но в противном случае они не нужны.
whuber
5

Я уже дал предложение, основанное на числах Стирлинга второго рода и методах Байеса.

Для тех, кто считает числа Стерлинга слишком большими или байесовские методы слишком сложными, можно использовать более грубый метод

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

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

и обратный расчет с использованием численных методов.

Например, взяв пример ГаБоргуля с и наблюдаемым Us=300 , это может дать нам оценку п1180 для населения.U=265n^1180

Если бы это была совокупность, то это дало бы нам дисперсию для около 25, а произвольные два стандартных отклонения по обе стороны от 265 были бы около 255 и 275 (как я уже сказал, это грубый метод). 255 дало бы нам оценку для n около 895, а 275 дало бы около 1692. Пример 1000 удобно лежит в этом интервале. Un

Генри
источник
1
s/nnns/nU
1(11/n)s(1fk(s/n))/fk(s/n)fk(x)=i=0kxi/i!kexk=1n~=ssUU. A continuity correction for small s can be obtained by adding a constant (like 1) in the denominator. This estimator doesn't do as well for the example as numerically solving for n^ as you've done, though.
cardinal
3

You can use the capture-recapture method, also implemented as the Rcapture R package.


Here is an example, coded in R. Let's assume that the web service has N=1000 items. We will make n=300 requests. Generate a random sample where, numbering the elements from 1 to k, where k is how many different items we saw.

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)))

The result of the simulation is

  1   2   3 
234  27   4 

thus among the 300 requests there were 4 items seen 3 times, 27 items seen twice, and 234 items seen only once.

Now estimate N from this sample:

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

The result:

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

Thus only the Mh Chao model converged, it estimated N^=1262.7.


EDIT: To check the reliability of the above method I ran the above code on 10000 generated samples. The Mh Chao model converged every time. Here is the summary:

> 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
GaBorgulya
источник
It seems some justification for the use of capture-recapture models is needed, because this is not a standard capture-recapture experiment. (Possibly it can be viewed as 300 capture events, but the call to closedp does not seem to indicate that.)
whuber
@whuber Yes, I did view the example as 300 capture events. How do you mean that "the call to closedp does not seem to indicate that"? I appreciate (constructive) criticism and I'm happy to correct (or delete if necessary) my answer if it turns out to be wrong.
GaBorgulya
this seems a reasonable approach. However I won't be using R so need to understand the maths behind it. The wiki page covers a 2 event situation - how do I apply it to this case?
hoju
1
@Ga I see: You created a 300 x 300 matrix for the data! The inefficiency of this code fooled me: it would be simpler and more direct to use `closedp.0(Y, dfreq=TRUE, dtype="nbcap", t=300)' where Y is the frequency matrix {{1,234}, {2,27}, {3,4}} (which you computed twice and actually displayed!). More to the point, the convergence failures are alarming, suggesting there are problems with the underlying code or models. (An exhaustive search of the docs for "M0" turns up no references or description for this method...)
whuber
1
@whuber I simplified the code following your suggestion (dfreq=TRUE, dtype="nbcap", t=300). Thanks again.
GaBorgulya