¿Errores estándar de las estimaciones de distribución hiperbólica usando el método delta?


8

Quiero calcular los errores estándar de una distribución hiperbólica ajustada.

En mi notación, la densidad viene dada por Estoy usando el paquete HyperbolicDistr en R. Calculo los parámetros mediante el siguiente comando:

H(l;α,β,μ,δ)=α2β22αδK1(δα2β2)exp(αδ2+(lμ)2+β(lμ))
hyperbFit(mydata,hessian=TRUE)

Esto me da una parametrización incorrecta. Lo cambio a mi parametrización deseada con el hyperbChangePars(from=1,to=2,c(mu,delta,pi,zeta))comando. Entonces quiero tener los errores estándar de mis estimaciones, puedo obtenerlo para la parametrización incorrecta con el summarycomando. Pero esto me da los errores estándar para la otra parametrización. De acuerdo con este hilo , tengo que usar el método delta ( no quiero usar bootstrap o validación cruzada, más o menos).

El hyperbFitcodigo esta aqui . Y el hyperbChangeParsestá aquí . Por lo tanto, sé que y permanecen igual. Por lo tanto, también los errores estándar son los mismos, ¿verdad?μδ

Para transformar y en y , necesito la relación entre ellos. Según el código, esto se hace de la siguiente manera:πζαβ

alpha <- zeta * sqrt(1 + hyperbPi^2) / delta
beta <- zeta * hyperbPi / delta

Entonces, ¿cómo debo codificar el método delta para obtener los errores estándar deseados?

EDITAR: estoy usando estos datos . Primero realizo el método delta de acuerdo con este hilo.

# fit the distribution

hyperbfitdb<-hyperbFit(mydata,hessian=TRUE)
hyperbChangePars(from=1,to=2,hyperbfitdb$Theta)
summary(hyperbfitdb)

summary(hyperbfitdb) da el siguiente resultado:

Data:      mydata 
Parameter estimates:
        pi           zeta         delta           mu    
    0.0007014     1.3779503     0.0186331    -0.0001352 
  ( 0.0938886)  ( 0.9795029)  ( 0.0101284)  ( 0.0035774)
Likelihood:         615.992 
Method:             Nelder-Mead 
Convergence code:   0 
Iterations:         315 

y hyperbChangePars(from=1,to=2,hyperbfitdb$Theta)da el siguiente resultado:

   alpha.zeta     beta.zeta   delta.delta         mu.mu 
73.9516898823  0.0518715378  0.0186331187 -0.0001352342 

ahora defino las variables de la siguiente manera:

pi<-0.0007014 
lzeta<-log(1.3779503)
ldelta<-log(0.0186331)

Ahora ejecuto el código (segunda edición) y obtengo el siguiente resultado:

> se.alpha
         [,1]
[1,] 13.18457
> se.beta
        [,1]
[1,] 6.94268

¿Es esto correcto? Me pregunto lo siguiente: si uso un algoritmo bootstrap de la siguiente manera:

B = 1000 # number of bootstraps

alpha<-NA
beta<-NA
delta<-NA
mu<-NA


# Bootstrap
for(i in 1:B){
  print(i)
  subsample = sample(mydata,rep=T)
  hyperboot <- hyperbFit(subsample,hessian=FALSE)
  hyperboottransfparam<- hyperbChangePars(from=1,to=2,hyperboot$Theta)
  alpha[i]    = hyperboottransfparam[1]
  beta[i]    = hyperboottransfparam[2]
  delta[i] = hyperboottransfparam[3]
  mu[i] = hyperboottransfparam[4]

}
# hist(beta,breaks=100,xlim=c(-200,200))
sd(alpha)
sd(beta)
sd(delta)
sd(mu)

Me pongo 119.6por sd(alpha)y 35.85para sd(beta). Los resultados son muy diferentes? ¿Hay algún error o cuál es el problema aquí?

Respuestas:


10

En la siguiente solución, supongo hyperbPique es . Además, las variaciones utilizadas en las siguientes aproximaciones son simplemente los errores estándar al cuadrado calculados por after , entonces . Para calcular la aproximación usando el método delta , necesitamos las derivadas parciales de la función de transformación s y . Las funciones de transformación para y están dadas por: πsummaryhyperbFitVar(X)=SE(X)2gα(ζ,π,δ)gβ(ζ,π,δ)αβ

