ブートストラップを介して推定されたパラメーターの標準誤差を計算したいと考えています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)
これは、関数内で未使用の引数のエラーを返しますoptim
。optim
ブート関数内で使用できますか? 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)