Die t-Statistik kann so gut wie nichts über die Vorhersagefähigkeit eines Features aussagen, und sie sollte nicht dazu verwendet werden, den Prädiktor auszublenden oder Prädiktoren in ein Vorhersagemodell zuzulassen.
P-Werte sagen, dass Störmerkmale wichtig sind
5000
set.seed(154)
N <- 5000
y <- rnorm(N)
5000500
N.classes <- 500
rand.class <- factor(cut(1:N, N.classes))
Nun passen wir ein lineares Modell an, um y
gegebene Werte vorherzusagen rand.classes
.
M <- lm(y ~ rand.class - 1) #(*)
Der korrekte Wert für alle Koeffizienten ist Null, keiner von ihnen hat eine Vorhersagekraft. Trotzdem sind viele von ihnen mit 5% signifikant
ps <- coef(summary(M))[, "Pr(>|t|)"]
hist(ps, breaks=30)
Tatsächlich sollten wir davon ausgehen, dass ungefähr 5% von ihnen signifikant sind, obwohl sie keine Vorhersagekraft haben!
P-Werte erkennen wichtige Merkmale nicht
Hier ist ein Beispiel in die andere Richtung.
set.seed(154)
N <- 100
x1 <- runif(N)
x2 <- x1 + rnorm(N, sd = 0.05)
y <- x1 + x2 + rnorm(N)
M <- lm(y ~ x1 + x2)
summary(M)
Ich habe zwei korrelierte Prädiktoren mit jeweils prädiktiver Wirkung erstellt.
M <- lm(y ~ x1 + x2)
summary(M)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.1271 0.2092 0.608 0.545
x1 0.8369 2.0954 0.399 0.690
x2 0.9216 2.0097 0.459 0.648
Die p-Werte können die Vorhersagekraft beider Variablen nicht erfassen, da die Korrelation beeinflusst, wie genau das Modell die beiden einzelnen Koeffizienten aus den Daten abschätzen kann.
Inferenzstatistiken geben keinen Aufschluss über die Vorhersagekraft oder Wichtigkeit einer Variablen. Es ist ein Missbrauch dieser Messungen, sie so zu verwenden. Es gibt viel bessere Optionen für die Variablenauswahl in vorhersagenden linearen Modellen glmnet
.
(*) Beachten Sie, dass ich hier einen Abschnitt weglasse, sodass sich alle Vergleiche auf die Grundlinie von Null und nicht auf den Gruppenmittelwert der ersten Klasse beziehen. Dies war @ Whubers Vorschlag.
Da dies zu einer sehr interessanten Diskussion in den Kommentaren führte, war der ursprüngliche Code
rand.class <- factor(sample(1:N.classes, N, replace=TRUE))
und
M <- lm(y ~ rand.class)
was zu dem folgenden Histogramm führte