Як зробити кускову лінійну регресію з кількома невідомими вузлами?


14

Чи є якісь пакети, щоб зробити кусочну лінійну регресію, яка може виявити кілька вузлів автоматично? Спасибі. Коли я використовую пакунок strucchange. Я не міг виявити точки зміни. Я поняття не маю, як він визначає точки зміни. З сюжетів я міг бачити, що є кілька моментів, я хочу, щоб це могло допомогти мені вибрати їх. Хтось може навести приклад тут?


1
Це , здається, те ж питання , як stats.stackexchange.com/questions/5700 / ... . Якщо це суттєво відрізняється, повідомте нас, редагуючи ваше запитання, щоб відобразити відмінності; в іншому випадку ми закриємо це як дублікат.
whuber

1
Я відредагував питання.
Honglang Wang

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

1
Я думаю, що segmentedпакет - це те, що ви шукаєте.
AlefSin

1
У мене була однакова проблема, вирішив її з segmentedпакетом R : stackoverflow.com/a/18715116/857416
інший бен

Відповіді:


8

Чи застосовуватиметься MARS ? R має пакет, earthякий реалізує його.


8

Взагалі, хоч трохи дивно хотіти підходити до лінійки. Однак якщо ви дійсно бажаєте цього зробити, то алгоритм MARS є найбільш прямим. Це створить функцію по одному вузлу за раз; а потім, як правило, обрізає кількість вузлів для боротьби із надмірними деревами ала рішення. Ви можете отримати доступ до алгоритму MARS в R через earthабо mda. Загалом, він підходить до GCV, який не так далеко відібраний від інших інформаційних критеріїв (AIC, BIC тощо)

MARS насправді не дасть вам "оптимальної" форми, оскільки вузли вирощуються один за одним. Справді було б досить важко помістити справді "оптимальну" кількість вузлів, оскільки можливі перестановки розміщення вузлів швидко вибухнуть.

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

Ось декілька прикладів коду для пенізованих лінійних згладжувальних сплайнів у R:

require(mgcv);data(iris);
gam.test <- gam(Sepal.Length ~ s(Petal.Width,k=6,bs='ps',m=0),data=iris)
summary(gam.test);plot(gam.test);

Фактичні вибрані вузли не обов'язково співвідносяться з будь-якими справжніми точками перегину.


3

Я запрограмував це з нуля один раз кілька років тому, і у мене є файл Matlab для виконання лінійної регресії на моєму комп’ютері. Приблизно від 1 до 4 точок прориву обчислювально можливо для приблизно 20 точок вимірювання або близько того. 5 або 7 пунктів перерв починає бути дуже багато.

Чисто математичний підхід, як я бачу, - це спробувати всі можливі комбінації, як це запропонував користувач mbq, у питанні, пов'язаному з коментарем під вашим запитанням.

Оскільки приталені лінії є послідовними та суміжними (без перекриттів), комбінаторика буде слідувати трикутнику Паскаля. Якби між перетвореними точками даних були сегменти рядків, я вважаю, що комбінаторика замість цього буде слідувати числам Стірлінга другого роду.

Найкращим рішенням, на мій погляд, є вибір комбінації прилаштованих ліній, що має найнижче стандартне відхилення значень кореляції R ^ 2 пристосованих ліній. Спробую пояснити на прикладі. Пам’ятайте, що те, що запитувати, скільки пунктів перерв слід знайти в даних, схоже на запитання «Як довго берег Британії?» як в одній з робіт Бенуа Мандельброта (математика) про фрактали. І існує компроміс між кількістю точок зриву та глибиною регресу.

Тепер до прикладу.

ухху

хуR2лiне1R2лiне2сумоfR2vалуесстангаrггеviатiоноfR2111,0000,04001,04000,6788221,0000,01181,01180,6987331,0000,00041,00040,7067441,0000,00311,00310,7048551,0000,01351,01350,6974661,0000,02381,02380,6902771,0000,02771,02770,6874881,0000,02221,02220,6913991,0000,00931,00930,700410101,000-1,9781,0000,70711190,97090,02710,99800,66731280,89510,1139 рік1,00900,55231370,77340,2558 рік1,02920,36591460,61340,43211,04550,1281 рік1550,43210,61341,04550,1282 рік1640,2558 рік0,77331,02910,36591730,1139 рік0,89511,00900,55231820,02720,97080,99800,667219101,0001,0000,70712020,00941,0001,00940,70042130,02221,0001,02220,69142240,02781,0001,02780,68742350,02391,0001,02390,69022460,01361,0001,01360,69742570,00321,0001,00320,70482680,00041,0001,00040,70682790,01181,0001,01180,698728100,041,0001,040,6788

Ці значення y мають графік:

ідеалізовані дані

Який явно має дві точки розриву. Для аргументу ми обчислимо значення кореляції R ^ 2 (за формулами комірки Excel (стиль європейської крапки з комами)):

