Как сделать кусочно-линейную регрессию с несколькими неизвестными узлами?


14

Есть ли пакеты для кусочно-линейной регрессии, которые могут автоматически определять несколько узлов? Благодарю. Когда я использую пакет Strucchange. Я не мог обнаружить точки изменения. Я понятия не имею, как он обнаруживает точки изменения. Из графиков я мог видеть, что есть несколько моментов, которые могут помочь мне выбрать их. Может ли кто-нибудь привести пример здесь?


1
Похоже, это тот же вопрос, что и stats.stackexchange.com/questions/5700/… . Если он существенно отличается, пожалуйста, сообщите нам об этом, отредактировав свой вопрос, чтобы отразить различия; в противном случае мы закроем его как дубликат.
whuber

1
Я отредактировал вопрос.
Хонгланг Ван

1
Я думаю, что вы можете сделать это как задачу нелинейной оптимизации. Просто напишите уравнение функции, которую нужно установить, с коэффициентами и расположением узлов в качестве параметров.
mark999

1
Я думаю, что segmentedпакет - это то, что вы ищете.
AlefSin

1
У меня была идентичная проблема, я решил ее с помощью segmentedпакета R : stackoverflow.com/a/18715116/857416
другой бен

Ответы:



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 подогнанных линий. Я постараюсь объяснить на примере. Имейте в виду, однако, что вопрос о том, сколько точек разрыва следует найти в данных, аналогичен вопросу о том, «как долго длится побережье Британии?». как в одной из работ Бенуа Мандельброта (математика) о фракталах. И есть компромисс между количеством точек разрыва и глубиной регрессии.

Теперь к примеру.

yxxy

xyR2line1R2line2sumofR2valuesstandarddeviationofR2111,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,0001,9781,0000,70711190,97090,02710,99800,66731280,89510,11391,00900,55231370,77340,25581,02920,36591460,61340,43211,04550,12811550,43210,61341,04550,12821640,25580,77331,02910,36591730,11390,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

These y values have the graph:

idealized data

Which clearly has two break points. For the sake of argument we will calculate the R^2 correlation values (with the Excel cell formulas (European dot-comma style)):

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

for all possible non-overlapping combinations of two fitted lines. All the possible pairs of R^2 values have the graph:

R^2 values

The question is which pair of R^2 values should we choose, and how do we generalize to multiple break points as asked in the title? One choice is to pick the combination for which the sum of the R-square correlation is the highest. Plotting this we get the upper blue curve below:

sum of R squared and standard deviation of R squared

The blue curve, the sum of the R-squared values, is the highest in the middle. This is more clearly visible from the table with the value 1,0455 as the highest value. However it is my opinion that the minimum of the red curve is more accurate. That is, the minimum of the standard deviation of the R^2 values of the fitted regression lines should be the best choice.

Piece wise linear regression - Matlab - multiple break points


1

Существует довольно хороший алгоритм, описанный в Tomé and Miranda (1984) .

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

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


0

... прежде всего вы должны делать это итерациями и по некоторому информативному критерию, например, AIC AICc BIC Cp; потому что вы можете получить «идеальную» подгонку, если число узлов K = количество точек данных N, хорошо. ... сначала поставить K = 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. On their website they say it fits a joinpoint model where "several different lines are connected together at the 'joinpoints'". And further: "The user supplies the minimum and maximum number of joinpoints. The program starts with the minimum number of joinpoint (e.g. 0 joinpoints, which is a straight line) and tests whether more joinpoints are statistically significant and must be added to the model (up to that maximum number)."

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


0

Для того, чтобы подогнать к данным кусочную функцию:

enter image description here

где a1,a2,п1,Q1,п2,Q2,п3,Q3неизвестные параметры, которые должны быть приблизительно вычислены, есть очень простой метод (не итеративный, без начального предположения, легко кодируемый на любом математическом компьютерном языке). Теория приведена на странице 29 в статье: https://fr.scribed.com/document/380941024/Regression-par-morceaux-Piecewise-Regression-pdf и со страницы 30:

enter image description here

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

enter image description here

Без разбросанных данных этот пример не очень важен. Другие примеры с разбросанными данными показаны в ссылочной статье.


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)

enter image description here

Или подытожим:

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

Отказ от ответственности: я разработчик mcp.


The use of "detect" in the question indicates the number--and even the existence--of changepoints are not known beforehand.
whuber
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.