Como estimar parâmetros para distribuição truncada Zipf a partir de uma amostra de dados?

10

Estou com um problema com o parâmetro de estimativa do Zipf. Minha situação é a seguinte:

Eu tenho um conjunto de amostras (medido a partir de um experimento que gera chamadas que devem seguir uma distribuição Zipf). Eu tenho que demonstrar que esse gerador realmente gera chamadas com distribuição zipf. Eu já li estas perguntas e respostas. Como calcular o coeficiente da lei de Zipf a partir de um conjunto de frequências principais? mas alcanço resultados ruins porque uso uma distribuição truncada. Por exemplo, se eu definir o valor "s" como "0,9" para o processo de geração, se tentar estimar o valor "s" conforme descrito nas perguntas e respostas relatadas, obtenho "s" igual a 0,2 ca. Eu acho que isso se deve ao fato de eu usar uma distribuição TRUNCATED (eu tenho que limitar o zipf com um ponto de truncamento, ele é truncado à direita).

Como posso estimar parâmetros com uma distribuição zipf truncada?

Maurizio
fonte
para ser claro, o que exatamente você está truncando corretamente? A distribuição de valores ou o próprio enredo Zipf? Você conhece o ponto de truncamento? O truncamento é um artefato dos dados ou um artefato do processamento de dados (por exemplo, alguma decisão tomada por você ou pelo pesquisador)? Qualquer detalhe adicional seria útil.
cardeal
@cardeal. (parte 1/2) Obrigado cardeal. Darei mais detalhes: Tenho um gerador de VoIP que gera chamadas após o Zipf (e outra distribuição) para o volume por chamador. Eu tenho que verificar se este gerador realmente segue essas distribuições. Para a distribuição Zipf, preciso definir o ponto de truncamento (portanto, é conhecido e se refere à distribuição de valores), que é o número máximo de chamadas geradas pelo usuário e o parâmetro de escala. Em particular, no meu caso, esse valor é igual a 500, o que indica que um usuário pode gerar no máximo 500 chamadas.
Maurizio
(parte 2/2) O outro parâmetro a ser definido é o parâmetro de escala para Zipf que define a propagação da distribuição (esse valor no meu caso é 0,9). Eu tenho todos os parâmetros (tamanho da amostra, frequência por usuário etc.), mas tenho que verificar se meu conjunto de dados segue a distribuição zipf.
Maurizio
então você está aparentemente renormalizar a distribuição por , uma vez que para, o que eu penso como um "Zipf truncado", um parâmetro de escala de 0,9 seria impossível. Se você pode gerar muitos desses dados e "apenas" tiver 500 resultados possíveis, por que não usar apenas um teste de ajuste do qui-quadrado? Como sua distribuição tem uma cauda longa, pode ser necessário um tamanho de amostra bastante grande. Mas, isso seria uma maneira. Outro método rápido e sujo seria verificar se você obtém a distribuição empírica correta para pequenos valores do número de chamadas. i=1500i0.9
cardeal

Respostas:

14

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,

di=#{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.i

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=10621/(21)=1

Distribuição de graus (esquerda) e gráficos de Zipf (direita) para uma amostra de IDI de uma distribuição de Zipf.

ττα

β^

α^=11β^.

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 é

Gráfico Zipf "Truncado" (truncado em i = 500)

i30

Ainda assim, do ponto de vista prático, esse enredo deve ser relativamente atraente.


α=2n=300000xmax=500

χ2

X2=i=1500(OiEi)2Ei
OiiEi=npi=niα/j=1500jα

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

insira a descrição da imagem aqui

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 )
cardeal
fonte
+1, ótima resposta, como de costume. Você deve se nomear um moderador, ainda há 1 hora :)
mpiktas 21/02
@mpiktas, obrigado pelos elogios e pelo incentivo. Não tenho certeza se justificaria me nomear com a lista já muito forte de candidatos que, uniformemente, participaram mais extensivamente e por mais tempo do que eu.
cardeal
@ cardinal, aqui estão alguns links para alternativas ao estimador de Hill: artigo original de Paulauskas e acompanhamento de Vaiciulis e Gadeikis e Paulauskas . Este estimador supostamente tinha melhores propriedades do que as de Hill originais.
mpiktas
@mpiktas, obrigado pelos links. Existem algumas versões "novas e aprimoradas" do estimador de Hill. A principal desvantagem da abordagem original é que ela requer uma escolha de "ponto de corte" sobre onde parar a média. Eu acho que, na maioria das vezes, isso foi feito com "olhos", o que abre um caminho para acusações de subjetividade. Um dos livros de Resnick sobre distribuições de cauda longa discute isso em detalhes, se bem me lembro. Eu acho que é o mais recente dele.
cardeal
@ cardinal, muito obrigado, você é muito gentil e muito detalhado! Seu exemplo em R foi muito útil para mim, mas como posso realizar um teste formal de qui-quadrado nesse caso? (usei o teste do qui-quadrado com outras distribuições como uniforme, exponencial, normal, mas tenho muitas dúvidas sobre o zipf .. Desculpe, mas esta é a minha primeira abordagem a esses tópicos). Pergunta aos modetadores: tenho que escrever outra sessão de perguntas e respostas como "como executar o teste do qui-quadrado para distribuição zipf truncada?" ou continuar nesta sessão de perguntas e respostas, talvez atualizando tags e título?
Maurizio
5

