我最近發生了一次頭髮扯裂事件,經過很多痛苦後,我發現在變量上使用scale()
函數阻止了我使用函數predict
。我非常驚訝地發現,將一個變量集中在一起就會從根本上改變它的類型。我並不擅長解釋這一點,所以通過運行下面的代碼可能更容易看出我的意思。R中的中心變量會阻止預測嗎?
df = data.frame(
a=runif(100,45,90),
b=runif(100,0,60),
y=runif(100,-30,60)
)
df$a.center=scale(df$a,scale=FALSE)
df$b.center=scale(df$b,scale=FALSE)
m<-lm(y ~ a.center + b.center, data=df)
predict_df = data.frame(
a.center=c(-10,10),
b.center=c(-5,5)
)
predict_df$predicted = predict(m,predict_df)
我得到的錯誤:
Error: variables ‘a.center’, ‘b.center’ were specified with different types from the fit
相比,要這個代碼,不使用中心的變量,可以作爲它應該:
m2<-lm(y ~ a + b, data=df)
predict_df2 = data.frame(
a=c(-10,10),
b=c(-5,5)
)
predict_df2$predicted = predict(m2,predict_df2)
我也注意到,當做str(df)
時,居中變量在它們下面有一些名爲「attr」的東西:
'data.frame': 100 obs. of 5 variables:
$ a : num 71.4 57.1 83.9 49 65 ...
$ b : num 54.56 16.76 52.43 34.11 2.43 ...
$ y : num -14.1 -20.8 31.3 -23 51.1 ...
$ a.center: num [1:100, 1] 2.51 -11.77 14.96 -19.89 -3.87 ...
..- attr(*, "scaled:center")= num 68.9
$ b.center: num [1:100, 1] 23.31 -14.49 21.18 2.86 -28.82 ...
..- attr(*, "scaled:center")= num 31.3
所以我的問題是:這裏發生了什麼?我應該不要使用scale
函數嗎?是否有一個簡單的解決辦法,以及我在str(df)
中看到的「attr」是什麼?