Чи сплайни перевищують дані?


47

Моя проблема : Нещодавно я зустрічався зі статистиком, який повідомив мені, що сплайни корисні лише для дослідження даних і піддаються надмірній відповідності, тому не корисні для прогнозування. Він вважав за краще досліджувати прості полиноми ... Оскільки я великий фанат сплайнів, і це суперечить моїй інтуїції, мені цікаво дізнатися, наскільки ці аргументи справедливі, і чи існує велика група анти-сплайн- активісти там?

Передумови : Коли я створюю свої моделі, я намагаюся дотримуватися Франка Харрелла, стратегії регресійного моделювання (1). Він стверджує, що обмежені кубічні сплайни є вагомим інструментом для дослідження безперервних змінних. Він також стверджує, що поліноми бідні при моделюванні певних відносин, таких як пороги, логарифмічні (2). Для перевірки лінійності моделі він пропонує тест ANOVA для сплайну:

H0:β2=β3==βk1=0

Я переглянув Google, щоб переобладнати сплайни, але не знайшов корисного (крім загальних попереджень про не занадто багато вузлів). На цьому форумі, здається, є перевага для сплайн-моделювання, Коласса , Харрелл , Гунг .

Я знайшов одну публікацію в блозі про поліноми, про чорт перенапруги, який говорить про передбачення поліномів. Допис закінчується цими коментарями:

В якійсь мірі приклади, представлені тут, є обманом - поліноміальна регресія, як відомо, є дуже ненадійною. Набагато краще на практиці використовувати сплайни, а не многочлени.

Тепер це підштовхнуло мене перевірити, як спрацюють сплайни на прикладі:

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"))

Надає таке зображення: Порівняння сплайнів і многочленів

На закінчення я не знайшов багато чого, що переконувало б переглядати сплайни, чого я пропускаю?

  1. Ф. А. Гаррелл, стратегії регресійного моделювання: із застосуванням до лінійних моделей, логістичної регресії та аналізу виживання, передрук у твердій обкладинці твердої обкладинки 1-е видання. 2001. Спрингер, 2010.
  2. Ф. А. Гаррелл, К. Л. Лі та Б. Г. Поллок, “Регресійні моделі в клінічних дослідженнях: визначення взаємозв'язків між прогнозами та реакцією”, 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

Починаючи з цієї публікації, я опублікував статтю, яка розглядає нелінійність за віком на великому наборі даних. Додаток порівнює різні методи, і я написав про це повідомлення в блозі .


16
Чесно кажучи, я не бачу, звідки береться твій друг-статистик. Ви можете обтягувати поліномами та сплайнами так само. Переоснащення походить з вашого класу моделей, що мають надмірну місткість; Що відрізняє продуктивність різних моделей, це те, як вони обмежують їх потужність. Для (природних) сплайнів - це розміщення вузлів та число, для поліномів - це ступінь.
хлопець

1
@guy: Це теж моє переконання, ви завжди можете переобладнати своїми даними незалежно від того, яким методом ви користуєтесь. Під час уроку регресії мій професор сказав мені, що поліноми згинаються там, де трапляється більшість даних, тим самим роблячи крайності більш надійними. Хоча я не знайшов жодної статті, яка підтверджує це твердження.
Макс Гордон

Усі криві у вашому першому графіку не відповідають даних у крайній правій частині.
Еміль Фрідман

1
Чи пов'язаний розмір "х" у наведених графіках з часом? Якщо це так, жоден із цих методів не є підходящим, оскільки обидва є «перспективними» в тому сенсі, що вони використовують для моделювання сусідні точки (з обох сторін).
аріельф

@arielf: Ні x не призначений як часова змінна. Я розглядав це як деяку змінну, де ми вибираємо максимальну кількість спостережень у центрі. У моєму дослідженні ми не дивимося в майбутнє так багато, я вважаю, що це більше в області висновку, ніж передбачення. Ця змінна призначена для рівня холестерину, артеріального тиску, ІМТ або іншої поширеної безперервної змінної.
Макс Гордон

