Comment adapter une distribution Weibull pour saisir des données contenant des zéros?


14

J'essaie de reproduire un algorithme de prédiction existant, transmis par un chercheur à la retraite. La première étape consiste à ajuster certaines données observées à une distribution de Weibull, pour obtenir une forme et une échelle qui seront utilisées pour prédire les valeurs futures. J'utilise R pour ce faire. Voici un exemple de mon code:

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

Cela fonctionne correctement, sauf s'il y a des zéros dans le tableau d'entrée, ce qui entraîne son échec complet. La même chose se produit dans SAS. Si je comprends bien, c'est parce que l'une des étapes du calcul de la distribution de Weibull consiste à prendre le logarithme naturel, qui n'est pas défini pour 0. Existe-t-il un moyen raisonnable de contourner ce problème?

Le mieux que j'ai trouvé jusqu'à présent est d'ajouter 1 à toutes mes valeurs d'entrée, d'ajuster la courbe, puis de soustraire une de mes valeurs prédites ("déplacer" la courbe vers le haut puis la reculer de 1). Cela correspond assez bien aux données précédemment prédites, mais il semble que ce soit une mauvaise façon de le faire.

edit: Les valeurs dans le tableau d'entrée sont observées, des données du monde réel (le nombre d'occurrences de quelque chose) pour une gamme d'années. Ainsi, certaines années, le nombre d'occurrences était nul. Que ce soit la meilleure façon ou non (je conviens que ce ne soit pas le cas), l'auteur de l'algorithme d'origine prétend avoir utilisé la distribution Weibull, et je dois essayer de reproduire leur processus.


5
Le Weibull est une distribution continue de sorte que la probabilité d'obtenir exactement zéro a une probabilité nulle. Si vous obtenez de nombreux zéros dans vos données, c'est un indice immédiat que le Weibull est inapproprié. En tout cas, vos données ressemblent à des données de comptage (ou du moins, sont discrètes) et donc un Weibull n'est probablement pas le meilleur choix.
cardinal

L'ajout d'un peu de contexte sur la provenance des données aidera toute personne essayant de répondre énormément.
cardinal

Réponses:


8

(Comme d'autres l'ont souligné, une distribution de Weibull n'est probablement pas une approximation appropriée lorsque les données ne sont que des nombres entiers. Ce qui suit est juste destiné à vous aider à déterminer ce que le chercheur précédent a fait, à tort ou à raison.)

Il existe plusieurs méthodes alternatives qui ne sont pas affectées par les zéros dans les données, comme l'utilisation de divers estimateurs par méthode des moments. Celles-ci nécessitent généralement une solution numérique d'équations impliquant la fonction gamma, car les moments de la distribution de Weibull sont donnés en fonction de cette fonction. Je ne connais pas R, mais voici un programme Sage qui illustre l'une des méthodes les plus simples - peut-être peut-il être adapté à R? (Vous pouvez lire à ce sujet et d'autres méthodes de ce genre dans, par exemple, "La distribution Weibull: un manuel" par Horst Rinne, p. 455ff - cependant, il y a une faute de frappe dans son eq.12.4b, comme le '-1' est redondant).

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

Cela a produit la sortie

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


Si les données ci-dessus sont modifiées (juste à titre d'illustration) en remplaçant les trois plus petites valeurs par 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]

alors la même procédure produit la sortie

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


EDIT: Je viens d'installer R pour l'essayer. Au risque de faire cette réponse trop longtemps, pour toute personne intéressée, voici mon code R pour la méthode 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))
}

Cela reproduit (à cinq chiffres significatifs) les deux exemples Sage ci-dessus:

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

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

Réduisez ensuite cette fonction à l'aide de l'optimisation unidimensionnelle:

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

où je viens de composer le "+10" basé sur rien du tout.

Pour les données avec les trois plus petites valeurs remplacées par des zéros, nous obtenons:

> 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

Cela devrait échouer, vous devriez être reconnaissant d'avoir échoué.

Vos observations ont montré que des échecs se sont produits au moment même où vous avez commencé à les observer. S'il s'agit d'un processus réel, provenant de données réelles (et non simulées), vous devez en quelque sorte expliquer la raison pour laquelle vous obtenez des zéros. J'ai vu des études de survie où 0 fois apparaissait comme une conséquence de plusieurs choses:

  1. Les données sont en fait tronquées: les objets étaient en danger et ont échoué avant le début de l'étude et vous voulez prétendre que vous les avez observés depuis le début.
  2. Les instruments sont mal calibrés: vous n'avez pas assez de précision de mesure pour l'étude et donc les pannes survenant près de l'heure de début ont été codées exactement comme zéro.
  3. La chose codée comme un zéro n'est pas un zéro. Ce sont des personnes ou des objets qui ont été exclus de l'analyse d'une manière ou d'une autre. Le zéro apparaît simplement dans les données à la suite de la fusion, du tri ou du recodage des valeurs manquantes.

Donc pour le cas 1: vous devez utiliser des méthodes de censure appropriées, même si cela signifie tirer rétrospectivement des enregistrements. Le cas 2 signifie que vous pouvez utiliser l'algorithme EM car vous avez un problème de précision. Les méthodes bayésiennes fonctionnent également de la même manière ici. Le cas 3 signifie que vous avez juste besoin d'exclure les valeurs qui étaient censées être manquantes.


L'OP a expliqué qu'un chercheur précédent a choisi de s'adapter à une distribution de Weibull, même si les données sont réelles compte - Counts entier non négatif du nombre d'occurrences de quelque chose. On ne sait pas comment vos trois cas sont liés à une telle situation.
res

Oh, bonne note! S'adapter à la distribution de Weibull est tout à fait faux. Il a un support continu et n'est jamais utilisé pour modéliser les nombres mais les temps de survie. Les distributions binomiales négatives seraient une sorte de distribution équivalente à deux paramètres pour les comptages de modélisation, qui dépend bien sûr de la nature du processus de génération de données (dont nous avons 0 information, comme le problème est indiqué). Merci de me l'avoir signalé.
AdamO

1

Je suis d'accord avec la réponse du cardinal ci-dessus. Cependant, il est également assez courant d'ajouter une constante pour éviter les zéros. Une autre valeur couramment utilisée est 0,5, mais toute constante positive aurait pu être utilisée. Vous pouvez essayer une plage de valeurs pour voir si vous pouvez identifier la valeur exacte utilisée par le chercheur précédent. Ensuite, vous pouvez être sûr que vous êtes en mesure de reproduire ses résultats, avant de rechercher une meilleure distribution.


0

[En supposant que Weibull est approprié] Le livre de Johnson Kotz et Balakrishnan a beaucoup de façons d'estimer les paramètres de Weibull. Certains d'entre eux ne dépendent pas des données n'incluant pas les zéros (par exemple en utilisant la moyenne et l'écart type, ou en utilisant certains centiles).

Johnson, NL, Kotz, S. et Balakrishnan, N. (1994). Distributions univariées continues. New York: Wiley, grosso modo à la page 632.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.