# How to scale new observations for making predictions when the model was fitted with scaled data?

I understand the concept of scaling the data matrix to use in a linear regression model. For example, in R you could use:

scaled.data <- scale(data, scale=TRUE)


My only question is, for new observations for which I want to predict the output values, how are they correctly scaled? Would it be, scaled.new <- (new - mean(data)) / std(data)?

• To get the values back just do y = y_esc * sd(y) + mean(y), but that would mess with the model properties i guess, so i'm also waiting a more technical answer too! – Fernando Mar 7 '14 at 15:29
• I don't want the values back, I want to know how new instances can be correctly scaled in the same way. I've edited my question based on your comment. – SamuelNLP Mar 7 '14 at 15:31

The short answer to your question is, yes - that expression for scaled.new is correct (except you wanted sd instead of std).

It may be worth noting that scale has optional arguments which you could use:

scaled.new <- scale(new, center = mean(data), scale = sd(data))


Also, the object returned by scale (scaled.data) has attributes holding the numeric centering and scalings used (if any), which you could use:

scaled.new <- scale(new, attr(scaled.data, "scaled:center"), attr(scaled.data, "scaled:scale"))


The advantage of that appears when the original data has more than one column, so there are multiple means and/or standard deviations to consider.

• I wish there was a slightly simpler way to do this, like scaled.new <- scale(new, use.attrs = scaled.data) – wordsforthewise Mar 25 '19 at 6:32
• @wordsforthewise It wouldn't be hard to write a wrapper for scale.default to achieve that. I doubt that R-core would give it high priority. – user20637 Mar 25 '19 at 19:09
• Yeah. If I can figure out how to contribute to R-core and find time to do it, I might do that. – wordsforthewise Mar 26 '19 at 0:33

There are now simpler ways to do this. For example, the preprocess function of the caret package

library(caret)
preproc <- preProcess(data, method = c("center", "scale")
scaled.new <- predict(preproc, newdata = new)


or scale_by in the standardize package

or using the receipes package

library(recipes); library(dplyr)
rec <- recipe(~ ., data) %>% step_normalize(all_numeric()) %>% prep()
scaled.new <- rec %>% bake(new)

• Upvoted. You might want to correct case in "the preprocess function of the caret package" and spelling in "using the receipes package" – user20637 Jan 19 at 20:43