gα(ζ,π,δ)=ζ1+π2δgβ(ζ,π,δ)=ζπδ
Las derivadas parciales de la función de transformación para son entonces: Las derivadas parciales de la función de transformación para son: α
ζgα(ζ,π,δ)=1+π2δπgα(ζ,π,δ)=πζ1+π2δδgα(ζ,π,δ)=1+π2ζδ2
β
ζgβ(ζ,π,δ)=πδπgβ(ζ,π,δ)=ζδδgβ(ζ,π,δ)=πζδ2

Aplicando el método delta a las transformaciones, obtenemos la siguiente aproximación para la varianza de (tome raíces cuadradas para obtener los errores estándar): La varianza aproximada de es:α

Var(α)1+π2δ2Var(ζ)+π2ζ2(1+π2)δ2Var(π)+(1+π2)ζ2δ4Var(δ)+2×[πζδ2Cov(π,ζ)(1+π2)ζδ3Cov(δ,ζ)πζ2δ3Cov(δ,π)]
β

Var(β)π2δ2Var(ζ)+ζ2δ2Var(π)+π2ζ2δ4Var(δ)+2×[πζδ2Cov(π,ζ)π2ζδ3Cov(δ,ζ)πζ2δ3Cov(π,δ)]

Codificando en R

La forma más rápida de calcular las aproximaciones anteriores es usar matrices. Denote el vector de fila que contiene las derivadas parciales de la función de transformación para o con respecto a . Además, denote la matriz de varianza-covarianza de . La matriz de covarianza se puede recuperar escribiendo dónde está la función ajustada. La aproximación anterior de la varianza de es entonces Lo mismo es cierto para la aproximación de la varianza deDαβζ,π,δΣ3×3ζ,π,δvcov(my.hyperbFit)my.hyperbFitα

Var(α)DαΣDα
β.

En R, esto se puede codificar fácilmente así:

#-----------------------------------------------------------------------------
# The row vector D of the partial derivatives for alpha
#-----------------------------------------------------------------------------

D.alpha <- matrix(
  c(
    sqrt(1+pi^2)/delta,                 # differentiate wrt zeta
    ((pi*zeta)/(sqrt(1+pi^2)*delta)),   # differentiate wrt pi
    -(sqrt(1+pi^2)*zeta)/(delta^2)      # differentiate wrt delta
  ),
  ncol=3)

#-----------------------------------------------------------------------------
# The row vector D of the partial derivatives for beta
#-----------------------------------------------------------------------------

D.beta <- matrix(
  c(
    (pi/delta),            # differentiate wrt zeta
    (zeta/delta),          # differentiate wrt pi
    -((pi*zeta)/delta^2)   # differentiate wrt delta
  ),
  ncol=3)

#-----------------------------------------------------------------------------
# Calculate the approximations of the variances for alpha and beta
# "sigma" denotes the 3x3 covariance matrix
#-----------------------------------------------------------------------------

var.alpha <- D.alpha %*% sigma %*% t(D.alpha) 
var.beta <- D.beta %*% sigma %*% t(D.beta)

#-----------------------------------------------------------------------------
# The standard errors are the square roots of the variances
#-----------------------------------------------------------------------------

se.alpha <- sqrt(var.alpha)
se.beta <- sqrt(var.beta)

Usando ylog(ζ)log(δ)

Si los errores / variaciones estándar solo están disponibles para y lugar de y , las funciones de transformación cambian a : Las derivadas parciales de la función de transformación para son entonces: ζ=log(ζ)δ=log(δ)ζδ

