2

ブートストラップを介して推定されたパラメーターの標準誤差を計算したいと考えていますoptim。目的は、optim関数の入力として使用されるデータをブートストラップすることです。

初期最適関数は次のように与えられます。

f = function (theta) {

A = rbind (c(1,theta[1], theta[2]), c(theta[3],1,theta[4]), c(theta[5],theta[6],1))
S1 = diag ( c(theta[7],theta[8],theta[9]) )
S2 = diag ( c(theta[10],theta[11],theta[12]) )
S3 = diag ( c(theta[13],theta[14],theta[15]) )
S4 = diag ( c(theta[16],theta[17],theta[18]) )  

M1 <-   A %*% C1 %*% t(A) - S1 
M2 <-   A %*% C2 %*% t(A) - S2 
M3 <-   A %*% C3 %*% t(A) - S3 
M4 <-   A %*% C4 %*% t(A) - S4 

mm =  sum(as.vector(M1)*(T1/T), as.vector(M2)*(T2/T),
     as.vector(M3)*(T3/T), as.vector(M4)*(T4/T))^2
 return (mm)     
}
result = optim (rep(0,18), fn=f)

C1 などは、ブートストラップで作成したい共分散行列です。を使用してブートストラップするためのコードをboot以下に示します。

bootresid=cbindX(steady.resid,dairy.resid,nzdusd.resid,interest.resid)

bootfun = function(bootresid, i) {

C1 = cov(bootresid[i,1:3],use = "na.or.complete")
C2 = cov(bootresid[i,4:6],use = "na.or.complete")
C3 = cov(bootresid[i,7:9],use = "na.or.complete")
C4 = cov(bootresid[i,10:12],use = "na.or.complete")

ans = optim (rep(0,18), fn = f)
return(ans$par)
}

bootres = boot(bootresid, statistic = bootfun, 500)

これは、関数内で未使用の引数のエラーを返しますoptimoptimブート関数内で使用できますか? optim関数の定義方法を変更する必要がありますか?

編集: Vincent が示唆したように、追加の引数は初期関数を介して渡す必要があります。この問題で重要なのは、optimが異なるデータで確実に繰り返されるように、追加のインデックスを指定する必要があることです。最終的な解決策は.

bootfun = function(bootresid, i, d, C1, C2, C3, C4) {

C1 = cov(bootresid[i,1:3],use = "na.or.complete")
C2 = cov(bootresid[i,4:6],use = "na.or.complete")
C3 = cov(bootresid[i,7:9],use = "na.or.complete")
C4 = cov(bootresid[i,10:12],use = "na.or.complete")

ans = optim (rep(0,18), fn=f)

return(ans$par [d])
}

bootres = boot(bootresid, statistic = bootfun, 500)
4

0 に答える 0