Пошук точки зміни даних за кусочно лінійною функцією


10

Привітання,

Я виконую дослідження, які допоможуть визначити розмір спостережуваного простору та час, що минув з моменту великого удару. Сподіваємось, ви можете допомогти!

У мене є дані, що відповідають кусково-лінійній функції, за якою я хочу виконувати дві лінійні регресії. Є точка, в якій нахил і перехоплення змінюються, і мені потрібно (написати програму для), щоб знайти цю точку.

Думки?


3
Яка політика щодо перехресного опублікування? Точно таке ж питання було задано на math.stackexchange.com: math.stackexchange.com/questions/15214/…
mpiktas

Що не так у виконанні простих нелінійних найменших квадратів у цьому випадку? Невже я пропускаю щось очевидне?
grg s

Я б сказав, що похідна функції цілі щодо параметра точки зміни досить негладна
Андре Хольцнер

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

Відповіді:


1

mcpПакет може зробити це. Скажіть, ваші дані є

Спочатку давайте змоделюємо деякі дані:

df = data.frame(x = 1:100,
                y = c(rnorm(40, 10 + (1:40)*0.5),
                      rnorm(60, 10 + 40*0.5 -8 + (1:60)*0.2)))

Тепер давайте подивимось, чи зможемо ми відновити точку зміни на 40 (і значення параметрів), використовуючи mcp:

model = list(
  y ~ 1 + x,  # linear segment
  ~ 1 + x  # another linear segment
)
library(mcp)
fit = mcp(model, df)

Накресліть його. Сірі лінії є випадковими малюнками від пристосування, показуючи, що вона фіксує тенденцію. Синя крива - це орієнтовне місце зміни точки:

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

Давайте розглянемо окремі оцінки параметрів. int_є перехопленнями, x_є нахилами на х, і cp_є точками зміни:

summary(fit)

Population-level parameters:
    name  mean lower upper Rhat n.eff
    cp_1 40.48 40.02 41.00    1  2888
   int_1 11.12  9.11 13.17    1   778
   int_2 21.72 20.09 23.49    1   717
 sigma_1  3.23  2.76  3.69    1  5343
     x_1  0.46  0.36  0.54    1   724
     x_2  0.21  0.16  0.26    1   754

Відмова: Я розробник mcp.


8

R пакет strucchange може допомогти вам. Подивіться на віньєтку, вона має хороший огляд, як вирішити подібні проблеми.


6

Якщо кількість балів не надто велика, ви можете спробувати всі можливості. Припустимо, що точки єХi=(хi,уi) де i=1,..,N. Чим, можливо, ви можете петлюj з 2 до N-2 і прилаштувати дві лінії до обох {Х1,...,Хj} і {Х(j+1),...,ХN}. Нарешті, ви вибираєтеj для яких сума суми залишків у квадраті для обох рядків мінімальна.


Я опублікував відповідь на основі вашої простої, але ефективної пропозиції.
HelloWorld


3

Також сегментований пакет допоміг мені з подібними проблемами в минулому.


На жаль, пакет вимагає початкового значення для точки перерви.
HelloWorld

Також segmentedне можна моделювати перехоплення-зміни між сегментами - лише перехоплення для першого сегмента.
Йонас Ліндельов

2

Я спирався на відповідь mbq, що шукаю всі можливості. Крім того, я роблю це:

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

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

Давайте перевіримо цей простий підхід за допомогою легкого тестового випадку:

x <- c(-50:50)
y <- abs(x)
plot(x,y,pch=19)

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

Точка розриву очевидно дорівнює нулю. Використовуйте наступний сценарій R:

f <- function(x, y)
{
    d <- data.frame(x=x, y=y)
    d <- d[order(x),]
    r <- data.frame(k=rep(0,length(x)-4), sums=rep(0,length(x)-4))

    plm <- function(i)
    {
        d1 <- head(d,i)
        d2 <- tail(d,-i)

        # Make sure we've divided the region perfectly        
        stopifnot(nrow(d1)+nrow(d2) == nrow(d))

        m1 <- lm(y~x, data=d1)
        m2 <- lm(y~x, data=d2)

        r <- list(m1, m2)
        r
    }

    lapply(2:(nrow(d)-3), function(i)
    {
        r$k[i-2] <<- d[i,]$x

        # Fit two piecewise linear models
        m <- plm(i)

        # Add up the sum of squares for residuals
        r$sums[i-2] <<- sum((m[[1]]$residuals)^2) + sum((m[[2]]$residuals)^2)
    })

    b <- r[which.min(r$sums),]    
    b
}

Підійдіть кусково-лінійні моделі для всіх можливих комбінацій:

f(x,y)
   k sums
   0    0

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

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