почему sd в R возвращает вектор для матричного ввода, и что я могу с этим поделать? - PullRequest
6 голосов
/ 21 августа 2011

Я несколько сбит с толку относительно того, почему функция 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-оценка за столбцом?

Ответы [ 2 ]

7 голосов
/ 21 августа 2011

Он ведет себя как документ на странице справки SD.В самом верху он объявляет:

«Если x является матрицей или фреймом данных, возвращается вектор стандартного отклонения столбцов.»

Обратите внимание, что это не означает, чтомассивы включены, поэтому включены только массивы с двумя измерениями.Если вы хотите остановить это поведение, просто сделайте из него вектор с помощью c ():

 sd( c(array(rnorm(60),dim=c(12,5))) )
 # [1] 0.9505643

Я вижу, что вы добавили запрос на оценки по столбцу z.Попробуйте это для матриц:

colMeans(x)/sd(x)

И это для массивов (хотя определение «столбца» может потребовать уточнения:

apply(x, 2:3, mean)/apply(x, 2:3, sd)   # will generalize to higher dimensions
3 голосов
/ 11 октября 2016

Действия sd были изменены:

1. версия 2.13.2 (2011-09-30) и более ранние версии

> set.seed(1)
> sd(array(rnorm(60),dim=c(12,5))) 
[1] 0.8107276 1.1234795 0.7925743 0.6186082 0.9464160

Описание

Эта функция вычисляет стандартное отклонение значений в х. Если na.rm TRUE, тогда пропущенные значения удаляются перед вычислением продолжается. Если x представляет собой матрицу или фрейм данных, вектор стандарта Отклонение столбцов возвращается.


2. Версия R 2.14.0 (2011-10-31) - 2.15.3 (2013-03-01)

> set.seed(1)
> sd(array(rnorm(60),dim=c(12,5))) 
[1] 0.8107276 1.1234795 0.7925743 0.6186082 0.9464160
 WARNING:
sd(<matrix>) is deprecated.
 Use apply(*, 2, sd) instead. 

Подробнее

До версии 2.14.0 sd (dfrm) работал непосредственно для data.frame. DFRM. Это устарело , и вы должны использовать sapply (dfrm, сд).


3. Версия R 3.0.0 (2013-04-03) и выше

> sd(array(rnorm(60),dim=c(12,5))) 
[1] 0.8551688
>
(no WARNIG)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...