Actualización: 7 Abr 2011
Esta respuesta es bastante largo y abarca múltiples aspectos del problema en cuestión. Sin embargo, me he resistido, hasta ahora, rompiendo en dos respuestas.
He añadido en la parte inferior de una discusión sobre la actuación de Pearson $\chi^2$ para este ejemplo.
Bruce M. Hill autor, tal vez, el "clásico" de papel en la estimación en un Zipf-como el contexto. Él escribió varios artículos en los mediados de la década de 1970 sobre el tema. Sin embargo, el "estimador de Hill" (como se llama ahora) esencialmente se basa en la máxima de estadísticas de orden de la muestra y así, dependiendo del tipo de truncamiento presente, que podría entrar en algunos problemas.
El papel principal es:
B. M. Hill, Una simple aproximación general a la inferencia acerca de la cola de una distribución, Ann. Stat., 1975.
Si los datos son verdaderamente inicialmente de Zipf y luego se trunca, entonces una buena correspondencia entre el grado de distribución y el de Zipf parcela pueden ser aprovechados para su beneficio.
Específicamente, el grado de distribución es simplemente la distribución empírica de que el número de veces que cada número entero se ve una respuesta,
$$
d_i = \frac{\#\{j: X_j = i\}}{n} .
$$
If we plot this against $i$ on a log-log plot, we'll get a linear trend with a slope corresponding to the scaling coefficient.
On the other hand, if we plot the Zipf plot, where we sort the sample from largest to smallest and then plot the values against their ranks, we get a different linear trend with a different slope. However the slopes are related.
If $\alpha$ is the scaling-law coefficient for the Zipf distribution, then the slope in the first plot is $-\alpha$ and the slope in the second plot is $-1/(\alpha-1)$. Below is an example plot for $\alpha = 2$ and $n = 10^6$. The left-hand pane is the degree distribution and the slope of the red line is $-2$. The right-hand side is the Zipf plot, with the superimposed red line having a slope of $-1/(2-1) = -1$.
So, if your data have been truncated so that you see no values larger than some threshold $\tau$, but the data are otherwise Zipf-distributed and $\tau$ is reasonably large, then you can estimate $\alpha$ from the degree distribution. A very simple approach is to fit a line to the log-log plot and use the corresponding coefficient.
If your data are truncated so that you don't see small values (e.g., the way much filtering is done for large web data sets), then you can use the Zipf plot to estimate the slope on a log-log scale and then "back out" the scaling exponent. Say your estimate of the slope from the Zipf plot is $\hat{\beta}$. Entonces, una estimación simple de la ampliación de la ley del coeficiente de
$$
\hat{\alpha} = 1 - \frac{1}{\hat{\beta}} .
$$
@csgillespie gave one recent paper co-authored by Mark Newman at Michigan regarding this topic. He seems to publish a lot of similar articles on this. Below is another along with a couple other references that might be of interest. Newman sometimes doesn't do the most sensible thing statistically, so be cautious.
MEJ Newman, Power laws, Pareto distributions and Zipf's law, Contemporary Physics 46, 2005, pp. 323-351.
M. Mitzenmacher, A Brief History of Generative Models for Power Law and Lognormal Distributions, Internet Math., vol. 1, no. 2, 2003, pp. 226-251.
K. Knight, A simple modification of the Hill estimator with applications to robustness and bias reduction, 2010.
Addendum:
Here is a simple simulation in $R$ to demonstrate what you might expect if you took a sample of size $10^5$ from your distribution (as described in your comment below your original question).
> 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)
The resulting plot is
From the plot, we can see that the relative error of the degree distribution for $i \leq 30$ (or so) is very good. You could do a formal chi-square test, but this does not strictly tell you that the data follow the prespecified distribution. It only tells you that you have no evidence to conclude that they don't.
Still, from a practical standpoint, such a plot should be relatively compelling.
Addendum 2: Let's consider the example that Maurizio uses in his comments below. We'll assume that $\alpha = 2$ and $n = 300\,000$, with a truncated Zipf distribution having maximum value $x_{\mathrm{max}} = 500$.
We'll calculate Pearson's $\chi^2$ estadística de dos maneras. La forma estándar es a través de la estadística
$$
X^2 = \sum_{i=1}^{500} \frac{(O_i - E_i)^2}{E_i}
$$
donde $O_i$ es el observado cuenta de el valor de $i$ en la muestra y $E_i = n p_i = n i^{-\alpha} / \sum_{j=1}^{500} j^{-\alpha}$.
También vamos a calcular una segunda estadística formado por el primer agrupamiento de los recuentos en los contenedores de la talla 40, como se muestra en la Maurizio de la hoja de cálculo (el último bin sólo contiene la suma de veinte separado de resultados.
Vamos a dibujar 5000 separar las muestras de tamaño $n$ a partir de esta distribución y calcular el $p$-valores de uso de estas dos estadísticas diferentes.
Los histogramas de la $p$-los valores están por debajo y se ve bastante uniforme. El empírica de error Tipo I son las tasas de 0.0716 (estándar, no combinada método) y 0.0502 (binned método), respectivamente, y tampoco son estadísticamente significativamente diferente de la de destino 0.05 valor para el tamaño de la muestra de 5000 que hemos elegido.
Aquí es el $R$ código.
# 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 )