2017-01-08 2 views
1

Wenn ich versuche, log Funktion auf die gleiche regelmäßige und sparse Matrix anwenden, sind die Ergebnisse unterschiedlich. Gibt es etwas, was ich bei der Anwendung dieser Art von Funktionen beachten sollte? Unten ist ein reproduzierbares Beispiel.Warum unterscheiden sich die Ergebnisse, wenn eine logarithmische Funktion auf die gleiche reguläre Matrix und die spärliche Matrix angewendet wird?

TestMatrix = matrix(c(3,1,0,0,0,4,0,1,0,0,2,1,1,2,0,6,1,0,1,0,1,0,0,0,0),5,byrow = TRUE) 
TestSparseMatrix = Matrix(TestMatrix,sparse = TRUE) 
# Logarithmic function when applied to regular matrix 
-log(TestMatrix/rowSums(TestMatrix), 2) 


#Output 
#   [,1]  [,2]  [,3]  [,4] [,5] 
#[1,] 0.4150375 2.000000  Inf  Inf Inf 
#[2,] 0.3219281  Inf 2.321928  Inf Inf 
#[3,] 1.5849625 2.584963 2.584963 1.584963 Inf 
#[4,] 0.4150375 3.000000  Inf 3.000000 Inf 
#[5,] 0.0000000  Inf  Inf  Inf Inf 


# Logarithmic function when applied to Sparse matrix 
-log(TestSparseMatrix/rowSums(TestSparseMatrix), 2) 


# Output 
#   [,1]  [,2]  [,3]  [,4] [,5] 
#[1,] 0.2876821 1.386294  Inf  Inf Inf 
#[2,] 0.2231436  Inf 1.609438  Inf Inf 
#[3,] 1.0986123 1.791759 1.791759 1.098612 Inf 
#[4,] 0.2876821 2.079442  Inf 2.079442 Inf 
#[5,] 0.0000000  Inf  Inf  Inf Inf 

Antwort

4

log() ignoriert base für eine Sparse-Matrix (ein "S4" Objekt). Mit log2 beseitigt das Problem:

-log2(TestSparseMatrix/rowSums(TestSparseMatrix)) 

Haben Sie einen Read auf "S4 Methoden" Teil ?log. Ich glaube, das ist nicht allgemein bekannt.

Note that this means that the S4 generic for ‘log’ has a signature 
with only one argument, ‘x’, but that ‘base’ can be passed to 
methods (but will not be used for method selection). On the other 
hand, if you only set a method for the ‘Math’ group generic then 
‘base’ argument of ‘log’ will be ignored for your class. 

Falls Sie sich fragen, können Sie weiter lesen:

?groupGeneric 
?S4groupGeneric 

oder äquivalent (wie Sie auf die oben manuellen Seiten umgeleitet wird):

?base::Math 
?methods::Math 

Das ist wirklich in Bezug darauf, wie die Gruppe "Math" definiert ist. Speziell von ?S4groupGeneric zitiert:

Note that two members of the ‘Math’ group, ‘log’ and ‘trunc’, have 
... as an extra formal argument. Since methods for ‘Math’ will 
have only one formal argument, you must set a specific method for 
these functions in order to call them with the extra argument(s). 

Was also, wenn Sie Logarithmus mit einer beliebigen nehmen wollen, gültig base, base = 3 sagen? Verwenden Formel:

log(x, base = 3) = log(x)/log(3) 

Zum Beispiel mit Ihrem TestSparseMatrix, können Sie auch tun:

-log(TestSparseMatrix/rowSums(TestSparseMatrix))/log(2) 
Verwandte Themen