2012-04-23 29 views
31

Tôi có một biến giải thích là tâm sử dụng scale() được sử dụng để dự đoán một biến phản ứng:backtransform 'quy mô() `cho âm mưu

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

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

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

Tôi muốn vẽ các giá trị dự đoán, nhưng sử dụng tỷ lệ ban đầu của x thay vì tỷ lệ trung tâm. Có cách nào để sắp xếp backtransform hoặc đảo ngược quy mô s.x?

Cảm ơn!

Trả lời

38

hãy xem tại địa chỉ:

attributes(d$s.x) 

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

ví dụ:

> 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

đáp ứng đẹp 1 nên 'cái attr (sx, 'quy mô: Trung tâm') 'được' attr (d $ sx, 'scaleed: center') '? –

+0

@TylerRinker Cảm ơn, nó nên. Đã sửa! – Justin

+1

Câu trả lời tuyệt vời Justin. Cảm ơn rất nhiều. Và nhờ Tyler Rinker đã chú ý đến lỗi đánh máy. – smillig

12

Đối với một khung dữ liệu hoặc ma trận:

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 

Hãy cẩn thận khi sử dụng các chức năng như 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

Cảm ơn! Điều này đã giúp tôi tính toán lại cụm * trung tâm * sau một cụm kMeans với ma trận được chia tỷ lệ. 'center <- t (áp dụng (clustering $ center, 1, function (r) r * attr (scaled_mat, 'scaleed: scale') + attr (scaled_mat, 'scaleed: center')))' Câu trả lời được chấp nhận không . – kadrian

+0

Tôi đang làm nhiệm vụ chính xác của bạn @kadrian nhưng tại sao chức năng này không hoạt động trên dữ liệu được chia tỷ lệ của tôi ?? – Seymour

4

tôi cảm thấy như thế này phải là một chức năng phù hợp, đây là nỗ lực của tôi lúc đó:

#' 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

Và để giải trí, tôi đã thêm nó vào phiên bản github của gói 'stackoverflow'. –

Các vấn đề liên quan