Выполните линейную регрессию, но заставьте решение пройти через определенные точки данных


14

Я знаю, как выполнить линейную регрессию на множестве точек. То есть я знаю, как подогнать полином по своему выбору для данного набора данных (в смысле LSE). Однако чего я не знаю, так это как заставить мое решение пройти через некоторые конкретные пункты моего выбора. Я видел, как это было сделано раньше, но я не могу вспомнить, как была вызвана процедура, не говоря уже о том, как это было сделано.

В качестве очень простого и конкретного примера, давайте скажем, что у меня есть 100 точек, разбросанных по плоскости xy, и я решил вписать в них полином любого порядка. Я знаю, как выполнить эту линейную регрессию очень хорошо. Однако, давайте скажем, что я хочу «заставить» свое решение пройти, скажем, три из моих точек данных в x-координатах , и , (и их соответствующие y-координаты конечно).х = 19 х = 89x=3x=19x=89

Как называется эта общая процедура, как она выполняется и есть ли какие-то конкретные подводные камни, о которых мне нужно знать?

Редактировать:

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

Благодарность!


Почему вы называете это «линейным», если вы используете полином? Каждая точка, через которую вы хотите пройти, - это ограничение, которое снизит вашу степень свободы. Затем вы можете использовать ограниченный алгоритм оптимизации.
curious_cat

4
Это линейно, потому что вы находите коэффициенты для линейной комбинации. Например, если вы хотите поместить свои данные в куб, то вы находите коэффициенты ( ) s . y = c 0 + c 1 x + c 2 x 2 + c 3 x 3cy=c0+c1x+c2x2+c3x3
Спейси

1
@ Мохаммад: Еще один способ приблизиться к тому, что вы хотите, - это использовать взвешенное решение наименьших квадратов и дать очень большие веса точкам, через которые вы хотите, чтобы линия регрессии прошла. Это должно заставить решение пройти очень близко к точкам, которые вы выбираете.
Джейсон Р

@JasonR Рад видеть тебя здесь. Да, WLS действительно интересный соперник. Я пошел с ответом whubers из-за умной полиномиальной факторизации, и потому что она хорошо поддерживает структуру ошибок.
Spacey

Ответы:


19

Рассматриваемая модель может быть написана

y=p(x)+(xx1)(xxd)(β0+β1x++βpxp)+ε

где - это многочлен степени проходящий через заранее определенные точки и - случайный. (Используйте интерполяционный полином Лагранжа .) Запись позволяет переписать эту модель какp(xi)=yi( x 1 , y 1 ) , , ( x d , y d ) ε ( x - x 1 ) ( x - x d ) = r ( x )d1(x1,y1),,(xd,yd)ε(xx1)(xxd)=r(x)

yp(x)=β0r(x)+β1r(x)x+β2r(x)x2++βpr(x)xp+ε,

которая является стандартной множественной регрессии МНК проблема с той же структурой, что и ошибки оригинала , где независимые переменные являются величины . Просто вычислите эти переменные и запустите знакомое вам регрессионное программное обеспечение , убедившись, что оно не содержит постоянного члена. Применяются обычные предостережения о регрессиях без постоянного термина; в частности, может быть искусственно высоким; обычные интерпретации не применяются.p+1i = 0 , 1 , , p R 2r(x)xi, i=0,1,,pR2

(Фактически, регрессия через начало координат является частным случаем этой конструкции, где , и , так что модель имеет вид )( x 1 , y 1 ) = ( 0 , 0 ) p ( x ) = 0 y = β 0 x + + β p x p + 1 + ε .d=1(x1,y1)=(0,0)p(x)=0y=β0x++βpxp+1+ε.


Вот рабочий пример (в R)

