Atualização : 7 de abril de 2011 Esta resposta está ficando muito longa e cobre vários aspectos do problema em questão. No entanto, até agora resisti a dividi-lo em respostas separadas.
Adicionei na parte inferior uma discussão sobre o desempenho do de Pearson para este exemplo.χ2
Bruce M. Hill foi o autor, talvez, do artigo "seminal" sobre estimativa em um contexto semelhante ao Zipf. Ele escreveu vários trabalhos em meados da década de 1970 sobre o assunto. No entanto, o "estimador de Hill" (como agora é chamado) depende essencialmente das estatísticas de ordem máxima da amostra e, portanto, dependendo do tipo de truncamento presente, isso pode causar problemas.
O artigo principal é:
BM Hill, Uma abordagem geral simples à inferência sobre a cauda de uma distribuição , Ann. Estado. 1975.
Se seus dados forem inicialmente Zipf e, em seguida, truncados, uma boa correspondência entre a distribuição de graus e o gráfico Zipf poderá ser aproveitada.
Especificamente, a distribuição de graus é simplesmente a distribuição empírica do número de vezes que cada resposta inteira é vista,
dEu= # { j : Xj= i }n.
Se traçarmos isso contra em um gráfico de log-log, obteremos uma tendência linear com uma inclinação correspondente ao coeficiente de escala.Eu
Por outro lado, se traçarmos o gráfico Zipf , onde classificaremos a amostra do maior para o menor e, em seguida, plotaremos os valores contra suas classificações, obteremos uma tendência linear diferente com uma inclinação diferente . No entanto, as pistas estão relacionadas.
α- α- 1 / ( α - 1 )α = 2n = 106- 2- 1 / ( 2 - 1 ) = - 1
ττα
β^
α^= 1 - 1β^.
O @csgillespie deu um artigo recente, co-escrito por Mark Newman, em Michigan, sobre esse tópico. Ele parece publicar muitos artigos semelhantes sobre isso. Abaixo está outro, juntamente com algumas outras referências que podem ser interessantes. Newman às vezes não faz a coisa mais sensata estatisticamente, portanto, seja cauteloso.
MEJ Newman, Leis do poder, distribuições de Pareto e lei de Zipf , Contemporary Physics 46, 2005, pp. 323-351.
M. Mitzenmacher, Uma Breve História de Modelos Generativos para Lei de Potência e Distribuições Lognormal , Internet Math. vol. 1, n. 2, 2003, pp. 226-251.
K. Knight, Uma modificação simples do estimador de Hill com aplicações à robustez e redução de viés , 2010.
Adendo :
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)
O gráfico resultante é
i ≤ 30
Ainda assim, do ponto de vista prático, esse enredo deve ser relativamente atraente.
α =2n = 300000xm a x= 500
χ2
X2= ∑i = 1500( OEu- EEu)2EEu
OEuEuEEu= n pEu= n i- α/ ∑500j = 1j- α
Também calcularemos uma segunda estatística formada pela primeira classificação das contagens em posições do tamanho 40, conforme mostrado na planilha de Maurizio (a última posição contém apenas a soma de vinte valores de resultados separados.
np
p
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 )