La distribution stable positive dans R

9

Les distributions stables positives sont décrites par quatre paramètres: le paramètre d'asymétrie , le paramètre d'échelle , le paramètre de localisation , etc. -index appelé paramètre . Lorsque est nul la distribution est symétrique autour de , quand elle est positive (resp. négative) la distribution est biaisée vers la droite (resp. vers la gauche) Les distributions stables permettent des queues épaisses lorsque diminue.β[1,1]μ ( - , ) α ( 0 , 2 ] β μ ασ>0μ(,)α(0,2]βμα

Lorsque est strictement inférieur à un et le support de la distribution se limite à .β = 1 ( μ , )αβ=1(μ,)

La fonction de densité n'a qu'une expression de forme fermée pour certaines combinaisons particulières de valeurs pour les paramètres. Lorsque , , et c'est le cas (voir la formule (4.4) ici ):α < 1 β = 1 σ = αμ=0α<1β=1σ=α

f(y)=1πyk=1Γ(kα+1)k!(yα)ksin(αkπ)

Il a une moyenne et une variance infinies.

Question

Je voudrais utiliser cette densité dans R. J'utilise

> alpha <- ...
> dstable(y, alpha=alpha, beta=1, gamma=alpha, delta=0, pm=1)

où la fonction dstable est fournie avec le package fBasics.

Pouvez-vous confirmer que c'est la bonne façon de calculer cette densité dans R?

Merci d'avance!

ÉDITER

Une des raisons pour lesquelles je me méfie est que, dans la sortie, la valeur de delta est différente de celle dans l'entrée. Exemple:

> library(fBasics)
> alpha <- 0.4
> dstable(4, alpha=alpha, beta=1, gamma=alpha, delta=0, pm=1)
[1] 0.02700602
attr(,"control")
   dist alpha beta gamma    delta pm
stable   0.4    1   0.4 0.290617  1
ocram
la source

Réponses:

6

La réponse courte est que votre va bien, mais votre est faux. Pour obtenir la distribution stable positive donnée par votre formule dans R, vous devez définir γ γ = | 1 - i tan ( π α / 2 ) | - 1 / α .δγ

γ=|1itan(πα/2)|1/α.

Le premier exemple que j'ai pu trouver de la formule que vous avez donnée était (Feller, 1971), mais je n'ai trouvé ce livre que sous forme physique. Cependant (Hougaard, 1986) donne la même formule, avec la transformée de Laplace À partir du manuel ( utilisé dans ), le paramétrage provient de (Samorodnitsky et Taqqu, 1994), une autre ressource dont la reproduction en ligne m'a échappé. Cependant (Weron, 2001) donne la fonction caractéristique dans le paramétrage de Samorodnitsky et Taqqu pour que soit

L(s)=E[exp(sX)]=exp(sα).
stablediststabledistfBasicspm=1α1
φ(t)=E[exp(itX)]=exp[iδtγα|t|α(1iβsign(t)tanπα2)].
J'ai renommé certains paramètres du papier de Weron en coin avec la notation que nous utilisons. Il utilise pour et pour . Dans tous les cas, en branchant et , nous obtenons μδσγβ=1δ=0
φ(t)=exp[γα|t|α(1isign(t)tanπα2)].

Notez que pour et que . Formellement, , donc en définissant dans nous obtenons Un point intéressant à noter est que le qui correspond à est également , donc si vous essayiez ou(1itan(πα/2))/|1itan(πα/2)|=exp(iπα/2)α(0,1)iα=exp(iπα/2)γ = | 1 - i tan ( π α / 2 ) | - 1 / α φ ( t ) φ ( i s ) = exp ( - s α ) = L ( s ) . γ alpha = 1 / 2 1 / 2 γ = alpha γ = 1 - alpha alphaL(s)=φ(is)γ=|1itan(πα/2)|1/αφ(t)

φ(is)=exp(sα)=L(s).
γα=1/21/2γ=αγ=1α, ce qui n'est en fait pas une mauvaise approximation, vous vous retrouvez exactement correct pour .α=1/2

Voici un exemple dans R pour vérifier l'exactitude:

library(stabledist)

# Series representation of the density
PSf <- function(x, alpha, K) {
  k <- 1:K
  return(
    -1 / (pi * x) * sum(
      gamma(k * alpha + 1) / factorial(k) * 
        (-x ^ (-alpha)) ^ k * sin(alpha * k * pi)
    )
  )
}

# Derived expression for gamma
g <- function(a) {
  iu <- complex(real=0, imaginary=1)
  return(abs(1 - iu * tan(pi * a / 2)) ^ (-1 / a))
}

x=(1:100)/100
plot(0, xlim=c(0, 1), ylim=c(0, 2), pch='', 
     xlab='x', ylab='f(x)', main="Density Comparison")
