nneg is a generic function to transform a data
objects that contains negative values into a similar
object that only contains values that are nonnegative or
greater than a given threshold.
posneg is a shortcut for nneg(...,
method='posneg'), to split mixed-sign data into its
positive and negative part. See description for method
"posneg", in nneg.
rposneg performs the "reverse" transformation of
the posneg function.
nneg(object, ...) S4 (matrix) `nneg`(object, method = c("pmax", "posneg", "absolute", "min"), threshold = 0, shift = TRUE) posneg(...) rposneg(object, ...) S4 (matrix) `rposneg`(object, unstack = TRUE)
nneg,matrix or rposneg,matrix in
subsequent calls.threshold.
threshold. The
result consists in these two parts stacked in rows (i.e.
rbind-ed) into a single matrix, which has
double the number of rows of the input matrix
object.
threshold.
shit for details on
how the threshold is used and affects the result.threshold should be
forced (shifted) to 0 (default) or to the threshold value
itself. In other words, if shift=TRUE (default)
all entries in the result matrix are either 0 or strictly
greater than threshold. They are all greater or
equal than threshold otherwise.pos - neg, which contains half the
number of rows of object (default), or left
stacked as [pos; -neg].an object of the same class as argument object.
an object of the same type of object
signature(object = "matrix"):
Transforms a mixed-sign matrix into a nonnegative matrix,
optionally apply a lower threshold. This is the workhorse
method, that is eventually called by all other methods
defined in the NMF package.
signature(object = "NMF"): Apply
nneg to the basis matrix of an NMF
object (i.e. basis(object)). All extra arguments
in ... are passed to the method
nneg,matrix.
signature(object = "NMF"): Apply
rposneg to the basis matrix of an
NMF object.
# random mixed sign data (normal distribution)
set.seed(1)
x <- rmatrix(5,5, rnorm, mean=0, sd=5)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] -3.1323 -4.102 7.559 -0.22467 4.5949
## [2,] 0.9182 2.437 1.949 -0.08095 3.9107
## [3,] -4.1781 3.692 -3.106 4.71918 0.3728
## [4,] 7.9764 2.879 -11.073 4.10611 -9.9468
## [5,] 1.6475 -1.527 5.625 2.96951 3.0991
# pmax (default)
nneg(x)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 0.000 7.559 0.000 4.5949
## [2,] 0.9182 2.437 1.949 0.000 3.9107
## [3,] 0.0000 3.692 0.000 4.719 0.3728
## [4,] 7.9764 2.879 0.000 4.106 0.0000
## [5,] 1.6475 0.000 5.625 2.970 3.0991
# using a threshold
nneg(x, threshold=2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.000 0.000 7.559 0.000 4.595
## [2,] 0.000 2.437 0.000 0.000 3.911
## [3,] 0.000 3.692 0.000 4.719 0.000
## [4,] 7.976 2.879 0.000 4.106 0.000
## [5,] 0.000 0.000 5.625 2.970 3.099
# without shifting the entries lower than threshold
nneg(x, threshold=2, shift=FALSE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 2.000 2.000 7.559 2.000 4.595
## [2,] 2.000 2.437 2.000 2.000 3.911
## [3,] 2.000 3.692 2.000 4.719 2.000
## [4,] 7.976 2.879 2.000 4.106 2.000
## [5,] 2.000 2.000 5.625 2.970 3.099
# posneg: split positive and negative part
nneg(x, method='posneg')
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 0.000 7.559 0.00000 4.5949
## [2,] 0.9182 2.437 1.949 0.00000 3.9107
## [3,] 0.0000 3.692 0.000 4.71918 0.3728
## [4,] 7.9764 2.879 0.000 4.10611 0.0000
## [5,] 1.6475 0.000 5.625 2.96951 3.0991
## [6,] 3.1323 4.102 0.000 0.22467 0.0000
## [7,] 0.0000 0.000 0.000 0.08095 0.0000
## [8,] 4.1781 0.000 3.106 0.00000 0.0000
## [9,] 0.0000 0.000 11.073 0.00000 9.9468
## [10,] 0.0000 1.527 0.000 0.00000 0.0000
nneg(x, method='pos', threshold=2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.000 0.000 7.559 0.000 4.595
## [2,] 0.000 2.437 0.000 0.000 3.911
## [3,] 0.000 3.692 0.000 4.719 0.000
## [4,] 7.976 2.879 0.000 4.106 0.000
## [5,] 0.000 0.000 5.625 2.970 3.099
## [6,] 3.132 4.102 0.000 0.000 0.000
## [7,] 0.000 0.000 0.000 0.000 0.000
## [8,] 4.178 0.000 3.106 0.000 0.000
## [9,] 0.000 0.000 11.073 0.000 9.947
## [10,] 0.000 0.000 0.000 0.000 0.000
# absolute
nneg(x, method='absolute')
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3.1323 4.102 7.559 0.22467 4.5949
## [2,] 0.9182 2.437 1.949 0.08095 3.9107
## [3,] 4.1781 3.692 3.106 4.71918 0.3728
## [4,] 7.9764 2.879 11.073 4.10611 9.9468
## [5,] 1.6475 1.527 5.625 2.96951 3.0991
nneg(x, method='abs', threshold=2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 3.132 4.102 7.559 0.000 4.595
## [2,] 0.000 2.437 0.000 0.000 3.911
## [3,] 4.178 3.692 3.106 4.719 0.000
## [4,] 7.976 2.879 11.073 4.106 9.947
## [5,] 0.000 0.000 5.625 2.970 3.099
# min
nneg(x, method='min')
## [,1] [,2] [,3] [,4] [,5]
## [1,] 7.941 6.971 18.632 10.85 15.668
## [2,] 11.992 13.511 13.023 10.99 14.984
## [3,] 6.895 14.765 7.967 15.79 11.446
## [4,] 19.050 13.952 0.000 15.18 1.127
## [5,] 12.721 9.547 16.698 14.04 14.173
nneg(x, method='min', threshold=2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 7.941 6.971 18.632 10.85 15.67
## [2,] 11.992 13.511 13.023 10.99 14.98
## [3,] 6.895 14.765 7.967 15.79 11.45
## [4,] 19.050 13.952 0.000 15.18 0.00
## [5,] 12.721 9.547 16.698 14.04 14.17
# random
M <- nmfModel(x, rmatrix(ncol(x), 3))
## Warning: Dimensions of W and H look strange [ncol(W)= 5 > ncol(H)= 3 ]
nnM <- nneg(M)
## Warning: Dimensions of W and H look strange [ncol(W)= 5 > ncol(H)= 3 ]
basis(nnM)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 0.000 7.559 0.000 4.5949
## [2,] 0.9182 2.437 1.949 0.000 3.9107
## [3,] 0.0000 3.692 0.000 4.719 0.3728
## [4,] 7.9764 2.879 0.000 4.106 0.0000
## [5,] 1.6475 0.000 5.625 2.970 3.0991
# mixture coefficients are not affected
identical( coef(M), coef(nnM) )
## [1] TRUE
# shortcut for the "posneg" transformation
posneg(x)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 0.000 7.559 0.00000 4.5949
## [2,] 0.9182 2.437 1.949 0.00000 3.9107
## [3,] 0.0000 3.692 0.000 4.71918 0.3728
## [4,] 7.9764 2.879 0.000 4.10611 0.0000
## [5,] 1.6475 0.000 5.625 2.96951 3.0991
## [6,] 3.1323 4.102 0.000 0.22467 0.0000
## [7,] 0.0000 0.000 0.000 0.08095 0.0000
## [8,] 4.1781 0.000 3.106 0.00000 0.0000
## [9,] 0.0000 0.000 11.073 0.00000 9.9468
## [10,] 0.0000 1.527 0.000 0.00000 0.0000
posneg(x, 2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.000 0.000 7.559 0.000 4.595
## [2,] 0.000 2.437 0.000 0.000 3.911
## [3,] 0.000 3.692 0.000 4.719 0.000
## [4,] 7.976 2.879 0.000 4.106 0.000
## [5,] 0.000 0.000 5.625 2.970 3.099
## [6,] 3.132 4.102 0.000 0.000 0.000
## [7,] 0.000 0.000 0.000 0.000 0.000
## [8,] 4.178 0.000 3.106 0.000 0.000
## [9,] 0.000 0.000 11.073 0.000 9.947
## [10,] 0.000 0.000 0.000 0.000 0.000
# random mixed sign data (normal distribution)
set.seed(1)
x <- rmatrix(5,5, rnorm, mean=0, sd=5)
x
## [,1] [,2] [,3] [,4] [,5]
## [1,] -3.1323 -4.102 7.559 -0.22467 4.5949
## [2,] 0.9182 2.437 1.949 -0.08095 3.9107
## [3,] -4.1781 3.692 -3.106 4.71918 0.3728
## [4,] 7.9764 2.879 -11.073 4.10611 -9.9468
## [5,] 1.6475 -1.527 5.625 2.96951 3.0991
# posneg-transform: split positive and negative part
y <- posneg(x)
dim(y)
## [1] 10 5
# posneg-reverse
z <- rposneg(y)
identical(x, z)
## [1] TRUE
rposneg(y, unstack=FALSE)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 0.0000 0.000 7.559 0.00000 4.5949
## [2,] 0.9182 2.437 1.949 0.00000 3.9107
## [3,] 0.0000 3.692 0.000 4.71918 0.3728
## [4,] 7.9764 2.879 0.000 4.10611 0.0000
## [5,] 1.6475 0.000 5.625 2.96951 3.0991
## [6,] -3.1323 -4.102 0.000 -0.22467 0.0000
## [7,] 0.0000 0.000 0.000 -0.08095 0.0000
## [8,] -4.1781 0.000 -3.106 0.00000 0.0000
## [9,] 0.0000 0.000 -11.073 0.00000 -9.9468
## [10,] 0.0000 -1.527 0.000 0.00000 0.0000
# But posneg-transformation with a non zero threshold is not reversible
y1 <- posneg(x, 1)
identical(rposneg(y1), x)
## [1] FALSE
# random mixed signed NMF model
M <- nmfModel(rmatrix(10, 3, rnorm), rmatrix(3, 4))
# split positive and negative part
nnM <- posneg(M)
M2 <- rposneg(nnM)
identical(M, M2)
## [1] TRUE