Т-статистика может почти ничего не сказать о прогнозирующей способности объекта, и их не следует использовать для того, чтобы отсеивать предиктор или допускать предикторы в прогностическую модель.
Значения P говорят, что ложные характеристики важны
Рассмотрим следующую настройку сценария в R. Давайте создадим два вектора, первый - просто случайных бросков монет:5000
set.seed(154)
N <- 5000
y <- rnorm(N)
Второй вектор - наблюдений, каждое из которых случайным образом отнесено к одному из случайных классов одинакового размера:5005000500
N.classes <- 500
rand.class <- factor(cut(1:N, N.classes))
Теперь мы вписываемся линейная модель для прогнозирования с y
учетом rand.classes
.
M <- lm(y ~ rand.class - 1) #(*)
Правильное значение для всех коэффициентов равна нулю, ни один из них не имеют никакого предсказательной силы. Тем не менее, многие из них значимы на уровне 5%
ps <- coef(summary(M))[, "Pr(>|t|)"]
hist(ps, breaks=30)
На самом деле, мы должны ожидать, что около 5% из них будут значительными, даже если у них нет предсказательной силы!
P-значения не могут обнаружить важные функции
Вот пример в другом направлении.
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)
Я создал два коррелированных предиктора, каждый из которых обладает предсказательной силой.
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
Значения p не могут определить предсказательную силу обеих переменных, поскольку корреляция влияет на то, насколько точно модель может оценить два отдельных коэффициента по данным.
Статистические данные не предназначены для того, чтобы рассказать о предсказательной силе или важности переменной. Это злоупотребление этими измерениями, чтобы использовать их таким образом. Есть намного лучшие варианты, доступные для выбора переменной в прогнозирующих линейных моделях, рассмотрите использование glmnet
.
(*) Обратите внимание, что здесь я перебиваю перехват, поэтому все сравнения проводятся с нулевой базовой точкой, а не с групповым средним значением первого класса. Это было предложение @ whuber.
Так как это привело к очень интересному обсуждению в комментариях, оригинальный код был
rand.class <- factor(sample(1:N.classes, N, replace=TRUE))
и
M <- lm(y ~ rand.class)
что привело к следующей гистограмме