Statystyka t nie może mieć prawie nic do powiedzenia na temat zdolności predykcyjnej cechy, i nie należy ich używać do wykluczania predyktora lub pozwalania predyktorom na model predykcyjny.
Wartości P mówią, że fałszywe cechy są ważne
Rozważ następujący scenariusz w R. Stwórzmy dwa wektory, pierwszy to po prostu losowych rzutów monetą:5000
set.seed(154)
N <- 5000
y <- rnorm(N)
Drugi wektor to obserwacji, z których każda jest losowo przypisana do jednej z losowych klas jednakowej wielkości:5005000500
N.classes <- 500
rand.class <- factor(cut(1:N, N.classes))
Teraz dopasowujemy model liniowy do przewidzenia y
danego rand.classes
.
M <- lm(y ~ rand.class - 1) #(*)
Poprawna wartość dla wszystkich współczynników wynosi zero, żaden z nich nie mają żadnej mocy predykcyjnej. Niemniej jednak wiele z nich ma znaczenie na poziomie 5%
ps <- coef(summary(M))[, "Pr(>|t|)"]
hist(ps, breaks=30)
W rzeczywistości powinniśmy oczekiwać, że około 5% z nich będzie znaczących, nawet jeśli nie mają mocy predykcyjnej!
Wartości P nie wykrywają ważnych funkcji
Oto przykład w innym kierunku.
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)
Stworzyłem dwa skorelowane predyktory, każdy z mocą predykcyjną.
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
Wartości p nie wykrywają mocy predykcyjnej obu zmiennych, ponieważ korelacja wpływa na to, jak dokładnie model może oszacować dwa indywidualne współczynniki na podstawie danych.
Statystyki wnioskowania nie są w stanie powiedzieć o mocy predykcyjnej lub znaczeniu zmiennej. Używanie ich w ten sposób jest nadużywaniem tych pomiarów. Dostępne są znacznie lepsze opcje wyboru zmiennych w predykcyjnych modelach liniowych, rozważ użycie glmnet
.
(*) Zauważ, że pomijam tutaj przecięcie, więc wszystkie porównania dotyczą linii zerowej, a nie średniej grupy z pierwszej klasy. To była sugestia @ Whubera.
Ponieważ doprowadziło to do bardzo interesującej dyskusji w komentarzach, oryginalny kod był
rand.class <- factor(sample(1:N.classes, N, replace=TRUE))
i
M <- lm(y ~ rand.class)
co doprowadziło do następującego histogramu