Stima della dimensione della popolazione dalla frequenza dei duplicati e dei dati unici campionati


14

Esiste un servizio web in cui posso richiedere informazioni su un oggetto casuale. Per ogni richiesta ogni articolo ha le stesse possibilità di essere restituito.

Posso continuare a richiedere articoli e registrare il numero di duplicati e unici. Come posso utilizzare questi dati per stimare il numero totale di articoli?


2
Quello che vuoi stimare non è una dimensione del campione, ma la dimensione di una popolazione (numero totale di elementi unici restituiti dal webercerc).
GaBorgulya,

Risposte:


8

Questa è essenzialmente una variante del problema del collezionista di coupon.

Se ci sono articoli in totale e hai preso una dimensione del campione s con la sostituzione, allora la probabilità di aver identificato u articoli unici è P r ( U = u | n , s ) = S 2 ( s , u ) n !nsu doveS2(s,u)forniscenumeri Stirling del secondo tipo

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

Ora tutto ciò che serve è una distribuzione a priori per la , applicare il teorema di Bayes, e ottenere una distribuzione a posteriori per N .Pr(N=n)N


Questo sembra perdere alcune informazioni perché non tiene conto delle frequenze con cui gli oggetti sono stati osservati 2, 3, 4, ... volte.
whuber

2
@whuber: Potrebbe sembrare che non si utilizzino le informazioni, ma se si indagano ulteriormente si dovrebbe scoprire che il numero di elementi unici è una statistica sufficiente. Ad esempio, se si preleva un campione con la sostituzione di 4 oggetti da una popolazione di , la probabilità di ottenere 3 di un oggetto e 1 di un altro è 4n quello di ottenere 2 ciascuno dei due elementi, non importa quale sian, quindi conoscere le frequenze dettagliate non fornisce più informazioni utili sulla popolazione del semplice sapere che c'erano due elementi unici trovati nel campione. 43n
Henry,

Punto interessante sulla sufficienza del numero di elementi unici. Quindi le frequenze possono servire da controllo delle ipotesi (di indipendenza e pari probabilità), ma per il resto non sono necessarie.
whuber

5

Ho già dato un suggerimento basato sui numeri di Stirling del secondo tipo e sui metodi bayesiani.

Per coloro che trovano numeri di Stirling troppo grandi o metodi bayesiani troppo difficili, potrebbe essere un metodo più ruvido

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

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

e calcola indietro usando metodi numerici.

Ad esempio, prendendo l'esempio di GaBorgulya con e un osservatos=300, questo potrebbe darci una stima diU=265per la popolazione.n^1180

Se quella fosse stata la popolazione, allora ci avrebbe dato una varianza per U di circa 25, e una arbitraria due deviazioni standard su entrambi i lati di 265 sarebbe di circa 255 e 275 (come ho detto, questo è un metodo approssimativo). 255 ci avrebbe fornito una stima per circa 895, mentre 275 ci avrebbe dato circa 1692. L'esempio 1000 è comodamente all'interno di questo intervallo. n


1
(+1) È interessante notare che se il rapporto è molto piccolo, in sostanza nessuna informazione su n può essere presente e quindi non ci si può aspettare di fare molto bene stimando n . Se s / n è molto grande, allora U è un buon stimatore. Quindi, abbiamo bisogno di qualcosa che funzioni a medio raggio. S/nnnS/nU
cardinale

1-(1-1/n)S(1-fk(s/n))/fk(s/n)fk(x)=i=0kxi/i!kexk=1n~=SS-UUSn^

3

È possibile utilizzare il metodo di cattura-ricattura , implementato anche come il pacchetto Rcapture R .


Ecco un esempio, codificato in R. Supponiamo che il servizio web abbia N = 1000 articoli. Faremo n = 300 richieste. Genera un campione casuale in cui, numerando gli elementi da 1 a k, dove k è quanti elementi diversi abbiamo visto.

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

Il risultato della simulazione è

  1   2   3 
234  27   4 

quindi tra le 300 richieste c'erano 4 oggetti visti 3 volte, 27 oggetti visti due volte e 234 oggetti visti una sola volta.

Ora stimare N da questo esempio:

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

Il risultato:

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

N^ = 1262,7.


EDIT: per verificare l'affidabilità del metodo sopra ho eseguito il codice sopra su 10000 campioni generati. Il modello Mh Chao convergeva ogni volta. Ecco il riassunto:

> 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

Sembra che sia necessaria una giustificazione per l'uso di modelli di acquisizione-ripresa, poiché non si tratta di un esperimento standard di acquisizione e ripresa. (Probabilmente può essere visto come 300 eventi di acquisizione, ma la chiamata a closedp non sembra indicarlo.)
whuber

@whuber Sì, ho visto l'esempio come 300 eventi di acquisizione. Come intendi che "la chiamata a closedp non sembra indicarlo"? Apprezzo le critiche (costruttive) e sono felice di correggere (o cancellare se necessario) la mia risposta se risulta essere sbagliata.
GaBorgulya,

questo sembra un approccio ragionevole. Tuttavia non userò R, quindi ho bisogno di capire la matematica dietro di esso. La pagina wiki copre una situazione di 2 eventi: come posso applicarlo a questo caso?
hoju,

1
@Ga vedo: hai creato una matrice 300 x 300 per i dati! L'inefficienza di questo codice mi ha ingannato: sarebbe più semplice e diretto usare `closedp.0 (Y, dfreq = TRUE, dtype =" nbcap ", t = 300) 'dove Y è la matrice di frequenza {{1,234}, {2,27}, {3,4}} (che hai calcolato due volte e effettivamente visualizzato!). Più precisamente, i fallimenti della convergenza sono allarmanti, suggerendo che ci sono problemi con il codice o i modelli sottostanti. (Una ricerca esaustiva dei documenti per "M0" non presenta riferimenti o descrizioni per questo metodo ...)
whuber

1
@whuber Ho semplificato il codice seguendo il tuo suggerimento (dfreq = TRUE, dtype = "nbcap", t = 300). Grazie ancora.
GaBorgulya,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.