在带有循环的矩阵上应用FUN

时间:2017-11-29 03:13:49

标签: r

我需要从$par函数中找到限制和非限制模型的$objectivenlminb的值。受限模型是初始模型中每个可能的行对的总和。初始模型以矩阵nn表示。例如,应计算每列的总和:1,2; 1,3; 1,4等等所有可能的对。

> nn
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    3    0    0    0    0    0    0    0    1
 [2,]   55   73   59    3    1    0   16    0   12
 [3,]   10    0   14    0    0    0    3    0    1
 [4,]    3    2   21   14    0    0    0    0    0
 [5,]  145   34  300   24    0    0   26    0    3
 [6,]  883  298 1561   82    6    7  202    7   99
 [7,]   20   19  135   89    0    8    3    2    0
 [8,]  533  369 2026  280   18    4  294    6   75
 [9,] 2820  641 4082  611   28   17 1052   75  253
[10,]  662  175 1140  301    8    9  214    2   48
[11,] 2206  342 1989  330   23   12  715   21  277
[12,]  210  350 1463  207   10    7   23    7   30 

我的代码如下:

z_Obj<-list()
z_Par<-list()
for(i in 1:nrow(nn)){ 
  for(j in 2:nrow(nn)){
    if (j!=i){
      f_2<-function(par,n){
        u1<-par[1]
        u2<-par[2]
        u3<-par[3]
        u4<-par[4]
        u5<-par[5]
        u6<-par[6]
        u7<-par[7]
        u8<-par[8]
        u9<-par[9]
        n=nn[i,1:9]+nn[j,1:9]
        -sum(n*log(par/(sum(par))))
      }
      z<-nlminb(c(1,0,0,0,0,0,0,0,0),objective = f_2,lower = 0.000001, upper = Inf)
      z_Obj[[i]]<-z$objective
      z_Par[[i]]<-z$par
  }
}
}

问题在于代码不会为所有可能的对估计$par$objective,并且仅为1,1对的结果提供结果; 2,2; 3,3。正是那些我不需要运行的对。 请帮助解决我的代码问题?谢谢! :)

当我运行dput(nn)时,它给了我这个结果:

> dput(nn)
structure(c(3L, 55L, 10L, 3L, 145L, 883L, 20L, 533L, 2820L, 662L, 
2206L, 210L, 0L, 73L, 0L, 2L, 34L, 298L, 19L, 369L, 641L, 175L, 
342L, 350L, 0L, 59L, 14L, 21L, 300L, 1561L, 135L, 2026L, 4082L, 
1140L, 1989L, 1463L, 0L, 3L, 0L, 14L, 24L, 82L, 89L, 280L, 611L, 
301L, 330L, 207L, 0L, 1L, 0L, 0L, 0L, 6L, 0L, 18L, 28L, 8L, 23L, 
10L, 0L, 0L, 0L, 0L, 0L, 7L, 8L, 4L, 17L, 9L, 12L, 7L, 0L, 16L, 
3L, 0L, 26L, 202L, 3L, 294L, 1052L, 214L, 715L, 23L, 0L, 0L, 
0L, 0L, 0L, 7L, 2L, 6L, 75L, 2L, 21L, 7L, 1L, 12L, 1L, 0L, 3L, 
99L, 0L, 75L, 253L, 48L, 277L, 30L), .Dim = c(12L, 9L))

1 个答案:

答案 0 :(得分:0)

此代码生成行和列的所有组合并计算其总和。

# generate matrix of all combinations    
row_comb <- combn(nrow(nn), 2)
col_comb <- combn(ncol(nn), 2)

# predefine vector for results
row_sums <- rep(NULL, ncol(row_comb))
col_sums <- rep(NULL, ncol(col_comb))

# calculate sums of all combinations
for (i in 1:ncol(col_comb)) (
  col_sums[i] <-  (sum (nn [, col_comb [,i]]))
)

for (i in 1:ncol(row_comb)) (
  row_sums[i] <-  (sum (nn [row_comb [,i], ] ))
)

我希望这有助于解决您的问题! : - )