Distributions

使用 delta 方法的雙曲線分佈估計的標準誤差?

  • August 8, 2013

我想計算擬合雙曲線分佈的標準誤差。

在我的符號中,密度由下式給出

我在 R 中使用 HyperbolicDistr 包。我通過以下命令估計參數:

hyperbFit(mydata,hessian=TRUE)

這給了我錯誤的參數化。我使用命令將其更改為我想要的參數化hyperbChangePars(from=1,to=2,c(mu,delta,pi,zeta))。然後我想得到我估計的標準誤差,我可以用summary命令得到錯誤的參數化。但這給了我其他參數化的標準錯誤。根據這個線程,我必須使用 delta 方法(我不想使用引導程序或交叉驗證等)。

hyperbFit代碼在這裡。就hyperbChangePars這裡。因此我知道,和保持原樣。因此標準誤也是一樣的,對吧?

用於改造和進入和我需要他們之間的關係。根據代碼,這樣做如下:

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

那麼我如何編寫 delta 方法來獲得所需的標準錯誤呢?

編輯:我正在使用這些數據。我首先根據這個線程執行增量方法。

# fit the distribution

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

summary(hyperbfitdb)給出以下輸出:

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 

hyperbChangePars(from=1,to=2,hyperbfitdb$Theta)給出以下輸出:

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

現在我按以下方式定義變量:

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

我現在運行代碼(第二次編輯)並得到以下結果:

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

它是否正確?我想知道以下幾點:如果我以下列方式使用引導算法:

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)

我得到119.6了。sd(alpha)_ 結果大相徑庭?是否有錯誤或這裡有什麼問題?35.85``sd(beta)

在以下解決方案中,我假設hyperbPi是. 此外,以下近似值中使用的方差只是由summaryafter計算的平方標準誤差hyperbFit,所以. 為了使用delta 方法計算近似值,我們需要變換函數 s 的偏導數和. 變換函數為和由以下給出:

變換函數的偏導數然後是:

變換函數的偏導數是:

delta 方法應用於變換,我們得到以下方差的近似值(取平方根得到標準誤差):

的近似方差是:


編碼R

計算上述近似值的最快方法是使用矩陣。表示包含變換函數的偏導數的行向量要么關於. 此外,表示這方差-協方差矩陣. 可以通過鍵入擬合函數vcov(my.hyperbFit)來檢索協方差矩陣。my.hyperbFit上述方差的近似值那麼是

對於方差的近似也是如此. 在R中,這可以很容易地編碼如下:

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


使用和

如果標準誤差/方差僅適用於和代替和,變換函數變為:

變換函數的偏導數然後是:

變換函數的偏導數是:

delta 方法應用於變換,我們得到以下方差的近似值:

的近似方差是:


編碼R2

這一次,sigma表示協方差矩陣,但包括方差和協方差和代替和.

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

引用自:https://stats.stackexchange.com/questions/66861

comments powered by Disqus