Actualización : 7 de abril de 2011 Esta respuesta se está haciendo bastante larga y cubre varios aspectos del problema en cuestión. Sin embargo, me he resistido, hasta ahora, dividiéndolo en respuestas separadas.
Agregué al final una discusión sobre el rendimiento de Pearson para este ejemplo.χ2
Bruce M. Hill escribió, tal vez, el documento "seminal" sobre estimación en un contexto tipo Zipf. Escribió a mediados de los años 70 varios artículos sobre el tema. Sin embargo, el "estimador de Hill" (como se lo llama ahora) se basa esencialmente en las estadísticas de orden máximo de la muestra y, por lo tanto, dependiendo del tipo de truncamiento presente, eso podría ocasionarle algunos problemas.
El papel principal es:
BM Hill, Un enfoque general simple de inferencia sobre la cola de una distribución , Ann. Stat. 1975.
Si sus datos realmente son inicialmente Zipf y luego se truncan, entonces se puede aprovechar una buena correspondencia entre la distribución de grados y el gráfico Zipf .
Específicamente, la distribución de grados es simplemente la distribución empírica del número de veces que se ve cada respuesta entera,
reyo= # { j : Xj= i }norte.
Si graficamos esto contra en un gráfico log-log, obtendremos una tendencia lineal con una pendiente correspondiente al coeficiente de escala.yo
Por otro lado, si trazamos el gráfico Zipf , donde clasificamos la muestra de mayor a menor y luego graficamos los valores contra sus rangos, obtenemos una tendencia lineal diferente con una pendiente diferente . Sin embargo, las pendientes están relacionadas.
Si es el coeficiente de la ley de escala para la distribución Zipf, entonces la pendiente en la primera gráfica es - α y la pendiente en la segunda gráfica es - 1 / ( α - 1 ) . A continuación se muestra un gráfico de ejemplo para α = 2 y n = 10 6 . El panel de la izquierda es la distribución de grados y la pendiente de la línea roja es - 2 . El lado derecho es el gráfico Zipf, con la línea roja superpuesta con una pendiente de - 1 / ( 2 - 1 ) = -α- α- 1 / ( α - 1 )α = 2n = 106 6- 2 .- 1 / ( 2 - 1 ) = - 1
Por lo tanto, si sus datos se han truncado para que no vea valores mayores que algún umbral , pero los datos están distribuidos por Zipf y τ es razonablemente grande, entonces puede estimar α a partir de la distribución de grados . Un enfoque muy simple es ajustar una línea al gráfico log-log y usar el coeficiente correspondiente.ττα
β^
α^= 1 - 1β^.
@csgillespie dio un artículo reciente escrito en colaboración con Mark Newman en Michigan sobre este tema. Parece que publica muchos artículos similares sobre esto. A continuación hay otra junto con otras referencias que pueden ser de interés. Newman a veces no hace las cosas más sensatas estadísticamente, así que tenga cuidado.
MEJ Newman, Leyes de poder, distribuciones de Pareto y la ley de Zipf , Contemporary Physics 46, 2005, pp. 323-351.
M. Mitzenmacher, Una breve historia de los modelos generativos para la ley de potencia y las distribuciones logarítmicas , Internet Math. vol. 1, no. 2, 2003, pp. 226-251.
K. Knight, una modificación simple del estimador Hill con aplicaciones a la robustez y reducción de sesgos , 2010.
Anexo :
R105 5
> 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 resultante es
i ≤ 30
Aún así, desde un punto de vista práctico, tal argumento debería ser relativamente convincente.
α = 2n = 300000Xm a x= 500
χ2
X2= ∑i = 1500( Oyo- Eyo)2miyo
Oyoyomiyo= n pyo= n i- α/ ∑500j = 1j- α
También calcularemos un segundo estadístico formado al agrupar primero los conteos en contenedores de tamaño 40, como se muestra en la hoja de cálculo de Maurizio (el último contenedor solo contiene la suma de veinte valores de resultados separados.
nortepag
pag
R
# 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 )