Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中使用内置函数时,如何尝试捕获错误位置?_R_While Loop_Try Catch_Continue - Fatal编程技术网

在R中使用内置函数时,如何尝试捕获错误位置?

在R中使用内置函数时,如何尝试捕获错误位置?,r,while-loop,try-catch,continue,R,While Loop,Try Catch,Continue,我已经用R编写了代码,见下文。当N=100时,它工作。 我需要运行dist_统计函数N=1000次 在该函数中,隐式使用Cholesky分解。对于Cholesky分解,矩阵必须是正定的。但第i矩阵的元素是随机数。我不能控制积极性。因此,我看到了错误: # Error in chol.default(rxx) : # the leading minor of order 4 is not positive definite 然后停止计算 问题:如何捕捉错误位置并通过生成新的正定矩阵继续计算 li

我已经用R编写了代码,见下文。当N=100时,它工作。 我需要运行dist_统计函数N=1000次

在该函数中,隐式使用Cholesky分解。对于Cholesky分解,矩阵必须是正定的。但第i矩阵的元素是随机数。我不能控制积极性。因此,我看到了错误:

# Error in chol.default(rxx) :
# the leading minor of order 4 is not positive definite
然后停止计算

问题:如何捕捉错误位置并通过生成新的正定矩阵继续计算

library(fungible)
n <- 4
k <- 2 
p <- n 
n1 <- 100; n2 <- 100

R1 <- matrix(c(
1.00, 0.51, 0.44, 0.22,
0.51, 1.00, 0.36, 0.21,
0.44, 0.36, 1.00, 0.26,
0.22, 0.21, 0.26, 1.00), n, n)

skew_vec = c(-0.254, -0.083, 0.443, -0.017); kurt_vec = c(6.133,   4.709, 6.619,  4.276)

dist_statistic <- function(N, n, n1, n2, R1){
Q <- c()
for(i in 1:N)
{
    X1 <- monte1(seed = i+123, nvar = n, nsub = n1, cormat = R1,
             skewvec = skew_vec,
             kurtvec = kurt_vec)$data #; X1


    R2 <- corSample(R1, n = 10000)$cor.sample

    rand_vec <- rnorm(n)

    X2 <- monte1(seed = i+321, nvar = n, nsub = n2, cormat = R2,
                 skewvec = skew_vec + rand_vec,
                 kurtvec = kurt_vec + rand_vec)$data

    G1 <- adfCor(X1);    G2 <- adfCor(X2)

    G    <- ((n1 - 1)*G1 + (n2 - 1)*G2)/(n1 + n2 - 2)
    Ginv <- MASS::ginv(G)

    # vectorization operator
    delta <- row(R1) - col(R2)
    vR1 <- as.vector(t(R1[delta > 0])); vR2 <- as.vector(t(R2[delta > 0]))

    stat  <- n1*n2/(n1 + n2) * ((vR1 - vR2) %*% Ginv) %*% (vR1 - vR2)
    Q <- c(Q, stat) 
    print(i)
 } # for_i

      Results <- list(statistic = Q, iteration = i)
    return(Results)
} # function

s <- dist_statistic(N=100, n, n1, n2, R1)

这里有一个方法。我首先将循环的内容重写为函数:

my_function <- function(i) {
  X1 <- monte1(seed = i+123, nvar = n, nsub = n1, cormat = R1,
               skewvec = skew_vec,
               kurtvec = kurt_vec)$data #; X1
  R2 <- corSample(R1, n = 10000)$cor.sample
  rand_vec <- rnorm(n)
  X2 <- monte1(seed = i+321, nvar = n, nsub = n2, cormat = R2,
               skewvec = skew_vec + rand_vec,
               kurtvec = kurt_vec + rand_vec)$data
  G1 <- adfCor(X1)
  G2 <- adfCor(X2)
  G    <- ((n1 - 1)*G1 + (n2 - 1)*G2)/(n1 + n2 - 2)
  Ginv <- MASS::ginv(G)
  # vectorization operator
  delta <- row(R1) - col(R2)
  vR1 <- as.vector(t(R1[delta > 0]))
  vR2 <- as.vector(t(R2[delta > 0]))
  stat  <- n1*n2/(n1 + n2) * ((vR1 - vR2) %*% Ginv) %*% (vR1 - vR2)
  return(stat)
}
有两个柜台。i控制种子,而计数器确保您具有N中指定的正确有效输出数。CAT纯粹用于装饰目的,指示错误。因此

s <- dist_statistic(N=110, n, n1, n2, R1)
# ....................
# ....................
# ....................
# ....................
# ....................
# .*..*.......

str(s)
# List of 2
#  $ statistic: num [1:110] 5.91 2.59 5.49 5.01 1.65 ...
#  $ iteration: num 112
检查
s <- dist_statistic(N=110, n, n1, n2, R1)
# ....................
# ....................
# ....................
# ....................
# ....................
# .*..*.......

str(s)
# List of 2
#  $ statistic: num [1:110] 5.91 2.59 5.49 5.01 1.65 ...
#  $ iteration: num 112