Come stimare i parametri per la distribuzione troncata Zipf da un campione di dati?


10

Ho un problema con il parametro di stima per Zipf. La mia situazione è la seguente:

Ho un set di campioni (misurato da un esperimento che genera chiamate che dovrebbero seguire una distribuzione Zipf). Devo dimostrare che questo generatore genera davvero chiamate con la distribuzione zipf. Ho già letto queste domande e risposte. Come calcolare il coefficiente di legge di Zipf da una serie di frequenze massime? ma ottengo risultati negativi perché utilizzo una distribuzione troncata. Ad esempio, se imposto il valore "s" su "0.9" per il processo di generazione, se provo a stimare il valore "s" come scritto nelle domande e risposte riportate ottengo "s" pari a 0,2 ca. Penso che ciò sia dovuto al fatto che utilizzo una distribuzione TRUNCATED (devo limitare lo zipf con un punto di troncamento, è troncato a destra).

Come posso stimare i parametri con una distribuzione zipf troncata?


per essere chiari, che cosa stai troncando con precisione? La distribuzione dei valori o il diagramma Zipf stesso? Conosci il punto di troncamento? Il troncamento è un artefatto dei dati o un artefatto del trattamento dei dati (ad esempio, una decisione presa dall'utente o dallo sperimentatore)? Eventuali dettagli aggiuntivi sarebbero utili.
cardinale il

@cardinale. (parte 1/2) Grazie cardinale. Darò maggiori dettagli: ho un generatore VoIP che genera chiamate seguendo Zipf (e altra distribuzione) per il volume per chiamante. Devo verificare che questo generatore segua davvero queste distribuzioni. Per Zipf Distribution ho bisogno di definire il punto di troncamento (quindi è noto e si riferisce alla distribuzione dei valori) che è il numero massimo di chiamate generate dall'utente e il parametro di scala. In particolare nel mio caso questo valore è uguale a 500, ciò indica che un utente può generare un massimo di 500 chiamate.
Maurizio,

(parte 2/2) L'altro parametro da impostare è il parametro di scala per Zipf che definisce la diffusione della distribuzione (questo valore nel mio caso è 0,9). Ho tutti i parametri (dimensione del campione, frequenza per utente, ecc.) Ma devo verificare che il mio set di dati segua la distribuzione zipf.
Maurizio,

quindi apparentemente stai rinormalizzando la distribuzione di , poiché per quello che potrei pensare come un "Zipf troncato", un parametro di ridimensionamento di 0.9 sarebbe impossibile . Se riesci a generare molti di questi dati e "solo" hai 500 possibili esiti, perché non usare semplicemente un test di bontà di adattamento chi-quadrato? Poiché la tua distribuzione ha una coda lunga, potresti aver bisogno di una dimensione del campione piuttosto grande. Ma sarebbe un modo. Un altro metodo rapido e sporco sarebbe quello di verificare che si ottenga la giusta distribuzione empirica per piccoli valori del numero di chiamate. i=1500i0.9
cardinale il

Risposte:


14

Aggiornamento : 7 aprile 2011 Questa risposta sta diventando piuttosto lunga e copre molteplici aspetti del problema. Tuttavia, finora ho resistito, suddividendolo in risposte separate.

In fondo ho aggiunto una discussione sull'esecuzione di di Pearson per questo esempio.χ2


Bruce M. Hill ha scritto, forse, il documento "seminale" sulla stima in un contesto simile a Zipf. Ha scritto diversi articoli a metà degli anni '70 sull'argomento. Tuttavia, lo "stimatore di Hill" (come viene ora chiamato) si basa essenzialmente sulle statistiche di ordine massimo del campione e quindi, a seconda del tipo di troncamento presente, ciò potrebbe causare problemi.

Il documento principale è:

BM Hill, Un semplice approccio generale all'inferenza sulla coda di una distribuzione , Ann. Statistica. , 1975.

Se i tuoi dati sono inizialmente Zipf e vengono poi troncati, allora una buona corrispondenza tra la distribuzione dei gradi e la trama Zipf può essere sfruttata a tuo vantaggio.

In particolare, la distribuzione dei gradi è semplicemente la distribuzione empirica del numero di volte in cui viene vista ogni risposta intera,

di=#{j:Xj=i}n.

Se lo tracciamo contro su un diagramma log-log, otterremo una tendenza lineare con una pendenza corrispondente al coefficiente di ridimensionamento.i

D'altra parte, se tracciamo il diagramma Zipf , dove ordiniamo il campione dal più grande al più piccolo e quindi tracciamo i valori rispetto ai loro ranghi, otteniamo una diversa tendenza lineare con una diversa pendenza. Tuttavia le piste sono correlate.

Se è il coefficiente di legge di ridimensionamento per la distribuzione Zipf, la pendenza nel primo diagramma è e la pendenza nel secondo diagramma è . Di seguito è riportato un esempio di trama per e . Il riquadro di sinistra è la distribuzione dei gradi e la pendenza della linea rossa è . Il lato destro è il diagramma Zipf, con la linea rossa sovrapposta con una pendenza di .αα1/(α1)α=2n=10621/(21)=1

Trame di distribuzione dei gradi (a sinistra) e Zipf (a destra) per un campione iid da una distribuzione Zipf.

Quindi, se i tuoi dati sono stati troncati in modo da non vedere valori più grandi di qualche soglia , ma i dati sono altrimenti distribuiti da Zipf e è ragionevolmente grande, allora puoi stimare dalla distribuzione dei gradi . Un approccio molto semplice consiste nell'adattare una linea al diagramma log-log e utilizzare il coefficiente corrispondente.ττα

Se i tuoi dati vengono troncati in modo da non visualizzare piccoli valori (ad esempio, il modo in cui viene filtrato molto per i set di dati Web di grandi dimensioni), puoi utilizzare il grafico Zipf per stimare la pendenza su una scala del log-log e quindi " indietro "l'esponente di ridimensionamento. Supponi che la tua stima della pendenza dal grafico Zipf sia . Quindi, una semplice stima del coefficiente della legge di ridimensionamento è β^

α^=11β^.

@csgillespie ha pubblicato un recente articolo scritto da Mark Newman al Michigan su questo argomento. Sembra pubblicare molti articoli simili su questo. Di seguito è riportato un altro insieme a un paio di altri riferimenti che potrebbero essere di interesse. Newman a volte non fa statisticamente la cosa più sensata, quindi sii cauto.

MEJ Newman, Leggi del potere, distribuzioni di Pareto e legge di Zipf , Contemporary Physics 46, 2005, pp. 323-351.

M. Mitzenmacher, una breve storia di modelli generativi per la legge del potere e le distribuzioni lognormali , matematica per Internet. , vol. 1, n. 2, 2003, pagg. 226-251.

K. Knight, Una semplice modifica dello stimatore di Hill con applicazioni per la robustezza e la riduzione della distorsione , 2010.


Addendum :

Ecco una semplice simulazione in per dimostrare cosa potresti aspettarti se prendessi un campione di dimensioni dalla tua distribuzione (come descritto nel tuo commento sotto la domanda originale).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)

