0

ブートパッケージの機能が複素数でboot機能しないことがわかりました。二変量行列の固有値を取得して、データをブートストラップしようとしています。固有値の問題は、しばしば複素数を返し、それによって ( ) エラーが発生することです。複素数を避ける方法はありますか?boot

ここに私のコードがあります、

Data <- read.table('http://ubuntuone.com/6n1igcHXq4EnOm4x2zeqFb', header = FALSE)
Mat <- cbind(Data[["V1"]],Data[["V2"]])
Data.ts <- as.ts(Mat)

以下は、必要な機能の一部です。

library(mvtnorm)

var1.sim <- function(T, n.start=100, phi1=matrix(c(0.7,0.2,0.2,0.7),nr=2),
                     err.mu=c(0,0), err.sigma2=matrix(c(1,0.5,0.5,1), nr=2),
                     errors=NULL) {

  e <- rmvnorm(n.start + T, err.mu, err.sigma2)   # (n.start+T) x 2 matrix
  y <- matrix(0, nrow=n.start+T, ncol=2)

  if (!is.null(errors) && is.matrix(errors) && ncol(errors) == 2) {
    rows <- nrow(errors)
    if (rows < n.start + T) {
      # replace last nrow(errors) errors
      e[seq.int(n.start+T-rows+1,n.start+T),] <- errors
    } else {
      e <- errors[seq.int(n.start+T+1, rows)]
    }
  }

  for (t in seq.int(2, n.start + T)) {
    y[t,] <- phi1 %*% y[t-1,] + e[t,]
  }

  return(ts(y[seq.int(n.start+1,n.start+T),]))
}

########

coef.var1 <- function(var.fit) {
  k <- coef(var.fit)
  rbind(k[[1]][,"Estimate"], k[[2]][,"Estimate"])
}

そして、ここに主な方法があります、

library(vars)
library(boot)

y.var <- VAR(Data.ts, p=1, type="none")
y.resid <- resid(y.var) 

rm(y.boot)
y.boot <- boot(y.resid, R=100, statistic=function(x,i) {
  resid.boot <- x[i,]
  y.boot1 <- var1.sim(T=nrow(x), errors=resid.boot)
  min(eigen(coef.var1(VAR(y.boot1, p=1, type="none")))$values)
}, stype="i")

y.boot$t

y.ci <- boot.ci(y.boot, type="norm", conf=0.95)$normal[2:3]
list(t=y.boot$t,ci=y.ci)

問題はy.bootオブジェクト、特にこの行で発生します

min(eigen(coef.var1(VAR(y.boot1, p=1, type="none")))$values)

最小固有値の取得が複雑な場合、bootこのエラーが返されます

Error in min(eigen(coef.var1(VAR(y.boot1, p = 1, type = "none")))$values) : 
  invalid 'type' (complex) of argument

それ以外の場合は問題ありません。さて、この 100 回のブートストラップが 1 回実行されれば安全ですが、これも実際には約 100 回ループします。そのため、これらのループで複雑な値が発生する可能性が高くなります。したがって、上記のエラーが再び発生します。

これらの複雑な値を回避する方法はありますか?

4

0 に答える 0