2016-12-23 5 views
-1

Je veux effectuer une analyse factorielle parallèle (PARAFAC) avec des données de la spectroscopie de fluorescence. J'ai un tableau tridimensionnel (39x151x43) que je passe à la fonction parafac dans le paquet "multiway". Jusqu'à présent, cela fonctionne bien mais j'ai des valeurs négatives pour certains composants. J'ai lu dans le manuel que l'on peut spécifier des contraintes pour la non-négativité. Cependant, je ne comprends pas comment le vecteur pour l'option de contraintes devrait ressembler. Lorsque je tente de faire ce qui suit, je reçois une erreur qui dit: « Input « const » doit être 3 vecteur élément spécifiant contrainte pour chaque mode »Comment définir des contraintes pour la non-négativité dans l'analyse factorielle parallèle en utilisant le package multiway dans R?

#### 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 

Certains google-fu était vain. Comment devrait ressembler le vecteur pour que la fonction parafac l'accepte? Toute aide ou pointant vers la réponse sera grandement appréciée.

+1

S'il vous plaît lire les informations sur [comment poser une bonne question] (http: // stackoverflow .com/help/how-to-ask) et comment donner un [exemple reproductible] (http://stackoverflow.com/questions/5963269). Cela rendra beaucoup plus facile pour les autres de vous aider. – Axeman

Répondre

0

Les paramètres du vecteur de contraintes sont non contraints: 0, orthogonale: 1, non négative: 2.

Si les trois entrées A, B, C doivent être le vecteur de contrainte non négatif devrait être 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