# Generate some data that *do* pass through three points (up to random error).
x <- 1:24
f <- function(x) ( (x-2)*(x-12) + (x-2)*(x-23) + (x-12)*(x-23) )  / 100
y0 <-(x-2) * (x-12) * (x-23) * (1 + x - (x/24)^2) / 10^4  + f(x)
set.seed(17)
eps <- rnorm(length(y0), mean=0, 1/2)
y <- y0 + eps
data <- data.frame(x,y)

# Plot the data and the three special points.
plot(data)
points(cbind(c(2,12,23), f(c(2,12,23))), pch=19, col="Red", cex=1.5)

# For comparison, conduct unconstrained polynomial regression
data$x2 <- x^2
data$x3 <- x^3
data$x4 <- x^4

fit0 <- lm(y ~ x + x2 + x3 + x4, data=data)
lines(predict(fit0), lty=2, lwd=2)

# Conduct the constrained regressions
data$y1 <- y - f(x)
data$r <- (x-2)*(x-12)*(x-23)
data$z0 <- data$r
data$z1 <- data$r * x
data$z2 <- data$r * x^2

fit <- lm(y1 ~ z0 + z1 + z2 - 1, data=data)
lines(predict(fit) + f(x), col="Red", lwd=2)

участок

Три фиксированные точки показаны сплошным красным цветом - они не являются частью данных. Неограниченное полиномиальное наименьшее квадратичное соответствие четвертого порядка показано черной пунктирной линией (имеет пять параметров); ограниченная подгонка (порядка пяти, но только с тремя свободными параметрами) показана красной линией.

Проверка вывода наименьших квадратов ( summary(fit0)и summary(fit)) может быть поучительной - я оставляю это заинтересованному читателю.


что бы это ни было интересно ... Я бы соврал, если бы сказал, что только что все понял, но я перевариваю это, пока мы говорим. Если я правильно понимаю, здесь я в основном решаю для s как обычно, но они умножаются на , а не просто на s, как раньше, да? Если это правильно, то как вы точно вычисляете ? Спасибо. r ( x ) x i x i r ( x )βr(x)xixir(x)
Спейси

Я добавил рабочий пример, Мухаммед.
whuber

О, отлично. Я буду изучать это. Используя ваш пример, все же можно заставить поли проходить точки, которые являются частью данных, правда?
Spacey

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

Твой пост поднял меня прошлой ночью. Я научил себя губам. (LIP интересен. Это как разложение Фурье, но с полисами).
Спейси

9

Если вы хотите, чтобы линия регрессии прошла через одну точку, это можно сделать окольным путем. Допустим, ваша точка зрения . Вы просто повторно центрируете свои данные с этой точкой в ​​качестве источника. То есть вы вычитаете из каждого значения , а из каждого значения . Теперь точка находится в начале координатной плоскости. Затем вы просто подгоняете линию регрессии, подавляя перехват (заставляя перехват быть равным (0,0). Поскольку это линейное преобразование, вы можете легко преобразовать все впоследствии, если хотите). (xi,yi) x y i yxixyiy

Если вы хотите, чтобы линия проходила через две точки в плоскости XY, это тоже довольно легко сделать. Любые две точки могут соответствовать линии. Вы можете использовать формулу точка-наклон, чтобы вычислить ваш наклон, а затем использовать одну из точек, наклон и уравнение линии, чтобы найти точку пересечения.

Обратите внимание, что может оказаться невозможным провести прямую линию через три точки в координатной плоскости. Тем не менее, мы можем гарантировать, что они могут идеально соответствовать параболе (то есть, используя и и ). Для этого тоже есть алгебра, но по мере продвижения вверх, может быть проще установить модель с программным обеспечением, включив в набор данных только эти три (более) точки. Точно так же вы могли бы получить прямую линию, которая наилучшим образом приближает эти три точки, подгоняя модель, которая имеет доступ только к этим трем точкам. X 2XX2


Однако в этот момент я вынужден упомянуть, что это, возможно, не очень хорошая вещь (если ваша теория не дает очень веских причин для этого). Возможно, вы также захотите изучить байесовскую регрессию , где вы можете позволить своей модели находить наилучшее сочетание информации в ваших данных и некоторой предварительной информации (которую вы могли бы использовать, например, для сильного смещения вашего перехвата в ноль, без заставляя его).