Відповіді:


18

Переобладнання виходить з дозволу занадто великого класу моделей. Це стає трохи хитромудрим з моделями з безперервними параметрами (наприклад, сплайни та поліноми), але якщо дискретизувати параметри на деяку кількість різних значень, ви побачите, що збільшення кількості вузлів / коефіцієнтів збільшить кількість доступних моделей в експоненціальному масштабі . Для кожного набору даних є сплайн і поліном, який точно підходить, якщо ви дозволяєте достатньо коефіцієнтів / вузлів. Можливо, сплайн з трьома вузлами перевищує багаточлен з трьома коефіцієнтами, але це навряд чи справедливе порівняння.

Якщо у вас низька кількість параметрів і великий набір даних, ви можете бути впевнені, що ви не перестараєтеся. Якщо ви хочете спробувати більшу кількість параметрів, ви можете спробувати перехресну перевірку в тестовому наборі, щоб знайти найкраще число, або ви можете використовувати такий критерій, як мінімальна довжина опису .

EDIT : Як вимагається в коментарях, приклад того, як можна застосувати MDL. Спершу ви маєте справу з тим, що ваші дані є безперервними, тому вони не можуть бути представлені у кінцевому коді. Для простоти будемо сегментувати простір даних у вікні сторони а замість опису точок даних опишемо поля, у які потрапляють дані. Це означає, що ми втрачаємо деяку точність, але можемо зробити довільно маленькими, тому це не має великого значення.ϵϵϵ

Тепер завдання полягає в тому, щоб описати набір даних якомога коротше за допомогою якогось многочлена. Спочатку опишемо многочлен. Якщо це поліном n-го порядку, нам просто потрібно зберегти (n + 1) коефіцієнти. Знову ж таки, нам потрібно дискретизувати ці значення. Після цього нам потрібно зберегти спочатку значення у кодуванні без префікса (щоб ми знали, коли припинити читання), а потімn + 1nn+1значення параметрів. За допомогою цієї інформації одержувач нашого коду міг відновити поліном. Потім ми додаємо решту інформації, необхідної для зберігання набору даних. Для кожної точки даних ми даємо значення x, а потім скільки полів вгору або вниз точка даних лежить від полінома. Обидва значення ми зберігаємо в кодуванні без префіксу, щоб короткі значення вимагали декількох біт, і нам не потрібні роздільники між точками. (Ви можете скоротити код для x-значень, лише зберігаючи прирости між значеннями)

Принциповим моментом є компроміс. Якщо я вибираю поліном a-порядку (наприклад, f (x) = 3.4), то модель зберігається дуже просто, але для значень y я по суті зберігаю відстань до середнього. Більше коефіцієнтів дає мені кращий поліном (і, таким чином, коротші коди для значень y), але мені доведеться витратити більше бітів на опис моделі. Модель, яка дає найкоротший код для ваших даних, найкраще відповідає критерію MDL.

(Зверніть увагу, що це відоме як "сирий MDL", і ви можете внести деякі вдосконалення для вирішення різних технічних проблем).


Дякую Петру за вашу відповідь. Я намагався обернути голову навколо MDL, особливо як її застосувати. Було б добре, щоб це було пояснено на основі одного з моїх прикладів. Як нестатист мені подобається робити приклади, перш ніж я можу зрозуміти основну логістику. Приклад монети у статті Wiki не дойшов до мене ...
Макс Гордон

Я додав приклад.
Пітер

Дякую Петро за приклад, зараз мені це набагато зрозуміліше.
Макс Гордон

20

Статистики сперечаються про поліноміальне пристосування для віків, і з мого досвіду, це зводиться до цього:

