2012-04-23 2 views
31

У меня есть объясняющей переменной, которая центрируется с помощью scale(), который используется для прогнозирования переменной отклика:backtransform `шкала()` для построения

d <- data.frame(
    x=runif(100), 
    y=rnorm(100) 
) 

d <- within(d, s.x <- scale(x)) 

m1 <- lm(y~s.x, data=d) 

Я хотел бы построить предсказанные значения, но с использованием оригинальная шкала от x, а не по центру. Есть ли способ сортировать обратную трансформацию или обратную шкалу s.x?

Спасибо!

ответ

38

взглянуть на:

attributes(d$s.x) 

d$s.x * attr(d$s.x, 'scaled:scale') + attr(d$s.x, 'scaled:center') 

, например:

> x <- 1:10 
> s.x <- scale(x) 
> s.x 
      [,1] 
[1,] -1.4863011 
[2,] -1.1560120 
[3,] -0.8257228 
[4,] -0.4954337 
[5,] -0.1651446 
[6,] 0.1651446 
[7,] 0.4954337 
[8,] 0.8257228 
[9,] 1.1560120 
[10,] 1.4863011 
attr(,"scaled:center") 
[1] 5.5 
attr(,"scaled:scale") 
[1] 3.02765 
> s.x * attr(s.x, 'scaled:scale') + attr(s.x, 'scaled:center') 
     [,1] 
[1,] 1 
[2,] 2 
[3,] 3 
[4,] 4 
[5,] 5 
[6,] 6 
[7,] 7 
[8,] 8 
[9,] 9 
[10,] 10 
attr(,"scaled:center") 
[1] 5.5 
attr(,"scaled:scale") 
[1] 3.02765 
+1

хороший ответ +1 Если 'атр (Sx,«масштабируется: центр»)' 'быть атр (d $ sx, 'scaled: center') '? –

+0

@TylerRinker Спасибо, он должен. Исправлена! – Justin

+1

Отличный ответ Джастин. Большое спасибо. И благодаря Тайлер Ринкер за то, что заметил опечатку. – smillig

12

Для кадра данных или матрицы:

set.seed(1) 
x = matrix(sample(1:12), ncol= 3) 
xs = scale(x, center = TRUE, scale = TRUE) 

x.orig = t(apply(xs, 1, function(r)r*attr(xs,'scaled:scale') + attr(xs, 'scaled:center'))) 

print(x) 
    [,1] [,2] [,3] 
[1,] 4 2 3 
[2,] 5 7 1 
[3,] 6 10 11 
[4,] 9 12 8 

print(x.orig) 
    [,1] [,2] [,3] 
[1,] 4 2 3 
[2,] 5 7 1 
[3,] 6 10 11 
[4,] 9 12 8 

Будьте осторожны при использовании таких функций, как identical():

print(x - x.orig) 
    [,1] [,2]   [,3] 
[1,] 0 0 0.000000e+00 
[2,] 0 0 8.881784e-16 
[3,] 0 0 0.000000e+00 
[4,] 0 0 0.000000e+00 

identical(x, x.orig) 
# FALSE 
+1

Спасибо! Это помогло мне вычислить кластерные центры * после кластеризации kMeans с масштабированной матрицей. 'центры <- t (применять (кластеризация $ центров, 1, функция (r) r * attr (scaled_mat, 'масштабировано: масштаб') + attr (scaled_mat, 'scaled: center')))' В принятом ответе не было , – kadrian

+0

Я нахожусь на той же самой задаче @kadrian, но почему эта функция не работает с моими масштабированными данными? – Seymour

4

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

#' Reverse a scale 
#' 
#' Computes x = sz+c, which is the inverse of z = (x - c)/s 
#' provided by the \code{scale} function. 
#' 
#' @param z a numeric matrix(like) object 
#' @param center either NULL or a numeric vector of length equal to the number of columns of z 
#' @param scale either NULL or a a numeric vector of length equal to the number of columns of z 
#' 
#' @seealso \code{\link{scale}} 
#' mtcs <- scale(mtcars) 
#' 
#' all.equal(
#' unscale(mtcs), 
#' as.matrix(mtcars), 
#' check.attributes=FALSE 
#' ) 
#' 
#' @export 
unscale <- function(z, center = attr(z, "scaled:center"), scale = attr(z, "scaled:scale")) { 
    if(!is.null(scale)) z <- sweep(z, 2, scale, `*`) 
    if(!is.null(center)) z <- sweep(z, 2, center, `+`) 
    structure(z, 
    "scaled:center" = NULL, 
    "scaled:scale" = NULL, 
    "unscaled:center" = center, 
    "unscaled:scale" = scale 
) 
} 
+0

И для удовольствия, я добавил это в версию github пакета 'stackoverflow'. –

Смежные вопросы