给定矩阵内矢量的所有可能组合 - R.

时间:2014-05-21 02:43:57

标签: r

与之前的问题类似。我收到一条错误消息说"数据错误[,j]:下标超出范围"我无法理解为什么。

我只是试图获取给定矩阵中所有向量的乘积并存储在三维数组中,以测试多元回归中交互项的重要性。我提供了一段示例代码,非常感谢任何帮助。

a     <- array( 1 , c( 3 ,1 ) )
b     <- array( 2 , c( 3 ,1 ) )
d     <- array( 3 , c( 3 ,1 ) )
Data  <- array( c( a , b , d ) , c( 3 , 3 ) )
#
Sdata   <-  array( dim( Data ) , c( 2 , 1 ) )
    Q       <-  ( Sdata[ 2 , 1 ] * ( Sdata[ 2 , 1 ] - 1 ) ) / 2
    #
    Combos  <-  array( 0 , c( Sdata[ 1 , 1 ] , Sdata[ 2 , 1 ] , Sdata[ 2 , 1 ] - 1 ) )
    #
    Scombos <-  array( dim( Combos ) , c( 3 , 1 ) )
    #
   for( k in 1 : Scombos[ 2 , 1 ] - 1 ){
      for( j in k + 1 : Scombos[ 2 , 1 ]  ){
        Combos[ , j , k ]   <-  Data[ , j ] * Data[ , k ]                 
      }
   }

1 个答案:

答案 0 :(得分:1)

@Seth是正确的,你应该使用lm(...)的公式接口来生成交互术语。但是既然你问如何成对地创建列的每个可能的产品,这是一种方式。

df     <- data.frame(Data)
comb   <- data.frame(combn(colnames(df),2),stringsAsFactors=F)
result <- do.call(cbind,lapply(comb,function(x)df[,x[1]]*df[,x[2]]))
colnames(result) <- sapply(comb,paste,collapse=".")
result
#      X1.X2 X1.X3 X2.X3
# [1,]     2     3     6
# [2,]     2     3     6
# [3,]     2     3     6