如何使用R中的多路径包在并行因子分析中设置非负性约束?

时间:2016-12-23 14:54:51

标签: r multidimensional-array decomposition

我想用荧光光谱数据进行平行因子分析(PARAFAC)。我有一个三维数组(39x151x43),我传递给“multiway”包中的parafac函数。到目前为止,它运行良好,但我得到一些组件的负值。我在手册中读到,可以指定非负性的约束。但是,我不明白约束选项的向量应该如何。当我尝试执行以下操作时,我收到一条错误,指出“输入'const'必须是3个元素向量,为每个模式指定约束”

#### creating dummy values for Stackoverflow ####
A <- c(1:39)
B <- rnorm(151, mean =1, sd=0.5)
C <- rnorm(43, mean=1, sd = 0.5)

myArray <- array(c(A,B,C), dim = c(39,151,43))
dim(myArray)

library(multiway)  # load the library
myModel <- parafac(myArray, nfac = 3) # how to set const? 
#Input 'const' must be  3  element vector specifying constraint for each mode
有些google-fu无济于事。矢量如何看起来像parafac函数接受它?任何帮助或指向答案将不胜感激。

1 个答案:

答案 0 :(得分:0)

约束矢量的参数是不受约束的:0,正交:1,非负的:2。

如果所有三个输入A,B,C都是非负的,则约束矢量应为const=c(2,2,2)

#Always remember to use set.seed when performing random sampling
#this ensures the example is reproducible 

set.seed(123)
A <- c(1:39)
B <- rnorm(151, mean =1, sd=0.5)
C <- rnorm(43, mean=1, sd = 0.5)

myArray <- array(c(A,B,C), dim = c(39,151,43))
dim(myArray)

library(multiway)

#Without constraints  
myModel_Default <- parafac(myArray, nfac = 3) 

#Percentage of negative elements

sum(myModel_Default$A<0)/length(myModel_Default$A)
#[1] 0.3333333
sum(myModel_Default$B<0)/length(myModel_Default$B)
#[1] 0.6865342
sum(myModel_Default$C<0)/length(myModel_Default$C)
#[1] 0.3488372

#With constraints

myModel_NonNeg <- parafac(myArray, nfac = 3,const=c(2,2,2))

sum(myModel_NonNeg$A<0)/length(myModel_NonNeg$A)
#[1] 0
sum(myModel_NonNeg$B<0)/length(myModel_NonNeg$B)
#[1] 0
sum(myModel_NonNeg$C<0)/length(myModel_NonNeg$C)
#[1] 0