Learn R Programming

multiway (version 1.0-2)

nscale: Scale n-th Dimension of Array

Description

Slab-scale within each level of the specified mode. Can input 2-way, 3-way, and 4-way arrays, or input a list containing array elements (see Note). With X a matrix (I-by-J) there are two options:
mode=1:
x[i,j]*sqrt(ssnew/sumsq(x[i,])) mode=2:
x[i,j]*sqrt(ssnew/sumsq(x[,j]))
With X a 3-way array (I-by-J-by-K) there are three options:
mode=1:
x[i,j,k]*sqrt(ssnew/sumsq(x[i,,])) mode=2:
x[i,j,k]*sqrt(ssnew/sumsq(x[,j,])))
mode=3:
x[i,j,k]*sqrt(ssnew/sumsq(x[,,k])) mode=1:
With X a 4-way array (I-by-J-by-K-by-L) there are four options:
mode=1:
x[i,j,k,l]*sqrt(ssnew/sumsq(x[i,,,])) mode=2:
x[i,j,k,l]*sqrt(ssnew/sumsq(x[,j,,]))
mode=3:
x[i,j,k,l]*sqrt(ssnew/sumsq(x[,,k,])) mode=4:
x[i,j,k,l]*sqrt(ssnew/sumsq(x[,,,l]))

Usage

nscale(X,mode=1,ssnew=1) nrescale(X,mode=1,ssnew=1)

Arguments

X
Array (2-way, 3-way, or 4-way) or a list containing array elements.
mode
Mode to scale within (set mode=0 to scale across all modes).
ssnew
Desired sum-of-squares for each level of scaled mode.

Value

Returns scaled version of X.

Examples

Run this code
##########   EXAMPLE 1   ##########
X <- matrix(rnorm(2000),100,20)
Xr <- nscale(X,mode=2)          # scale columns to ssnew=1
colSums(Xr^2)
Xr <- nscale(X,mode=2,ssnew=2)  # scale columns to ssnew=2
colSums(Xr^2)


##########   EXAMPLE 2   ##########
Xold <- X <- matrix(rnorm(400),20,20)
iter <- 0
chk <- 1
# iterative rescaling of modes 1 and 2
while(iter<500 & chk>=10^-9){
  Xr <- nscale(Xold,mode=1)
  Xr <- nscale(Xr,mode=2)
  chk <- sum((Xold-Xr)^2)
  Xold <- Xr
  iter <- iter + 1
}
iter
rowSums(Xr^2)
colSums(Xr^2)


##########   EXAMPLE 3   ##########
X <- array(rnorm(20000),dim=c(100,20,10))
Xc <- nscale(X,mode=2)   # scale within columns
rowSums(aperm(Xc,perm=c(2,1,3))^2)


##########   EXAMPLE 4   ##########
X <- array(rnorm(100000),dim=c(100,20,10,5))
Xc <- nscale(X,mode=4)   # scale across 4-th mode
rowSums(aperm(Xc,perm=c(4,1,2,3))^2)


##########   EXAMPLE 5   ##########
X <- replicate(5,array(rnorm(20000),dim=c(100,20,10)),simplify=FALSE)
Xc <- nscale(X,ssnew=(20*10*5))   # mean square of 1
rowSums(sapply(Xc, function(x) rowSums(x^2))) / (20*10*5)

Run the code above in your browser using DataLab