gα(ζ,π,δ)=exp(ζ)1+π2exp(ζ)gβ(ζ,π,δ)=exp(ζ)πexp(δ)
α
ζgα(ζ,π,δ)=1+π2exp(δ+ζ)πgα(ζ,π,δ)=πexp(δ+ζ)1+π2δgα(ζ,π,δ)=1+π2exp(δ+ζ)
Las derivadas parciales de la función de transformación para son: β
ζgβ(ζ,π,δ)=πexp(δ+ζ)πgβ(ζ,π,δ)=exp(δ+ζ)δgβ(ζ,π,δ)=πexp(δ+ζ)
Aplicando el método delta a En las transformaciones, obtenemos la siguiente aproximación para la varianza de : α
Var(α)(1+π2)exp(2δ+2ζ)Var(ζ)+π2exp(2δ+2ζ)1+π2Var(π)+(1+π2)exp(2δ+2ζ)Var(δ)+2×[πexp(2δ+2ζ)Cov(π,ζ)(1+π2)exp(2δ+2ζ)Cov(δ,ζ)πexp(2δ+2ζ)Cov(δ,π)]
La varianza aproximada de es: β
Var(β)π2exp(2δ+2ζ)Var(ζ)+exp(2δ+2ζ)Var(π)+π2exp(2δ+2ζ)Var(δ)+2×[πexp(2δ+2ζ)Cov(π,ζ)π2exp(2δ+2ζ)Cov(δ,ζ)πexp(2δ+2ζ)Cov(δ,π)]

Codificación en R2

Esta vez, sigmadenota la matriz de covarianza pero incluye las varianzas y covarianzas para y lugar de y .ζ=log(ζ)δ=log(δ)ζδ

#-----------------------------------------------------------------------------
# The row vector D of the partial derivatives for alpha
#-----------------------------------------------------------------------------

D.alpha <- matrix(
  c(
    sqrt(1+pi^2)*exp(-ldelta + lzeta),            # differentiate wrt lzeta
    ((pi*exp(-ldelta + lzeta))/(sqrt(1+pi^2))),   # differentiate wrt pi
    (-sqrt(1+pi^2)*exp(-ldelta + lzeta))          # differentiate wrt ldelta
  ),
  ncol=3)

#-----------------------------------------------------------------------------
# The row vector D of the partial derivatives for beta
#-----------------------------------------------------------------------------

D.beta <- matrix(
  c(
    (pi*exp(-ldelta + lzeta)),    # differentiate wrt lzeta
    exp(-ldelta + lzeta),         # differentiate wrt pi
    (-pi*exp(-ldelta + lzeta))    # differentiate wrt ldelta
  ),
  ncol=3)

#-----------------------------------------------------------------------------
# Calculate the approximations of the variances for alpha and beta
# "sigma" denotes the 3x3 covariance matrix with log(delta) and log(zeta)
#-----------------------------------------------------------------------------

var.alpha <- D.alpha %*% sigma %*% t(D.alpha) 
var.beta <- D.beta %*% sigma %*% t(D.beta)

#-----------------------------------------------------------------------------
# The standard errors are the square roots of the variances
#-----------------------------------------------------------------------------

se.alpha <- sqrt(var.alpha)
se.beta <- sqrt(var.beta)

1
@BenBohold Los términos dentro de los corchetes antes de los términos de covarianza son los productos de las derivadas parciales respectivas de las funciones de transformación. Por ejemplo: el término antes de es el producto de la derivada parcial wrt multiplicada por la derivada parcial wrt . En el caso de esto sería: . Cov(π,ζ)πζβζ/δ×π/δ=(ζπ)/δ2
COOLSerdash

1
@BenBohold Strange, pero no hay problema. Tratar de calcular la matriz de covarianza de esta manera: varcov <- solve(hyperbfitalv$hessian). ¿Esto funciona? Después de eso, deberá seleccionar la submatriz que contenga solo . La forma más fácil en la que podría ayudarlo sería si proporcionara un ejemplo completamente funcional con datos (no tiene que proporcionar todos sus datos). π,ζ,δ
COOLSerdash

3
Muchas gracias por su respuesta, pero este es EXACTAMENTE el problema, porque la parametrización de este hessian es para log (delta) y log (zeta) y no para delta y zeta. Vea mis publicaciones de seguimiento: stats.stackexchange.com/questions/67595/… y especialmente la respuesta de CT Zhu aquí stats.stackexchange.com/questions/67602/…
Jen Bohold

2
uno tiene que obtener el hessian de pi, log (zeta), log (delta) y mu en el hessian de pi, zeta, delta y mu. ¿Sabes cómo se puede hacer esto?
Jen Bohold

2
También intenté hacerlo con el hessian "incorrecto", así que con log (delta) y log (zeta), después de esto seleccioné la submatriz e hice los cálculos. Los resultados no fueron correctos, porque los valores eran demasiado grandes, como 60 000 o menos.
Jen Bohold

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.