1
Gung, спасибо за ваш ответ. Я немного изменил свой вопрос. Я не знал о Байесовской регрессии, но взгляну на нее. Боюсь, я не совсем понимаю, как конкретно, с алгоритмической точки зрения, случай с одной точкой и двумя точками вы упомянули. В частности, для одной точки я понимаю удаление и повторное добавление и к каждой точке до и после блока, но я не понимаю, как точно сделать этот блок. В случае с 2 пунктами, я боюсь, я вообще не понимаю, что там делать. Благодарю. й яxiyi
Спейси

2
Хотя добавление еще трех точек и их взвешивание ( в виде ответа Glen_b) может создать такое соответствие, интерпретация любого статистического вывода будет проблематичной: потребуются некоторые корректировки.
whuber

6

Чтобы добавить немного дополнительной информации к превосходному охвату @ gung линейного случая, в случае полинома более высокого порядка вы можете сделать это точно или приблизительно (но в значительной степени так, как вам нужно).

Во-первых, обратите внимание, что степени свободы для многочлена (или даже любой подобранной функции) должны быть как минимум такими же, как и число «известных» точек. Если степени свободы равны, данные вообще не нужны, так как кривая полностью определена. Если существует больше «известных» точек, вы не можете решить их (если только они не лежат на одном и том же полиноме указанной степени, и в этом случае будет достаточно любого подмножества подходящего размера). С этого момента, я просто буду говорить о том, когда многочлен имеет больше df, чем известные точки (например, кубика - с 4df - и три известные точки, так что кубика не переопределяется известными точками и не определяется ими полностью) ,

1) «кривая должна проходить через эту точку» - это линейное ограничение на параметры, приводящее к ограниченному оцениванию или ограниченному наименьшему квадрату (хотя оба члена могут включать в себя другие вещи, кроме линейных ограничений, таких как ограничения положительности). Вы можете включить линейные ограничения либо

  (а) изменение параметризации для неявного включения каждого ограничения, приводящего к модели более низкого порядка.

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

2) Другой способ - через взвешенную регрессию. Если вы даете известным точкам достаточно большой вес, вы можете получить, по существу, такое же соответствие, как в (1). Это часто легко реализуется, может быть значительно быстрее, чем повторная параметризация, и может быть сделано в пакетах, которые не предлагают ограниченного соответствия.

Все предостережения @ gung применяются


Glen_b, я не учел взвешенную регрессию. Это может быть способ пойти на это. Я положил его в свой список дел. Я верю, что могу научить себя этому без инцидентов. Что касается (1), не могли бы вы подробно остановиться на этом аспекте повторной параматеризации? Кроме того, как вы «называете» то, что я пытаюсь сделать, когда я заставляю полином пройти определенные точки? Часть проблемы в том, что я не знаю, что гуглить. Если я знаю, как это называется, я могу дополнить то, что вы говорите, онлайн-материалами. Благодарю.
Spacey

См. Мои правки выше, которые включают в себя некоторые поисковые термины и ссылку с некоторыми подробностями.
Glen_b

2
+1 Взвешенная регрессия - хорошая идея. Может потребоваться некоторая корректировка выходной статистики, например оценки ошибки RMS.
whuber

@whuber +1 в самом деле, если статистика (например, , , ... std ошибки и т. д.) предназначена для того, чтобы относиться только к неизвестным точкам (что, скорее всего, и нужно) кроме оценок параметров и подгоночных значений, исходная статистика почти все будет неправильной. Первоначально я напечатал предложение, относящееся к этому, но я, кажется, удалил его перед публикацией; важно упомянуть об этом. F R 2s2FR2
Glen_b

Спасибо за ваш ответ Glen_b, хотя я принял @whuber, я все же многому научился у вас.
Спейси
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.