legend('topright', legend=c('Series', 'gamma=g(alpha)'),
       lty=c(1, 2), col=c('gray', 'black'),
       lwd=c(5, 2))
text(x=c(0.1, 0.25, 0.7), y=c(1.4, 1.1, 0.7), 
     labels=c(expression(paste(alpha, " = 0.4")),
              expression(paste(alpha, " = 0.5")),
              expression(paste(alpha, " = 0.6"))))

for(a in seq(0.4, 0.6, by=0.1)) {
  y <- vapply(x, PSf, FUN.VALUE=1, alpha=a, K=100)
  lines(x, y, col="gray", lwd=5, lty=1)
  lines(x, dstable(x, alpha=a, beta=1, gamma=g(a), delta=0, pm=1), 
        col="black", lwd=2, lty=2)
}

Sortie de tracé

  1. Feller, W. (1971). An Introduction to Probability Theory and Its Applications , 2 , 2e éd. New York: Wiley.
  2. Hougaard, P. (1986). Modèles de survie pour les populations hétérogènes dérivées de distributions stables , Biometrika 73 , 387-396.
  3. Samorodnitsky, G., Taqqu, MS (1994). Stable Non-Gaussian Random Processes , Chapman & Hall, New York, 1994.
  4. Weron, R. (2001). Revues stables de Levy revisitées: indice de queue> 2 n'exclut pas le régime stable de Levy , International Journal of Modern Physics C, 2001, 12 (2), 209-223.
P Schnell
la source
1
Mon plaisir. Le sujet des paramétrisations stables positives m'a causé beaucoup de maux de tête plus tôt cette année (c'est vraiment un gâchis), donc je poste ce que j'ai trouvé. Cette forme particulière est utile dans l'analyse de survie parce que la forme du laplacien permet une relation simple entre les paramètres de régression conditionnelle et marginale dans les modèles à risques proportionnels quand il y a un terme de fragilité suivant une distribution stable positive (voir l'article de Hougaard).
P Schnell
6

Je pense que ce qui se passe est que dans la sortie, il deltapeut y avoir une valeur d'emplacement interne, tandis que dans l'entrée deltadécrit le changement. [Il semble y avoir un problème similaire avec gammaquand pm=2.] Donc, si vous essayez d'augmenter le décalage à 2

> dstable(4, alpha=0.4, beta=1, gamma=0.4, delta=2, pm=1)
[1] 0.06569375
attr(,"control")
   dist alpha beta gamma    delta pm
 stable   0.4    1   0.4 2.290617  1

puis vous ajoutez 2 à la valeur d'emplacement.

Avec beta=1et pm=1vous avez une variable aléatoire positive avec une distribution borne inférieure à 0.

> min(rstable(100000, alpha=0.4, beta=1, gamma=0.4, delta=0, pm=1))
[1] 0.002666507

Décaler de 2 et la borne inférieure augmente du même montant

> min(rstable(100000, alpha=0.4, beta=1, gamma=0.4, delta=2, pm=1))
[1] 2.003286

Mais si vous souhaitez que l' deltaentrée soit la valeur d'emplacement interne plutôt que le décalage ou la limite inférieure, vous devez utiliser une spécification différente pour les paramètres. Par exemple, si vous essayez ce qui suit (avec pm=3et en essayant delta=0et que delta=0.290617vous avez trouvé plus tôt), vous semblez obtenir la même chose deltadans et hors. Avec pm=3et delta=0.290617vous obtenez la même densité de 0,02700602 que vous avez trouvée plus tôt et une borne inférieure à 0. Avec pm=3et delta=0vous obtenez une borne inférieure négative (en fait -0,290617).

> dstable(4, alpha=0.4, beta=1, gamma=0.4, delta=0, pm=3)
[1] 0.02464434
attr(,"control")
   dist alpha beta gamma delta pm
 stable   0.4    1   0.4     0  3
> dstable(4, alpha=0.4, beta=1, gamma=0.4, delta=0.290617, pm=3)
[1] 0.02700602
attr(,"control")
   dist alpha beta gamma    delta pm
 stable   0.4    1   0.4 0.290617  3
> min(rstable(100000, alpha=0.4, beta=1, gamma=0.4, delta=0, pm=3))
[1] -0.2876658
> min(rstable(100000, alpha=0.4, beta=1, gamma=0.4, delta=0.290617, pm=3))
[1] 0.004303485

Vous pouvez trouver plus facile d'ignorer simplement deltadans la sortie, et tant que vous continuez à beta=1utiliser des pm=1moyens deltadans l'entrée, la distribution est la borne inférieure, qui semble vouloir être 0.

Henri
la source
4

A noter également: Martin Maechler vient de refactoriser le code de l'écurie distribuée et a ajouté quelques améliorations.

Son nouveau package stabledist sera également utilisé par fBasics, vous pouvez donc également y jeter un œil.

Dirk Eddelbuettel
la source