Я несколько сбит с толку относительно того, почему функция sd
в R возвращает массив для матричного ввода (я полагаю, для обеспечения обратной совместимости, это всегда будет).Это очень странное поведение для меня:
#3d input, same same
print(length(mean(array(rnorm(60),dim=c(3,4,5)))))
print(length(sd(array(rnorm(60),dim=c(3,4,5)))))
#1d input, same same
print(length(mean(array(rnorm(60),dim=c(60)))))
print(length(sd(array(rnorm(60),dim=c(60)))))
#2d input, different!
print(length(mean(array(rnorm(60),dim=c(12,5)))))
print(length(sd(array(rnorm(60),dim=c(12,5)))))
Я получаю
[1] 1
[1] 1
[1] 1
[1] 1
[1] 1
[1] 5
То есть sd
ведет себя иначе, чем mean
, когда вход представляет собой двумерный массив (ипо-видимому, только в этом случае!) Рассмотрим эту функцию, которая не смогла перемасштабировать каждый столбец k-мерного массива на стандартное отклонение:
re.scale <- function(x) {
#rescale by the standard deviation of each column
scales <- apply(x,2,sd)
ret.val <- sweep(x,2,scales,"/")
}
#this works just fine
x <- array(rnorm(60),dim=c(12,5))
y <- re.scale(x)
#this throws a warning
x <- array(rnorm(60),dim=c(3,4,5))
y <- re.scale(x)
Есть ли какая-то другая функция для замены sd
без этого странногоповедение?Как правильно написать re.scale
?Или функция Z-оценка за столбцом?