10 votos

Cómo estimar los parámetros de Zipf truncar la distribución de una muestra de datos?

Tengo un problema con la estimación de parámetros de Zipf. Mi situación es la siguiente:

Tengo un conjunto de muestras (medido a partir de un experimento que genera las llamadas que debe seguir una distribución de Zipf). Tengo que demostrar que este generador realmente genera llamadas con distribución de zipf. Ya he leído este Q&A Cómo calcular la ley de Zipf coeficiente a partir de un conjunto de la parte superior de las frecuencias? pero puedo llegar a malos resultados, porque yo uso una distribución truncada. Por ejemplo, si se establece el valor de "s" a "0.9" para el proceso de generación, si trato de estimar el valor de "s", como escribió en el Q&A obtener "s" igual a 0.2 ca. Creo que esto es debido al hecho de que yo uso una distribución TRUNCADA (tengo que limitar el zipf con un punto de truncamiento, es derecho trunca).

¿Cómo puedo estimar los parámetros con un truncado de zipf distribución?

14voto

giulio Puntos 166

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$.

Degree distribution (left) and Zipf (right) plots for an i.i.d. sample from a Zipf distribution.

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

"Truncated" Zipf plot (truncated at i=500)

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.

enter image description here

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 )

9voto

Frog Puntos 21

Tras la respuesta detallada del usuario cardenal realizó la prueba de chi-cuadrado en mi presumible trunca distribución de zipf. Los resultados de la prueba de chi-cuadrado se reportan en la siguiente tabla:

enter image description here

Donde el StartInterval y EndInterval representan, por ejemplo, el rango de las llamadas y el Observado es el número de personas que llaman la generación del 0 al 19 de llamadas, etc.. La prueba de chi-cuadrado es buena hasta la última de las columnas son de alcance, que aumentan el cálculo final, de lo contrario hasta que punto el "parcial" de chi-cuadrado valor era aceptable!

Con otras pruebas, el resultado es el mismo, en la última columna (o las 2 últimas columnas) siempre aumenta el valor final y no sé por qué y no sé si (y cómo) el uso de otra prueba de validación.

PS: para la integridad, para calcular los valores esperados (Espera) me siga cardenal de la sugerencia de esta manera:

enter image description here

donde X_i's se utilizan para calcular: x <- (1:n)^-S, el P_i's para calcular p <- x / sum(x) y, finalmente, la E_i (n ° de usuarios para cada n ° de llamadas) se obtiene P_i * Total_Caller_Observed

y con el Grado de Libertad=13 el test de la Chi-Cuadrado de bondad rechaza siempre la Hyphotesis que el conjunto de la muestra siga Zipf Distribución debido a que la Estadística de Prueba (64,14 en este caso) es mayor que la reportada en el test de la chi-cuadrado de tablas, "falta de mérito" de la última columna. El resultado gráfico se informó aquí: enter image description here

aunque el punto de truncamiento se establece en 500 el valor máximo que se obtiene es de 294. Creo que la final de la "dispersión" es la causa de la insuficiencia de la prueba de chi-cuadrado.

ACTUALIZACIÓN!!

Yo intente realizar la prueba de chi-cuadrado en una presumible de zipf muestra de datos generada con el código R reportados en la respuesta anterior.

> x <- (1:500)^(-2)
> p <- x / sum(x)
> y <- sample(length(p), size=300000, repl=TRUE, prob=p)
> tab <- table(y)
> length(tab)
[1] 438
> plot( 1:438, 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)

Los asociados de la trama es la siguiente: enter image description here

La prueba de chi-cuadrado resultados son presentados en la siguiente figura: enter image description here

y la prueba de chi-cuadrado estadístico (44,57) es demasiado alto para la validación con el Grado elegido de la Libertad. También en este caso, el final de la "dispersión" de los datos es la causa del alto valor de chi-cuadrado. Pero hay un procedimiento para validar esta distribución de zipf (sin tener en cuenta mi "mal" generador, quiero centrarme en la I muestra de datos) ???

5voto

Eggs McLaren Puntos 945

El papel

Clauset, et al, ley de Potencia de distribución en Datos Empíricos. 2009

contiene una muy buena descripción de cómo ir sobre el ajuste de potencia de los modelos de ley. Los asociados de la página web tiene ejemplos de código. Por desgracia, no dar el código para truncar las distribuciones, pero puede darle un puntero.


Como un aparte, el artículo discute el hecho de que muchos "ley de potencia de los conjuntos de datos" se puede modelar igual de bien (y en algunos casos mejor) con el Registro normal o distribuciones exponenciales!

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X