R 利用协方差的特定组合构造选择指数

R 利用协方差的特定组合构造选择指数,r,combinations,R,Combinations,我是R编码的新手。我有矩阵数据,我想从中构建与我的研究领域相关的选择指数。我需要从给定的矩阵中选择所有矩阵组合来构造索引。我有4x4矩阵数据,所以我将得到11个组合。我能做,但是太长了。比如说, P<- matrix(c ( 6.63561, 0.13564, 5.15061, 5.97293, 0.13564, 0.39768, 2.42954, 1.76955, 5.15061, 2.42954, 62.6952, 36.5748, 5.97293, 1.76955, 36.5748,

我是R编码的新手。我有矩阵数据,我想从中构建与我的研究领域相关的选择指数。我需要从给定的矩阵中选择所有矩阵组合来构造索引。我有4x4矩阵数据,所以我将得到11个组合。我能做,但是太长了。比如说,

P<- matrix(c (
6.63561, 0.13564, 5.15061, 5.97293,
0.13564, 0.39768, 2.42954, 1.76955,
5.15061, 2.42954, 62.6952, 36.5748,
5.97293, 1.76955, 36.5748, 29.0475
), c( 4,4))


 G <-matrix(c(
 6.25705, 0.12236, 5.13621, 5.95043,
 0.12236, 0.23997, 2.06681, 1.45389,
 5.13621, 2.06681, 59.1681, 33.5396,
 5.95043, 1.45389, 33.5396, 26.168
 ), c(4,4))

A<-c(1,1,1,1)

B<- (solve(P)%*%G)%*%A
B<-abs(B)

g12 <- G[c( 1 , 2 ) , c( 1 , 2 )]              
g124 <- G[c( 1 , 2 , 4 ) , c( 1 , 2 , 4 )]          
g1234 <- G[c( 1 , 2 , 3 , 4 ) , c( 1 , 2 , 3 , 4 )] 

a12 <- A[c( 1 , 2 )]              
a124 <- A[c( 1 , 2 , 4 )]          
a1234 <- A[c( 1 , 2 , 3 , 4 )]  

b12 <- B[c( 1 , 2 )]              
b124 <- B[c( 1 , 2 , 4 )]          
b1234 <- B[c( 1 , 2 , 3 , 4 )]      


result<-c(w12 <-sum( g12 %*% b12 * a12 ),
w124 <-sum( g124 %*% b124 * a124 ),
w1234 <-sum( g1234 %*% b1234 * a1234 ))
但我需要所有11个组合。当我使用6x6矩阵时,我必须手动进行57个组合,这很烦人。所以我在寻找简短的语言。实际上,我希望得到如下表所示的结果,其中,comb.=组合,Var_comb=变量组合(4个变量),index=分析值

> SEL_INDEX
   comb.   Var_comb  index

1     12      x1x2  7.43  
2     13      x1x3  83,27 
3     14      x1x4  37.43 
4     23      x2x3  68.33 
5     24      x2x4  21.27 
6     34      x3x4  145.31 
7    123    x1x2x3  87.07 
8    124    x1x2x4  39.69 
9    134    x1x3x4  174.96 
10   234    x2x3x4  150.81 
11  1234  x1x2x3x4  180.66 

如果有人帮我做这件事,我将不胜感激。提前感谢。

这里有一个简单的方法:

index <- do.call(c, lapply(2:4, function(x) {
    combn(4, x, function(y) {
        sum(G[y,y] %*% B[y] * A[y])
    })
}))

index
[1]   7.438186  83.270451  37.435149  68.331049  21.273907 145.311921
[7]  87.071171  39.689388 174.958491 150.810089 180.665871

非常感谢您的快速回复@Joseph Wood。你让我的任务比以往任何时候都简单。@Rokib,没问题。。。昨晚当我回答时,我忘了添加如何轻松生成具有非常相似设置的data.frame。非常好。我忍不住再次感谢约瑟夫·伍德。
index <- do.call(c, lapply(2:4, function(x) {
    combn(4, x, function(y) {
        sum(G[y,y] %*% B[y] * A[y])
    })
}))

index
[1]   7.438186  83.270451  37.435149  68.331049  21.273907 145.311921
[7]  87.071171  39.689388 174.958491 150.810089 180.665871
do.call(rbind, lapply(2:4, function(x) {
    do.call(rbind, combn(4, x, function(y) {
        data.frame(comb. = paste(y, collapse = ""),
                   Var_comb = paste(c("", y), collapse = "x"),
                   index = sum(G[y,y] %*% B[y] * A[y]),
                   stringsAsFactors = FALSE)
    }, simplify = FALSE))
}))

   comb. Var_comb      index
1     12     x1x2   7.438186
2     13     x1x3  83.270451
3     14     x1x4  37.435149
4     23     x2x3  68.331049
5     24     x2x4  21.273907
6     34     x3x4 145.311921
7    123   x1x2x3  87.071171
8    124   x1x2x4  39.689388
9    134   x1x3x4 174.958491
10   234   x2x3x4 150.810089
11  1234 x1x2x3x4 180.665871