Come adattare una distribuzione Weibull ai dati di input contenenti zero?


14

Sto cercando di riprodurre un algoritmo di previsione esistente, tramandato da un ricercatore in pensione. Il primo passo è quello di adattare alcuni dati osservati a una distribuzione Weibull, per ottenere una forma e una scala che verranno utilizzate per prevedere i valori futuri. Sto usando R per fare questo. Ecco un esempio del mio codice:

x<-c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,51,77,78,144,34,29,45,16,15,37,218,170,44,121)
f<-fitdistr(x, 'weibull')

Funziona bene a meno che non ci siano zero nell'array di input, il che causa un errore completo. La stessa cosa succede in SAS. A quanto ho capito, ciò è dovuto al fatto che uno dei passaggi del calcolo della distribuzione di Weibull sta eseguendo il log naturale, che è indefinito per 0. Esiste un modo ragionevole per aggirare questo?

La migliore che ho trovato finora è quella di aggiungere 1 a tutti i miei valori di input, adattare la curva e quindi sottrarre uno dai miei valori previsti ("spostare" la curva verso l'alto e poi indietro di 1). Questo si adatta abbastanza bene ai dati precedentemente previsti, ma sembra che debba essere un modo sbagliato di farlo.

modifica: I valori nella matrice di input sono osservati, i dati del mondo reale (il numero di occorrenze di qualcosa) per un intervallo di anni. Quindi in alcuni anni il numero di occorrenze era zero. Che sia il modo migliore o meno (sono d'accordo che potrebbe non esserlo), l'autore dell'algoritmo originale afferma di aver utilizzato la distribuzione di Weibull e devo provare a replicare il loro processo.


5
Il Weibull è una distribuzione continua in modo che la probabilità di ottenere esattamente zero abbia probabilità zero. Se ricevi molti zeri nei tuoi dati, questo è un indizio immediato che il Weibull sia inappropriato. Ad ogni modo, i tuoi dati sembrano dati di conteggio (o almeno, sono discreti) e quindi un Weibull non è probabilmente la scelta migliore.
cardinale il

L'aggiunta di un contesto su da dove provengono i dati aiuterà chiunque cerchi di rispondere tremendamente.
cardinale il

Risposte:


8

(Come altri hanno sottolineato, è improbabile che una distribuzione di Weibull sia un'approssimazione appropriata quando i dati sono solo numeri interi. Quanto segue ha lo scopo di aiutarti a determinare cosa ha fatto il ricercatore precedente, nel modo giusto o sbagliato.)

Esistono diversi metodi alternativi che non sono influenzati dagli zeri nei dati, come l'utilizzo di vari stimatori del metodo dei momenti. Questi in genere richiedono una soluzione numerica di equazioni che coinvolgono la funzione gamma, poiché i momenti della distribuzione di Weibull sono dati in termini di questa funzione. Non ho familiarità con R, ma ecco un programma Sage che illustra uno dei metodi più semplici - forse può essere adattato a R? (Puoi leggere questo e altri metodi simili in, ad esempio, "La distribuzione di Weibull: un manuale" di Horst Rinne, p. 455ff - tuttavia, c'è un refuso nel suo eq.12.4b, come '-1' è ridondante).

"""
Blischke-Scheuer method-of-moments estimation of (a,b)
for the Weibull distribution F(t) = 1 - exp(-(t/a)^b)
""" 

x = [23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,16,15,37,218,170,44,121]
xbar = mean(x)
varx = variance(x)
var("b"); f(b) = gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2
bhat = find_root(f, 0.01, 100)
ahat = xbar/gamma(1+1/bhat)
print "Estimates: (ahat, bhat) = ", (ahat, bhat)

Questo ha prodotto l'output

Estimates: (ahat, bhat) =  (81.316784310814455, 1.3811394719075942)


0

x = [23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121]

quindi la stessa procedura produce l'output

Estimates: (ahat, bhat) =  (78.479354097488923, 1.2938352346035282)


EDIT: ho appena installato R per provarlo. A rischio di rendere questa risposta troppo lunga, per chiunque sia interessato ecco il mio codice R per il metodo Blischke-Scheuer:

fit_weibull <- function(x)
{
    xbar <- mean(x)
    varx <- var(x)
    f <- function(b){return(gamma(1+2/b)/gamma(1+1/b)^2 - 1 - varx/xbar^2)}
    bhat <- uniroot(f,c(0.02,50))$root
    ahat <- xbar/gamma(1+1/bhat)
    return(c(ahat,bhat))
}

Questo riproduce (fino a cinque cifre significative) i due esempi di Sage sopra:

x <- c(23,19,37,38,40,36,172,48,113,90,54,104,90,54,157,
     51,77,78,144,34,29,45,16,15,37,218,170,44,121)
fit_weibull(x)
[1] 81.316840  1.381145

x <- c(23,0,37,38,40,36,172,48,113,90,54,104,90,54,157,
      51,77,78,144,34,29,45,0,0,37,218,170,44,121)
fit_weibull(x)
[1] 78.479180  1.293821

4

θfitdistrθθfitdistr funzione e restituisce la logliklihood associata:

foo <- function(theta, x)
{
  if (theta <= -min(x)) return(Inf);
  f <- fitdistr(x+theta, 'weibull')
  -2*f$loglik
}

Quindi minimizza questa funzione usando l'ottimizzazione monodimensionale:

bar <- optimize(foo, lower=-min(x)+0.001, upper=-min(x)+10, x=x)

dove ho appena inventato il "+10" basandomi sul nulla.

Per i dati con i tre valori più piccoli sostituiti da zero, otteniamo:

> bar
$minimum
[1] 2.878442

$objective
[1] 306.2792

> fitdistr(x+bar$minimum, 'weibull')
     shape        scale   
   1.2836432   81.1678283 
 ( 0.1918654) (12.3101211)
> 

bar$minimumθfitdistrθ


2

Dovrebbe fallire, dovresti essere grato di aver fallito.

Le tue osservazioni hanno mostrato che si sono verificati fallimenti nel momento stesso in cui hai iniziato ad osservarli. Se questo è un processo reale, proveniente da dati reali (e non simulati), è necessario in qualche modo tenere conto del motivo per cui si ottengono zeri. Ho visto studi di sopravvivenza in cui 0 volte si presentano come conseguenza di una di diverse cose:

  1. I dati vengono effettivamente troncati: gli oggetti erano a rischio e fallivano prima dell'inizio dello studio e si vuole far finta di averli osservati da sempre.
  2. Gli strumenti sono scarsamente calibrati: non hai abbastanza precisione di misura per lo studio e quindi i guasti che si verificano vicino all'ora di inizio sono stati codificati esattamente come zero.
  3. La cosa codificata come zero non è zero. Sono persone o oggetti che sono stati esclusi dall'analisi in un modo o nell'altro. Lo zero viene visualizzato nei dati come conseguenza dell'unione, dell'ordinamento o della ricodifica dei valori mancanti.

Quindi, per il caso 1: è necessario utilizzare metodi di censura adeguati, anche se ciò significa estrarre in modo retrospettivo i record. Caso 2 significa che puoi usare l'algoritmo EM perché hai un problema di precisione. I metodi bayesiani funzionano allo stesso modo anche qui. Caso 3 significa che devi solo escludere i valori che avrebbero dovuto mancare.


Il PO ha spiegato che un precedente ricercatore ha scelto di adattarsi a una distribuzione di Weibull, anche se i dati sono conteggi del mondo reale - conteggi interi non negativi del numero di occorrenze di qualcosa. Non è chiaro come i tuoi tre casi si colleghino a una situazione del genere.
ris

Oh, buona nota! Adattarsi alla distribuzione di Weibull è egregiamente sbagliato. Ha un supporto continuo e non viene mai utilizzato per modellare i conteggi ma i tempi di sopravvivenza. Le distribuzioni binomiali negative sarebbero una sorta di distribuzione equivalente a due parametri per i conteggi dei modelli, che ovviamente dipende dalla natura del processo di generazione dei dati (di cui abbiamo 0 informazioni, come indicato dal problema). Grazie per avermelo fatto notare.
AdamO,

1

Sono d'accordo con la risposta del cardinale sopra. Tuttavia, è anche abbastanza comune aggiungere una costante per evitare zeri. Un altro valore comunemente usato è 0,5, ma potrebbe essere stata utilizzata qualsiasi costante positiva. Potresti provare un intervallo di valori per vedere se riesci a identificare il valore esatto utilizzato dal ricercatore precedente. Quindi potresti essere sicuro di essere in grado di riprodurre i suoi risultati, prima di andare alla ricerca di una migliore distribuzione.


0

[Supponendo che Weibull sia appropriato] Il libro di Johnson Kotz e Balakrishnan ha molti modi per stimare i parametri di Weibull. Alcuni di questi non dipendono dai dati che non includono gli zeri (ad es. Usando la media e la deviazione standard o usando determinati percentili).

Johnson, NL, Kotz, S. e Balakrishnan, N. (1994). Distribuzioni univariate continue. New York: Wiley, approssimativamente a pagina 632.

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.