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