La trama risultante è

Diagramma Zipf "troncato" (troncato a i = 500)

Dalla trama, possiamo vedere che l'errore relativo della distribuzione dei gradi per (o giù di lì) è molto buono. Si potrebbe fare un test formale chi-quadrato, ma questo non è strettamente dire che i dati seguono la distribuzione di pre-specificato. Ti dice solo che non hai prove per concludere che non lo fanno .i30

Tuttavia, da un punto di vista pratico, tale trama dovrebbe essere relativamente convincente.


Addendum 2 : consideriamo l'esempio che Maurizio usa nei suoi commenti qui sotto. Supponiamo che e , con una distribuzione Zipf troncata con valore massimo .n = 300α=2x m a x = 500n=300000xmax=500

Calcoleremo la statistica di Pearson in due modi. Il modo standard è tramite la statistica dove è il conteggio osservato del valore nel campione e .X 2 = 500 i = 1 ( O i - E i ) 2χ2 OiiEi=npi=ni-α/ 500 j = 1 j-α

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

Calcoleremo anche una seconda statistica formata dal primo binning dei conteggi in contenitori di dimensioni 40, come mostrato nel foglio di calcolo di Maurizio (l'ultimo cestino contiene solo la somma di venti valori di risultato separati.

Tracciamo 5000 campioni separati di dimensione da questa distribuzione e calcoliamo i valori usando queste due diverse statistiche.pnp

Gli istogrammi dei valori sono al di sotto e sono considerati abbastanza uniformi. I tassi di errore empirici di tipo I sono 0,0716 (standard, metodo non ancorato) e 0,0502 (metodo binnato), rispettivamente e nessuno dei due è statisticamente significativamente diverso dal valore di 0,05 target per la dimensione del campione di 5000 che abbiamo scelto.p

inserisci qui la descrizione dell'immagine

Ecco il codiceR

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

+1, ottima risposta come al solito. Dovresti
nominarti

@mpiktas, grazie per i complimenti e l'incoraggiamento. Non sono sicuro di poter giustificare la mia nomina con la già forte lista di candidati che hanno, uniformemente, partecipato più ampiamente e più a lungo di me.
cardinale il

@cardinal, ecco alcuni link all'alternativa allo stimatore di Hill: articolo originale di Paulauskas e follow-up di Vaiciulis e Gadeikis e Paulauskas . Questo stimatore avrebbe presumibilmente proprietà migliori di quelle originali di Hill.
mpiktas,

@mpiktas, grazie per i collegamenti. Esistono alcune versioni "nuove e migliorate" dello stimatore Hill. Lo svantaggio principale dell'approccio originale è che richiede una scelta di "cutoff" su dove interrompere la media. Penso che per lo più sia stato fatto "guardandolo negli occhi", il che apre a cariche di soggettività. Uno dei libri di Resnick sulle distribuzioni dalla coda lunga ne discute in dettaglio, se ricordo. Penso che sia il suo più recente.
cardinale il

@cardinale, grazie mille, sei molto gentile e molto dettagliato! Il tuo esempio in R mi è stato molto utile, ma come posso eseguire un test chi-quadro formale in questo caso? (Ho usato il test chi-quadrato con altre distribuzioni come uniforme, esponenziale, normale, ma ho molti dubbi su zipf..Scusa ma questo è il mio primo approccio a questi argomenti). Domanda ai modetatori: devo scrivere un'altra domanda e risposta come "come eseguire il test chi-quadro per la distribuzione troncata di zipf?" o continuare in questo Q&A magari aggiornando tag e titolo?
Maurizio,

5

La carta

Clauset, A et al , Distribuzioni di legge di potere nei dati empirici . 2009

contiene un'ottima descrizione di come procedere per adeguare i modelli di legge sul potere. La pagina Web associata contiene esempi di codice. Sfortunatamente, non fornisce codice per le distribuzioni troncate, ma può darti un puntatore.


A parte questo, il documento discute del fatto che molti "set di dati relativi al potere" possono essere modellati ugualmente bene (e in alcuni casi meglio) con le distribuzioni normali o esponenziali del Log!


Sfortunatamente questo articolo non dice nulla sulla distribuzione troncata. Ho trovato alcuni pacchetti in R che trattano il parametro di stima Zipf in modo semplice (zipfR, VGAM) ma la distribuzione troncata necessita di un "trattamento speciale". Con la tua ultima frase intendevi dire che è possibile modellare un set di dati di legge di potere con una distribuzione esponenziale ad esempio e quindi applicare un processo di parametro di stima per una distribuzione esponenziale "troncata"? Sono molto alle prime armi in questo argomento!
Maurizio,

Nel documento, gli autori riesaminano diversi set di dati in cui è stata inserita una legge di potere. Gli autori sottolineano che in alcuni casi il modello di legge del potere non è eccezionale e una distribuzione alternativa sarebbe migliore.
csgillespie,

2

Dopo la risposta dettagliata dell'utente cardinale ho eseguito il test chi-quadro sulla mia presunta distribuzione troncata di zipf. I risultati del test chi-quadrato sono riportati nella seguente tabella:

inserisci qui la descrizione dell'immagine

Laddove StartInterval e EndInterval rappresentano ad esempio l'intervallo di chiamate e l' Osservato è il numero di chiamanti che generano da 0 a 19 chiamate e così via. Il test chi-quadrato è valido fino a raggiungere le ultime colonne, aumentano il valore finale calcolo, altrimenti fino a quel punto il valore chi-quadrato "parziale" era accettabile!

Con altri test il risultato è lo stesso, l'ultima colonna (o le ultime 2 colonne) aumenta sempre il valore finale e non so perché e non so se (e come) utilizzare un altro test di validazione.

PS: per completezza, per calcolare i valori attesi ( attesi ) seguo il suggerimento del cardinale in questo modo:

inserisci qui la descrizione dell'immagine

dove x_i 's vengono utilizzati per calcolare: x <- (1:n)^-Sil p_i ' s per il calcolo p <- x / sum(x)e, infine, l'E_i (nr previsto degli utenti per ogni nr di chiamate) si ottieneP_i * Total_Caller_Observed

e con Grado di libertà = 13 la bontà del Chi-quadrato rifiuta sempre l'ipotesi che il set di campioni segua la distribuzione Zipf perché le statistiche del test (64,14 in questo caso) sono maggiori di quelle riportate nelle tabelle del chi-quadrato, "demerito" per l'ultima colonna. Il risultato grafico è riportato qui: inserisci qui la descrizione dell'immagine

sebbene il punto di troncamento sia impostato su 500, il valore massimo ottenuto è 294. Penso che la "dispersione" finale sia la causa del fallimento del test chi-quadro.

AGGIORNARE!!

Cerco di eseguire il test chi-quadro su un presunto campione di dati zipf generato con il codice R riportato nella risposta sopra.

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

La trama associata è la seguente: inserisci qui la descrizione dell'immagine

I risultati del test chi-quadrato sono riportati nella figura seguente: inserisci qui la descrizione dell'immagine

e la statistica del test chi-quadro (44,57) è troppo alta per la convalida con il Grado di libertà scelto. Anche in questo caso la "dispersione" finale dei dati è la causa dell'elevato valore chi-quadro. Ma c'è una procedura per convalidare questa distribuzione zipf (indipendentemente dal mio generatore "sbagliato", voglio concentrarmi sul campione di dati R) ???


@Maurizio, per qualche motivo, mi sono perso questo post fino ad ora. C'è comunque modo di modificarlo e aggiungere una trama simile a quella precedente nel mio post, ma usando i tuoi dati osservati? Ciò potrebbe aiutare a diagnosticare il problema. Penso di aver visto un'altra tua domanda in cui hai avuto problemi a produrre una distribuzione uniforme, quindi forse questo si sta ripercuotendo anche su queste analisi. (?) Saluti.
cardinale il

@cardinal, ho aggiornato i risultati! Cosa ne pensi? La domanda sulla distribuzione uniforme è un'altra cosa che devo specificare in modo migliore e lo farò oggi o domani;)
Maurizio

@Maurizio, sono stati generati casualmente? Il tuo parametro di scala come prima? Ho usato una dimensione del campione di 8454 e un punto di troncamento di 500 e generato 10000 di tali campioni. Di questi 10000, il valore massimo osservato nel campione era 500 per 9658 delle prove, 499 per 324 prove, 498 per 16 prove e 497 per 2 prove. Sulla base di questo, penso che qualcosa sia ancora sbagliato nella tua procedura di generazione. A meno che tu non abbia usato un parametro di scala diverso. S=0.9
cardinale il

@Maurizio, per spiegare i risultati che ho pubblicato, considera che . Pertanto, in una dimensione del campione di , il numero previsto di risultati con il valore 500 è . La probabilità di vedere almeno uno di questi risultati è . Nota quanto strettamente corrisponde alla simulazione sopra. n = 8454 8454 4.05 10 - 43.43 1 - ( 1 - 0.000405 ) 84540.9675p=P(Xi=500)4.05×104n=845484544.051043.431(10.000405)84540.9675
cardinale il

@cardinal, penso anche che ci sia qualcosa di "sbagliato" nella procedura di generazione (il mio obiettivo è quello di confermare che questo generatore segue davvero la distribuzione Zipf). In questi giorni devo parlare con i progettisti del progetto.
Maurizio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.