Aggiornamento : 7 aprile 2011 Questa risposta sta diventando piuttosto lunga e copre molteplici aspetti del problema. Tuttavia, finora ho resistito, suddividendolo in risposte separate.
In fondo ho aggiunto una discussione sull'esecuzione di di Pearson per questo esempio.χ2
Bruce M. Hill ha scritto, forse, il documento "seminale" sulla stima in un contesto simile a Zipf. Ha scritto diversi articoli a metà degli anni '70 sull'argomento. Tuttavia, lo "stimatore di Hill" (come viene ora chiamato) si basa essenzialmente sulle statistiche di ordine massimo del campione e quindi, a seconda del tipo di troncamento presente, ciò potrebbe causare problemi.
Il documento principale è:
BM Hill, Un semplice approccio generale all'inferenza sulla coda di una distribuzione , Ann. Statistica. , 1975.
Se i tuoi dati sono inizialmente Zipf e vengono poi troncati, allora una buona corrispondenza tra la distribuzione dei gradi e la trama Zipf può essere sfruttata a tuo vantaggio.
In particolare, la distribuzione dei gradi è semplicemente la distribuzione empirica del numero di volte in cui viene vista ogni risposta intera,
di=#{j:Xj=i}n.
Se lo tracciamo contro su un diagramma log-log, otterremo una tendenza lineare con una pendenza corrispondente al coefficiente di ridimensionamento.i
D'altra parte, se tracciamo il diagramma Zipf , dove ordiniamo il campione dal più grande al più piccolo e quindi tracciamo i valori rispetto ai loro ranghi, otteniamo una diversa tendenza lineare con una diversa pendenza. Tuttavia le piste sono correlate.
Se è il coefficiente di legge di ridimensionamento per la distribuzione Zipf, la pendenza nel primo diagramma è e la pendenza nel secondo diagramma è . Di seguito è riportato un esempio di trama per e . Il riquadro di sinistra è la distribuzione dei gradi e la pendenza della linea rossa è . Il lato destro è il diagramma Zipf, con la linea rossa sovrapposta con una pendenza di .α−α−1/(α−1)α=2n=106−2−1/(2−1)=−1
Quindi, se i tuoi dati sono stati troncati in modo da non vedere valori più grandi di qualche soglia , ma i dati sono altrimenti distribuiti da Zipf e è ragionevolmente grande, allora puoi stimare dalla distribuzione dei gradi . Un approccio molto semplice consiste nell'adattare una linea al diagramma log-log e utilizzare il coefficiente corrispondente.ττα
Se i tuoi dati vengono troncati in modo da non visualizzare piccoli valori (ad esempio, il modo in cui viene filtrato molto per i set di dati Web di grandi dimensioni), puoi utilizzare il grafico Zipf per stimare la pendenza su una scala del log-log e quindi " indietro "l'esponente di ridimensionamento. Supponi che la tua stima della pendenza dal grafico Zipf sia . Quindi, una semplice stima del coefficiente della legge di ridimensionamento è
β^
α^=1−1β^.
@csgillespie ha pubblicato un recente articolo scritto da Mark Newman al Michigan su questo argomento. Sembra pubblicare molti articoli simili su questo. Di seguito è riportato un altro insieme a un paio di altri riferimenti che potrebbero essere di interesse. Newman a volte non fa statisticamente la cosa più sensata, quindi sii cauto.
MEJ Newman, Leggi del potere, distribuzioni di Pareto e legge di Zipf , Contemporary Physics 46, 2005, pp. 323-351.
M. Mitzenmacher, una breve storia di modelli generativi per la legge del potere e le distribuzioni lognormali , matematica per Internet. , vol. 1, n. 2, 2003, pagg. 226-251.
K. Knight, Una semplice modifica dello stimatore di Hill con applicazioni per la robustezza e la riduzione della distorsione , 2010.
Addendum :
Ecco una semplice simulazione in per dimostrare cosa potresti aspettarti se prendessi un campione di dimensioni dalla tua distribuzione (come descritto nel tuo commento sotto la domanda originale).R105
> x <- (1:500)^(-0.9)
> p <- x / sum(x)
> y <- sample(length(p), size=100000, repl=TRUE, prob=p)
> tab <- table(y)
> plot( 1:500, tab/sum(tab), log="xy", pch=20,
main="'Truncated' Zipf simulation (truncated at i=500)",
xlab="Response", ylab="Probability" )
> lines(p, col="red", lwd=2)
La trama risultante è
Dalla trama, possiamo vedere che l'errore relativo della distribuzione dei gradi per (o giù di lì) è molto buono. Si potrebbe fare un test formale chi-quadrato, ma questo non è strettamente dire che i dati seguono la distribuzione di pre-specificato. Ti dice solo che non hai prove per concludere che non lo fanno .i≤30
Tuttavia, da un punto di vista pratico, tale trama dovrebbe essere relativamente convincente.
Addendum 2 : consideriamo l'esempio che Maurizio usa nei suoi commenti qui sotto. Supponiamo che e , con una distribuzione Zipf troncata con valore massimo .n = 300α=2x m a x = 500n=300000xmax=500
Calcoleremo la statistica di Pearson in due modi. Il modo standard è tramite la statistica
dove è il conteggio osservato del valore nel campione e .X 2 = 500 ∑ i = 1 ( O i - E i ) 2χ2 OiiEi=npi=ni-α/∑ 500 j = 1 j-α
X2=∑i=1500(Oi−Ei)2Ei
OiiEi=npi=ni−α/∑500j=1j−α
Calcoleremo anche una seconda statistica formata dal primo binning dei conteggi in contenitori di dimensioni 40, come mostrato nel foglio di calcolo di Maurizio (l'ultimo cestino contiene solo la somma di venti valori di risultato separati.
Tracciamo 5000 campioni separati di dimensione da questa distribuzione e calcoliamo i valori usando queste due diverse statistiche.pnp
Gli istogrammi dei valori sono al di sotto e sono considerati abbastanza uniformi. I tassi di errore empirici di tipo I sono 0,0716 (standard, metodo non ancorato) e 0,0502 (metodo binnato), rispettivamente e nessuno dei due è statisticamente significativamente diverso dal valore di 0,05 target per la dimensione del campione di 5000 che abbiamo scelto.p
Ecco il codiceR
# Chi-square testing of the truncated Zipf.
a <- 2
n <- 300000
xmax <- 500
nreps <- 5000
zipf.chisq.test <- function(n, a=0.9, xmax=500, bin.size = 40)
{
# Make the probability vector
x <- (1:xmax)^(-a)
p <- x / sum(x)
# Do the sampling
y <- sample(length(p), size=n, repl=TRUE, prob=p)
# Use tabulate, NOT table!
tab <- tabulate(y,xmax)
# unbinned chi-square stat and p-value
discrepancy <- (tab-n*p)^2/(n*p)
chi.stat <- sum(discrepancy)
p.val <- pchisq(chi.stat, df=xmax-1, lower.tail = FALSE)
# binned chi-square stat and p-value
bins <- seq(bin.size,xmax,by=bin.size)
if( bins[length(bins)] != xmax )
bins <- c(bins, xmax)
tab.bin <- cumsum(tab)[bins]
tab.bin <- c(tab.bin[1], diff(tab.bin))
prob.bin <- cumsum(p)[bins]
prob.bin <- c(prob.bin[1], diff(prob.bin))
disc.bin <- (tab.bin - n*prob.bin)^2/(n * prob.bin)
chi.stat.bin <- sum(disc.bin)
p.val.bin <- pchisq(chi.stat.bin, df=length(tab.bin)-1, lower.tail = FALSE)
# Return the binned and unbineed p-values
c(p.val, p.val.bin, chi.stat, chi.stat.bin)
}
set.seed( .Random.seed[2] )
all <- replicate(nreps, zipf.chisq.test(n, a, xmax))
par(mfrow=c(2,1))
hist( all[1,], breaks=20, col="darkgrey", border="white",
main="Histogram of unbinned chi-square p-values", xlab="p-value")
hist( all[2,], breaks=20, col="darkgrey", border="white",
main="Histogram of binned chi-square p-values", xlab="p-value" )
type.one.error <- rowMeans( all[1:2,] < 0.05 )