O papel

Clauset, A et al. , Distribuições da lei do poder em dados empíricos . 2009

contém uma descrição muito boa de como proceder para ajustar modelos de lei de energia. A página da web associada possui exemplos de código. Infelizmente, ele não fornece código para distribuições truncadas, mas pode fornecer um ponteiro.


Como um aparte, o artigo discute o fato de que muitos "conjuntos de dados de leis de poder" podem ser modelados igualmente bem (e, em alguns casos, melhor) com as distribuições normais ou exponenciais de Log!

csgillespie
fonte
Infelizmente este artigo não diz nada sobre a distribuição truncada. Encontrei alguns pacotes em R que lidam com o parâmetro de estimativa do Zipf de maneira simples (zipfR, VGAM), mas a distribuição truncada precisa de um "tratamento especial". Com sua última frase, você quis dizer que é possível modelar um conjunto de dados de leis de potência com uma distribuição exponencial, por exemplo, e depois aplicar algum processo de parâmetro de estimativa para uma distribuição exponencial "truncada"? Eu sou muito novato neste tópico!
Maurizio
No artigo, os autores re-analisam diferentes conjuntos de dados onde uma lei de potência foi ajustada. Os autores apontam que em vários casos o modelo da lei do poder não é tão bom e uma distribuição alternativa seria melhor.
csgillespie
2

Após a resposta detalhada do cardeal do usuário, realizei o teste do qui-quadrado na minha presumível distribuição zipf truncada. Os resultados do teste do qui-quadrado são relatados na tabela a seguir:

insira a descrição da imagem aqui

Onde StartInterval e EndInterval representam, por exemplo, o intervalo de chamadas e Observado é o número de chamadores gerando de 0 a 19 chamadas, etc. O teste do qui-quadrado é bom até o alcance das últimas colunas, elas aumentam cálculo, caso contrário, até esse ponto, o valor do qui-quadrado "parcial" era aceitável!

Com outros testes, o resultado é o mesmo, a última coluna (ou as duas últimas colunas) sempre aumenta o valor final e eu não sei por que e não sei se (e como) usar outro teste de validação.

PS: para ser completo, para calcular os valores esperados ( esperado ), sigo a sugestão do cardeal da seguinte maneira:

insira a descrição da imagem aqui

onde X_i 's são usados ​​para calcular :,x <- (1:n)^-S os P_i ' s para calcular p <- x / sum(x)e finalmente o E_i (número esperado de usuários para cada número de chamadas) é obtido porP_i * Total_Caller_Observed

e com Grau de liberdade = 13, a bondade do qui-quadrado rejeita sempre a hipótese de que o conjunto de amostras segue a distribuição Zipf porque a estatística de teste (64,14 neste caso) é maior do que a relatada nas tabelas do qui-quadrado, "demérito" para a última coluna. O resultado gráfico é relatado aqui: insira a descrição da imagem aqui

embora o ponto de truncamento esteja definido como 500, o valor máximo obtido é 294. Penso que a "dispersão" final é a causa da falha do teste do qui-quadrado.

ATUALIZAR!!

Tento executar o teste do qui-quadrado em uma amostra de dados zipf presumível gerada com o código R relatado na resposta acima.

> 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)

A plotagem associada é a seguinte: insira a descrição da imagem aqui

Os resultados do teste do qui-quadrado são relatados na figura a seguir: insira a descrição da imagem aqui

e a estatística do teste do qui-quadrado (44,57) é muito alta para a validação com o grau de liberdade escolhido. Também neste caso, a "dispersão" final dos dados é a causa do alto valor do qui-quadrado. Mas existe um procedimento para validar essa distribuição zipf (independentemente do meu gerador "errado", quero focar na amostra de dados R) ???

Maurizio
fonte
@Maurizio, por algum motivo, eu perdi este post até agora. Existe alguma maneira de editá-lo e adicionar um gráfico semelhante ao último no meu post, mas usando seus dados observados? Isso pode ajudar a diagnosticar o problema. Acho que vi outra pergunta sua em que você estava tendo problemas para produzir uma distribuição uniforme, então talvez isso também esteja sendo levado para essas análises. (?) Saudações.
cardeal
@ cardinal, atualizei os resultados! O que você acha? A questão sobre a distribuição uniforme é outra coisa que eu tenho que especificar de uma maneira melhor e eu vou fazê-lo hoje ou amanhã;)
Maurizio
S=0.9
p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675. Observe o quão próximo isso corresponde à simulação acima.
cardeal
@ cardinal, também acho que há algo "errado" no procedimento de geração (meu objetivo é validar que esse gerador realmente siga a distribuição Zipf). Eu tenho que falar com os designers do projeto nos dias de hoje.
Maurizio