Шпонки - це в основному ряд різних рівнянь, зібраних разом, що, як правило, збільшує точність інтерпольованих значень за рахунок можливості проектування поза діапазоном даних. Це добре, якщо ви знаєте, що ваші дані є чистими та надходять із послідовного джерела, і якщо ви намагаєтесь описати ймовірність наявності різних значень у діапазоні значень. Однак ми зазвичай не дізнаємось стільки про теоретичні основи, що керують нашими даними, оскільки новий сплайн починається тоді, коли старий сплайн перестає точно описувати дані. Це робить передбачення значень поза нашими даними майже марними.

Тепер сплайни не є унікальними в цьому відношенні. Поліноміальні функції насправді страждають від тієї ж проблеми, якщо ми просто підходимо до даних і не використовуємо теоретичну основу для вибору змінних. Ті, у кого є добре сформована теорія, яка визначає, які змінні дозволяти змінюватись і на скільки довірятимуть здатності складної поліномії екстраполювати прогнози поза даними.

Однак багато статистиків працюють з даними без допомоги заздалегідь встановленої теоретичної бази, і це підштовхує деяких людей до простих многочленів. Вони пояснюють, що менш гнучка функція, яка відповідає даним, швидше точно прогнозує значення за межами даних, оскільки функція менша ймовірність коливання аномалій всередині даних. Хоча я спілкувався з цього приводу з людьми, які віддають перевагу простим поліномам, я ніколи не відчував себе анти-сплайн-групи. Це здається, що прості поліноми змушують деяких статистиків відчувати себе більш комфортно, щоб уникнути перевитрати.

Відмова від відповідальності

Особисто я не схильний використовувати шпонки або прості поліноми з більшістю своїх даних, тому що я працюю в полі з багатьма заздалегідь встановленими теоретичними рамками. Крім того, я зазвичай спостерігав за збиранням даних і можу отримати гідне розуміння того, що визначало результати. У цьому випадку я будую більше логічний алгоритм і тестую придатність алгоритму, а не перевіряю придатність поліноміальної функції. Ви можете додати це зерно солі до моєї відповіді.


18
Поліноми набагато чутливіші до аномалій в даних, ніж сплайни. Аутлер в будь-якій точці набору даних має величезний глобальний ефект, тоді як в сплайнах ефект локальний.
хлопець

Я бачу вашу думку, і це правда, якщо ви використовуєте досконалий інформаційний підхід або не маєте достатньої кількості інформації про природу даних. Багато статистиків (включаючи мене) припускають недосконалу інформацію та намагаються застосувати критерії виключення на основі відомої інформації, перш ніж намагатися підходити до даних. Тоді небезпечні люди, що втратили лиць, теоретично повинні бути виключені із спроби пристосування. Якщо у вас немає відомої інформації про природу даних (а це досить поширене явище), то ви застрягли, намагаючись обійти сторонніх людей.
Дінр

5
Мені доведеться краще переконатись, що регресія сплайсів екстраполює більш небезпечно, ніж поліноми.
Френк Харрелл

1
Це не щось нове. Скоріше, це різниця між статистикою, яка проводиться на ранніх стадіях розуміння, порівняно з пізнішими етапами розуміння. Чим більше ви розумієте систему, тим менше ви покладаєтесь на пристосовані функції і тим більше ви покладаєтесь на теоретичні моделі.
Дінр

1
Як щодо використання обмежених кубічних сплайнів, які обмежують функції лінійними зовні точками даних (я читаю книгу Гаррела). У будь-якому випадку екстраполяція завжди підозріла. Подумайте про експеримент, який виявив надпровідність або плазму. Теорію слід доводити експериментами! Я думаю, які функції підходити більше стосуються проблеми інтерполяції. Без теорії, я думаю, ви б не змогли вибрати лише одну модель із прогнозованими помилками (також невідомим розподілом) та невідомим розподілом y | x, навіть якщо вам дадуть достатньо даних.
KH Kim
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.