Estimation de la taille de la population à partir de la fréquence des doublons et uniques échantillonnés

14

Il existe un service Web où je peux demander des informations sur un élément aléatoire. Pour chaque demande, chaque article a une chance égale d'être retourné.

Je peux continuer à demander des articles et enregistrer le nombre de doublons et uniques. Comment puis-je utiliser ces données pour estimer le nombre total d'articles?

hoju
la source
2
Ce que vous voulez estimer n'est pas une taille d'échantillon, mais la taille d'une population (nombre total d'articles uniques retournés par le service Web).
GaBorgulya

Réponses:

8

Il s'agit essentiellement d'une variante du problème du collecteur de coupons.

S'il y a éléments au total et que vous avez pris une taille d'échantillon s avec remplacement, la probabilité d'avoir identifié u éléments uniques est P r ( U = u | n , s ) = S 2 ( s , u ) n !nsuS2(s,u)donne desnombres de Stirling du second type

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

Maintenant , tout ce dont vous avez besoin est une distribution préalable , appliquer le théorème de Bayes, et obtenir une distribution postérieure pour N .Pr(N=n)N

Henri
la source
Cela semble perdre certaines informations car il ne tient pas compte des fréquences avec lesquelles les éléments ont été observés 2, 3, 4, ... fois.
whuber
2
@whuber: Il peut sembler ne pas utiliser les informations, mais si vous étudiez plus avant, vous devriez constater que le nombre d'articles uniques est une statistique suffisante. Par exemple, si vous prenez un échantillon avec remplacement de 4 éléments d'une population de , la probabilité d'obtenir 3 d'un élément et 1 d'un autre est de 4n celle d'obtenir 2 chacun des deux éléments, quel que soitn, donc connaître les fréquences détaillées ne donne pas plus d'informations utiles sur la population que de simplement savoir que deux éléments uniques ont été trouvés dans l'échantillon. 43n
Henry
Point intéressant sur la suffisance du nombre d'articles uniques. Les fréquences peuvent donc servir de contrôle sur les hypothèses (d'indépendance et d'égalité de probabilité), mais sinon, elles ne sont pas nécessaires.
whuber
5

J'ai déjà donné une suggestion basée sur les nombres de Stirling du deuxième type et les méthodes bayésiennes.

Pour ceux qui trouvent les nombres de Stirling trop grands ou les méthodes bayésiennes trop difficiles, une méthode plus grossière pourrait être d'utiliser

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

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

et recalculer en utilisant des méthodes numériques.

Par exemple, en prenant l'exemple de GaBorgulya avec et un observé U = 265 , cela pourrait nous donner une estimation de n1180 pour la population.s=300U=265n^1180

Si cela avait été la population, cela nous aurait donné une variance pour d'environ 25, et deux écarts types arbitraires de chaque côté de 265 seraient d'environ 255 et 275 (comme je l'ai dit, c'est une méthode approximative). 255 nous aurait donné une estimation pour n environ 895, tandis que 275 aurait donné environ 1692. L'exemple 1000 est confortablement dans cet intervalle. Un

Henri
la source
1
(+1) Il est intéressant de noter que si le rapport est très petit, alors essentiellement aucune information sur n ne peut être présente et donc on ne peut pas s'attendre à très bien estimer n . Si s / n est très grand, U est un bon estimateur. Nous avons donc besoin de quelque chose qui fonctionne dans un milieu de gamme. s/nnns/nU
Cardinal
Aussi f k ( x ) = k i = 0 x i / i ! est l' approximation de k série d'ordre Taylor à e x . En utilisant k =1(1-1/n)s(1-Fk(s/n))/Fk(s/n)Fk(X)=je=0kXje/je!keX donne un estimateur ˜ n = sk=1. Une correction de continuité pour les petitsspeut être obtenue en ajoutant une constante (comme 1) dans le dénominateur. Cet estimateur ne fait pas aussi bien pour l'exemple querésolution numérique pour n que vous avez fait, cependant. n~=ss-UUsn^
Cardinal
3

Vous pouvez utiliser la méthode de capture-recapture , également mis en œuvre comme le paquet Rcapture R .


Voici un exemple, codé en R. Supposons que le service Web a N = 1000 éléments. Nous ferons n = 300 demandes. Générez un échantillon aléatoire où, en numérotant les éléments de 1 à k, où k est le nombre d'éléments différents que nous avons vus.

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

Le résultat de la simulation est

  1   2   3 
234  27   4 

ainsi, parmi les 300 demandes, 4 éléments ont été vus 3 fois, 27 éléments vus deux fois et 234 éléments vus une seule fois.

Maintenant, estimez N à partir de cet échantillon:

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

Le résultat:

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

Ainsi , seul le modèle Mh Chao a convergé, on estime N = 1262,7. N^


EDIT: Pour vérifier la fiabilité de la méthode ci-dessus, j'ai exécuté le code ci-dessus sur 10000 échantillons générés. Le modèle Mh Chao convergeait à chaque fois. Voici le résumé:

> 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
la source
Il semble qu'une justification de l'utilisation des modèles de capture-recapture soit nécessaire, car il ne s'agit pas d'une expérience standard de capture-recapture. (Peut-être que cela peut être considéré comme 300 événements de capture, mais l'appel à closedp ne semble pas l'indiquer.)
whuber
@whuber Oui, j'ai vu l'exemple comme 300 événements de capture. Comment voulez-vous dire que "l'appel à closedp ne semble pas indiquer cela"? J'apprécie les critiques (constructives) et je suis heureux de corriger (ou de supprimer si nécessaire) ma réponse si elle s'avère erronée.
GaBorgulya
cela semble une approche raisonnable. Cependant, je n'utiliserai pas R, j'ai donc besoin de comprendre les mathématiques derrière. La page wiki couvre une situation à 2 événements - comment l'appliquer à ce cas?
hoju
1
@Ga Je vois: vous avez créé une matrice 300 x 300 pour les données! L'inefficacité de ce code m'a dupé: il serait plus simple et plus direct d'utiliser `closedp.0 (Y, dfreq = TRUE, dtype =" nbcap ", t = 300) 'où Y est la matrice de fréquence {{1,234}, {2,27}, {3,4}} (que vous avez calculé deux fois et réellement affiché!). Plus précisément, les échecs de convergence sont alarmants, suggérant qu'il y a des problèmes avec le code ou les modèles sous-jacents. (Une recherche exhaustive des documents pour "M0" ne révèle aucune référence ou description pour cette méthode ...)
whuber
1
@whuber J'ai simplifié le code suite à votre suggestion (dfreq = TRUE, dtype = "nbcap", t = 300). Merci encore.
GaBorgulya