Моя проблема : я недавно встретил статистика, который сообщил мне, что сплайны полезны только для исследования данных и подвержены переобучению, таким образом, бесполезны при прогнозировании. Он предпочел исследовать с помощью простых полиномов ... Так как я большой поклонник сплайнов, и это противоречит моей интуиции, мне интересно узнать, насколько верны эти аргументы, и существует ли большая группа против сплайнов. активисты там?
Предыстория : я пытаюсь следовать Фрэнку Харреллу, стратегиям регрессионного моделирования (1), когда создаю свои модели. Он утверждает, что ограниченные кубические сплайны являются допустимым инструментом для исследования непрерывных переменных. Он также утверждает, что многочлены плохо моделируют определенные отношения, такие как пороговые значения, логарифмические (2). Для проверки линейности модели он предлагает тест ANOVA для сплайна:
Я гуглил по переоснащению сплайнами, но не нашел, что это очень полезно (кроме общих предупреждений о том, что не следует использовать слишком много узлов). На этом форуме, кажется, предпочтение для моделирования сплайна, Kolassa , Харрелл , Кун .
Я нашел одно сообщение в блоге о многочленах, дьяволе переоснащения, которое говорит о предсказании многочленов. Пост заканчивается этими комментариями:
В некоторой степени примеры, представленные здесь, являются мошенничеством - полиномиальная регрессия, как известно, весьма ненадежна. Гораздо лучше на практике использовать сплайны, а не полиномы.
Теперь это побудило меня проверить, как сплайны будут работать в следующем примере:
library(rms)
p4 <- poly(1:100, degree=4)
true4 <- p4 %*% c(1,2,-6,9)
days <- 1:70
set.seed(7987)
noise4 <- true4 + rnorm(100, sd=.5)
reg.n4.4 <- lm(noise4[1:70] ~ poly(days, 4))
reg.n4.4ns <- lm(noise4[1:70] ~ ns(days,4))
dd <- datadist(noise4[1:70], days)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4[1:70] ~ rcs(days,5))
plot(1:100, noise4)
nd <- data.frame(days=1:100)
lines(1:100, predict(reg.n4.4, newdata=nd), col="orange", lwd=3)
lines(1:100, predict(reg.n4.4ns, newdata=nd), col="red", lwd=3)
lines(1:100, predict(reg.n4.4rcs_ols, newdata=nd), col="darkblue", lwd=3)
legend("top", fill=c("orange", "red","darkblue"),
legend=c("Poly", "Natural splines", "RCS - ols"))
Дает следующее изображение:
В заключение я не нашел много, что убедило бы меня в пересмотре сплайнов, что мне не хватает?
- FE Harrell, Стратегии регрессионного моделирования: с приложениями к линейным моделям, логистической регрессии и анализу выживания, перепечатка в мягком переплете в твердом переплете 1-е изд. 2001. Springer, 2010.
- Ф.Э. Харрелл, К.Л. Ли и Б.Г. Поллок, «Модели регрессии в клинических исследованиях: определение взаимосвязей между предикторами и реакцией», JNCI J Natl Cancer Inst, vol. 80, нет 15, с. 1198–1202, октябрь 1988 г.
Обновить
Комментарии заставили меня задуматься о том, что происходит в пределах диапазона данных, но с неудобными кривыми. В большинстве случаев я не выхожу за границы данных, как показано в примере выше. Я не уверен, что это квалифицируется как предсказание ...
В любом случае, вот пример, где я создаю более сложную линию, которая не может быть переведена в полином. Так как большинство наблюдений находится в центре данных, я попытался смоделировать это также:
library(rms)
cmplx_line <- 1:200/10
cmplx_line <- cmplx_line + 0.05*(cmplx_line - quantile(cmplx_line, .7))^2
cmplx_line <- cmplx_line - 0.06*(cmplx_line - quantile(cmplx_line, .3))^2
center <- (length(cmplx_line)/4*2):(length(cmplx_line)/4*3)
cmplx_line[center] <- cmplx_line[center] +
dnorm(6*(1:length(center)-length(center)/2)/length(center))*10
ds <- data.frame(cmplx_line, x=1:200)
days <- 1:140/2
set.seed(1234)
sample <- round(rnorm(600, mean=100, 60))
sample <- sample[sample <= max(ds$x) &
sample >= min(ds$x)]
sample_ds <- ds[sample, ]
sample_ds$noise4 <- sample_ds$cmplx_line + rnorm(nrow(sample_ds), sd=2)
reg.n4.4 <- lm(noise4 ~ poly(x, 6), data=sample_ds)
dd <- datadist(sample_ds)
options("datadist" = "dd")
reg.n4.4rcs_ols <- ols(noise4 ~ rcs(x, 7), data=sample_ds)
AIC(reg.n4.4)
plot(sample_ds$x, sample_ds$noise4, col="#AAAAAA")
lines(x=ds$x, y=ds$cmplx_line, lwd=3, col="black", lty=4)
nd <- data.frame(x=ds$x)
lines(ds$x, predict(reg.n4.4, newdata=ds), col="orange", lwd=3)
lines(ds$x, predict(reg.n4.4rcs_ols, newdata=ds), col="lightblue", lwd=3)
legend("bottomright", fill=c("black", "orange","lightblue"),
legend=c("True line", "Poly", "RCS - ols"), inset=.05)
Это дает следующий сюжет:
Обновление 2
Начиная с этого поста, я опубликовал статью, которая рассматривает нелинейность для возраста в большом наборе данных. Приложение сравнивает различные методы, и я написал пост в блоге об этом .
источник
Ответы:
Переоснащение происходит из-за слишком большого класса моделей. Это становится немного сложнее с моделями с непрерывными параметрами (такими как сплайны и полиномы), но если вы разберете параметры на некоторое количество отдельных значений, вы увидите, что увеличение количества узлов / коэффициентов увеличит количество доступных моделей в геометрической прогрессии. , Для каждого набора данных есть сплайн и многочлен, которые точно подходят, при условии, что вы разрешите достаточно коэффициентов / узлов. Может случиться так, что сплайн с тремя узлами больше, чем многочлен с тремя коэффициентами, но это вряд ли справедливое сравнение.
Если у вас небольшое количество параметров и большой набор данных, вы можете быть уверены, что не перегружаете. Если вы хотите попробовать большее количество параметров, вы можете попробовать провести перекрестную проверку в вашем тестовом наборе, чтобы найти наилучшее число, или вы можете использовать критерий, такой как Минимальная длина описания .
Основополагающим моментом здесь является компромисс. Если я выбираю многочлен a-порядка (например, f (x) = 3.4), то модель очень проста для хранения, но для значений y я, по сути, сохраняю расстояние до среднего. Чем больше коэффициентов, тем лучше полином для подгонки (и, следовательно, более короткие коды для значений y), но мне придется потратить больше битов на описание модели. Модель, которая дает вам кратчайший код для ваших данных, наилучшим образом соответствует критерию MDL.
(Обратите внимание, что это называется «сырым MDL», и вы можете внести некоторые уточнения для решения различных технических проблем).
источник
Статистики спорят о полиномиальной подгонке целую вечность, и, по моему опыту, это сводится к следующему:
Сплайны - это, в основном, ряд различных уравнений, соединенных вместе, что имеет тенденцию к повышению точности интерполированных значений за счет возможности проецирования за пределы диапазона данных. Это хорошо, если вы знаете, что ваши данные являются чистыми и поступают из непротиворечивого источника, и если вы пытаетесь описать вероятность присутствия различных значений в вашем диапазоне значений. Однако обычно мы не так много узнаем о теоретических основах наших данных, поскольку новый сплайн начинается, когда старый сплайн перестает точно описывать данные. Это делает прогноз значений вне наших данных практически бесполезным.
Теперь сплайны не являются уникальными в этом отношении. Полиномиальные функции на самом деле страдают от той же проблемы, если мы просто подбираем данные и не используем теоретическую основу для выбора переменных. Те, у кого есть хорошо сформированная теория, определяющая, какие переменные можно варьировать и на сколько будет больше доверять способности сложной полиномиальной функции экстраполировать предсказания за пределы данных.
Многие статистики, однако, работают с данными без помощи заранее созданной теоретической основы, и это подталкивает некоторых людей к простым полиномам. Они полагают, что менее гибкая функция, которая подходит для данных, с большей вероятностью будет точно прогнозировать значения вне данных, потому что эта функция менее подвержена влиянию аномалий в данных. Хотя у меня были разговоры об этом с людьми, которые предпочитают простые полиномы, я никогда не чувствовал себя сплайновой группой. Больше похоже на то, что простые полиномы заставляют некоторых статистиков чувствовать себя более комфортно, избегая переобучения.
отказ
Лично я не склонен использовать сплайны или простые полиномы с большинством моих данных, потому что я работаю в области со многими заранее установленными теоретическими основами. Кроме того, я обычно наблюдаю за сбором данных и могу получить приличное представление о том, что определяло результаты. В этом случае я строю больше логического алгоритма и проверяю его пригодность, а не проверяю пригодность полиномиальной функции. Вы можете добавить это зерно соли в мой ответ.
источник