如何调用函数使用* apply with different data,其中output是list,intput是2x2矩阵的列表?

时间:2017-03-10 23:43:27

标签: r apply lapply sapply tapply

我有10次模拟运行的数据,存储为列表。我想用这个数据调用函数FUN1,而不是重复代码10次。 FUN1的输出是模型参数的值,以便:

               $theta=5
               $Theta= 0.5
               $pi_1 = 0.6
               $pi_2 = 0.4 
               $loglik_1 = 123.6
               $loglik_2 = 23.56 

那么,这就是FUN1在我适应10次运行之一时的输出方式。我希望所有运行的输出都没有为每次运行重新调整我的函数。

我知道我们可以在R中使用循环族函数,例如lapply(列表)或tapply(向量)函数。我试过了他们两个但都没有用。

这是我的数据:

   library(VineCopula)
   library(copula)
   Runs = 10
   Saveas = vector(mode = "list", length = Runs)
   pb <- txtProgressBar(min = 0, max = Runs, style = 3)

   for(j in 1:Runs) {
     setTxtProgressBar(pb, j)
     N=2000
     dim = dim
     U = runif(N, min=0,max=1)
     X = matrix(NA, nrow=N, ncol=2)

     inds <- U < 0.7

     X[inds, ]  <- rCopula(sum(inds),
                    claytonCopula(1, dim=2))

     X[!inds, ] <- rCopula(N - sum(inds),
                    frankCopula(4, dim=2))
     Saveas[[j]] = X
   }

这是我的功能:

      FUN1 <- EM_mixture_copula(data =   
          Saveas[[j]],pi_1=pi_1,pi_2=pi_2,theta = theta, 
          Theta=Theta, tol = .00001,     maxit = 1000)

以下是我对错误的尝试:

    > result <- tapply(X,FUN1,simplify = T)
    Error in tapply(X, FUN, simplify = T) : arguments must have same length.

    > Result <– lapply(X,FUN1)
    Error in get(as.character(FUN), mode = "function", envir = envir) : object 'F' of mode 'function' was not found. 

请注意,copula的输出是矩阵(nrow = N,ncol = 2)(因为copula的维数是2)。例如:

   xx <-            

        rCopula(N=4 ,claytonCopula(0.5))
            xx
                   [,1]        [,2]
      [1,] 0.6269311043 0.229429156
      [2,] 0.3257583519 0.268244546
      [3,] 0.7446442267 0.436335203
      [4,] 0.3186246504 0.163209827

其中0.5是copula参数。

请帮忙吗?

1 个答案:

答案 0 :(得分:1)

我想foreach (@lines) { $line .= "$_\n"; } open( $fh, '>', 'output-file.txt' ) or die "Could not open file $!"; print $fh $line; close $fh; 里面的dim应该是1.因为我没有安装数据或库,所以这个答案是未经验证的帖子。但是,它可以帮助您从这里找出解决方案。

sim_fun