=INDEX(LINEST(B1:$B$1;A1:$A$1;TRUE;TRUE);3;1)
=INDEX(LINEST(B1:$B$28;A1:$A$28;TRUE;TRUE);3;1)

для всіх можливих комбінованих двох поєднаних ліній. Усі можливі пари значень R ^ 2 мають графік:

R ^ 2 значення

Питання полягає в тому, яку пару значень R ^ 2 слід вибрати, і як узагальнити до декількох точок розриву, як задано в заголовку? Один вибір - вибрати комбінацію, для якої сума кореляції R-квадрата є найвищою. Складаючи це, ми отримуємо верхню синю криву внизу:

сума R квадрата і стандартне відхилення R квадрата

1,0455

Шматка мудра лінійна регресія - Matlab - декілька точок розриву


1

Існує досить приємний алгоритм, описаний у Tomé and Miranda (1984) .

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

Код та графічний інтерфейс доступні у Fortran та IDL на веб-сайті: http://www.dfisica.ubi.pt/~artome/linearstep.html


0

... в першу чергу ви повинні зробити це за ітераціями та за деяким інформаційним критерієм, таким як AIC AICc BIC Cp; тому що ви можете отримати "ідеальну" підгонку, якщо кількість вузлів K = кількість od точок даних N, добре. ... спочатку ставимо К = 0; оцінити L = K + 1 регресії, наприклад, обчислити AICc; тоді припустимо мінімальну кількість точок даних на окремому сегменті, скажімо, L = 3 або L = 4, ок ... ставимо K = 1; починати з L-го даних як першого вузла, обчислювати SS або MLE, ... і покроково наступну точку даних у вигляді вузла, SS або MLE, до останнього вузла в даних N - L; виберіть розташування з найкращим підходом (SS або MLE), обчисліть AICc ... ... поставте K = 2; ... використовуйте всі попередні регресії (тобто їх SS або MLE), але крок за кроком розділіть один сегмент на всі можливі частини ... виберіть розташування з найкращим підходом (SS або MLE), обчисліть AICc ... якщо останній AICc виявляється більшим, ніж попередній: припиніть ітерації! Це оптимальне рішення за критерієм AICc, добре


AIC, BIC не можна використовувати, оскільки вони штрафуються за додаткові параметри, що, очевидно, не так.
HelloWorld

0

Я одного разу натрапив на програму під назвою Joinpoint . На своєму веб-сайті вони кажуть, що вона відповідає моделі точки з'єднання, де "кілька різних ліній з'єднано разом у" точках з'єднання "". І далі: "Користувач надає мінімальну та максимальну кількість точок приєднання. Програма починається з мінімальної кількості точок приєднання (наприклад, 0 точок приєднання, що є прямою лінією) і перевіряє, чи більше об'єднаних точок є статистично значущими та повинні бути додані до моделі (до цієї максимальної кількості). "

NCI використовує його для моделювання тенденцій раку, можливо, воно відповідає вашим потребам.


0

Для того, щоб пристосуватись до даних детально:

введіть тут опис зображення

а1,а2,p1,q1,p2,q2,p3,q3

введіть тут опис зображення

Наприклад, з точними даними, які надає Матс Гранвік, результат:

введіть тут опис зображення

Без розкиданих даних цей приклад не дуже вагомий. Інші приклади з розкиданими даними показані у посиланні.


0

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

Веб-сайт mcp містить багато прикладних прикладів, наприклад,

library(mcp)

# Define the model
model = list(
  response ~ 1,  # plateau (int_1)
  ~ 0 + time,    # joined slope (time_2) at cp_1
  ~ 1 + time     # disjoined slope (int_3, time_3) at cp_2
)

# Fit it. The `ex_demo` dataset is included in mcp
fit = mcp(model, data = ex_demo)

Потім ви можете візуалізувати:

plot(fit)

введіть тут опис зображення

Або підсумуйте:

summary(fit)

Family: gaussian(link = 'identity')
Iterations: 9000 from 3 chains.
Segments:
  1: response ~ 1
  2: response ~ 1 ~ 0 + time
  3: response ~ 1 ~ 1 + time

Population-level parameters:
    name match  sim  mean lower  upper Rhat n.eff
    cp_1    OK 30.0 30.27 23.19 38.760    1   384
    cp_2    OK 70.0 69.78 69.27 70.238    1  5792
   int_1    OK 10.0 10.26  8.82 11.768    1  1480
   int_3    OK  0.0  0.44 -2.49  3.428    1   810
 sigma_1    OK  4.0  4.01  3.43  4.591    1  3852
  time_2    OK  0.5  0.53  0.40  0.662    1   437
  time_3    OK -0.2 -0.22 -0.38 -0.035    1   834

Відмова від відповідальності: Я розробник ПК.


Використання "виявити" у запитанні вказує кількість - і навіть існування - точок змін не заздалегідь відомі.
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.