Estimación del tamaño de la población a partir de la frecuencia de duplicados y únicos muestreados

14

Hay un servicio web donde puedo solicitar información sobre un artículo aleatorio. Por cada solicitud, cada artículo tiene la misma probabilidad de ser devuelto.

Puedo seguir solicitando artículos y registrar el número de duplicados y únicos. ¿Cómo puedo usar estos datos para estimar el número total de artículos?

hoju
fuente
2
Lo que desea estimar no es un tamaño de muestra, sino el tamaño de una población (número total de elementos únicos devueltos por el servicio web).
GaBorgulya

Respuestas:

8

Esto es esencialmente una variante del problema del colector de cupones.

Si hay ítems en total y ha tomado un tamaño de muestra s con reemplazo, entonces la probabilidad de haber identificado u ítems únicos es P r ( U = u | n , s ) = S 2 ( s , u ) n !nsu dondeS2(s,u)da

Pr(U=u|n,s)=S2(s,u)n!(nu)!ns
S2(s,u) números de Stirling del segundo tipo

Ahora todo lo que necesita es una distribución previa para , aplicar el teorema de Bayes, y obtener una distribución posterior de N .Pr(N=n)N

Enrique
fuente
Esto parece perder algo de información porque no tiene en cuenta las frecuencias con las que se observaron los elementos 2, 3, 4, ... veces.
whuber
2
@whuber: Puede parecer que no utiliza la información, pero si investiga más, debería encontrar que la cantidad de elementos únicos es una estadística suficiente. Por ejemplo, si toma una muestra con reemplazo de 4 ítems de una población de , la probabilidad de obtener 3 de un ítem y 1 de otro es 4n el de obtener 2 cada uno de los dos elementos, sin importar cuál sean, por lo que conocer las frecuencias detalladas no proporciona más información útil sobre la población que simplemente saber que se encontraron dos elementos únicos en la muestra. 43n
Henry
Punto interesante sobre la suficiencia de la cantidad de artículos únicos. Por lo tanto, las frecuencias pueden servir como un control de los supuestos (de independencia e igual probabilidad), pero de lo contrario son innecesarios.
whuber
5

Ya he dado una sugerencia basada en los números de Stirling del segundo tipo y los métodos bayesianos.

Para aquellos que consideran que los números de Stirling son demasiado grandes o que los métodos bayesianos son demasiado difíciles, un método más difícil podría ser utilizar

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

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

y volver a calcular utilizando métodos numéricos.

s=300U=265n^1180 para la población.

Unorte alrededor de 895, mientras que 275 habrían dado alrededor de 1692. El ejemplo de 1000 es cómodamente dentro de este intervalo.

Enrique
fuente
1
(+1) Es interesante notar que si la relación s/ /norte is very small then essentially no information about n can be present and so one can't expect to do very well estimating n. If s/n is very large then U is a good estimator. So, we need something that works in a mid-range.
cardinal
Also 1(11/n)s(1fk(s/n))/fk(s/n) where fk(x)=i=0kxi/i! is the kth-order Taylor series approximation to ex. Using k=1 da un estimador norte~=ss-UU. Una corrección de continuidad para pequeñossse puede obtener agregando una constante (como 1) en el denominador. Este estimador no funciona tan bien para el ejemplo como resolver numéricamente paranorte^como lo has hecho, sin embargo.
cardenal
3

Se puede utilizar el método de captura-recaptura , también implementado como el paquete Rcapture R .


Aquí hay un ejemplo, codificado en R. Supongamos que el servicio web tiene N = 1000 elementos. Haremos n = 300 solicitudes. Genere una muestra aleatoria donde, numerando los elementos del 1 al k, donde k es cuántos elementos diferentes vimos.

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

El resultado de la simulación es

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