Ich hatte in letzter Zeit ein Haarausfall-Ereignis, bei dem ich nach vielen Schmerzen herausfand, dass die Funktion scale()
bei Variablen mich daran hinderte, die predict
-Funktion zu verwenden. Ich war ziemlich verblüfft, dass etwas so Einfaches wie das Zentrieren einer Variablen ihren Typ grundlegend verändern würde. Ich bin nicht gut darin, dies zu erklären, also ist es wahrscheinlich einfacher, zu sehen, was ich meine, indem ich einfach den Code unten ausführe.Zentrierende Variablen in R verhindert Vorhersage?
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)
ich den Fehler:
Error: variables ‘a.center’, ‘b.center’ were specified with different types from the fit
verglichen, die zu diesem Code, der nicht zentrierten Variablen nicht verwendet und arbeitet als es soll:
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)
Ich habe auch bemerkt, dass wenn Sie str(df)
tun, dass die zentrierten Variablen etwas haben, das "attr" unter ihnen heißt:
'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
Also meine Frage ist: Was zum Teufel passiert hier? Sollte ich nur die scale
Funktion nicht verwenden? Gibt es eine einfache Lösung dafür, und was ist das "attr", was ich in str(df)
sehe?