Как уместить ломаной линией только одну из двух зависимых переменных?

Используя набор данных mtcars, я пытаюсь определить регрессионную подгонку ломаной линии mpg как функцию hp и wt с точками останова, поступающими только от hp. Вот код:

mpg = mtcars$mpg
wt = mtcars$wt
hp = mtcars$hp

reg = lm (mpg ~ hp +wt)

hp_thresh = 150
wt_thresh = 3

library(segmented)
seg.o = segmented (reg,seg.Z=~hp+wt, psi=list (hp=hp_thresh, wt=wt_thresh))
fted = broken.line (seg.o, term="hp") # mpg fit for hp breakpoints

fted$fit значения не имеют смысла (сравните их со значениями миль на галлон). Я предполагаю, что есть что-то простое, чего мне не хватает в использовании функций.

ИЗМЕНИТЬ:

Чтобы уточнить: я хочу использовать только сегментированные отношения между mpg и hp, все еще включая wt линейным образом. Как это сделать?

Я попытался использовать hp_thresh во входных данных для segmented(), чтобы иметь разорванную связь только для hp, но я получаю эту ошибку: «Неправильное количество терминов в seg.Z или psi».


person pulp_fiction    schedule 13.04.2016    source источник
comment
Откуда взялись segmented() и broken.line()?   -  person Stibu    schedule 13.04.2016
comment
Пожалуйста, не редактируйте вопрос таким образом, чтобы существующие ответы стали бессмысленными. Сначала вы спросили об интерпретации вывода broken.lines(). Я попытался сохранить эту часть и добавить ваш более четкий вопрос как четко обозначенное редактирование. Таким образом, мой ответ остается в силе как ответ на исходный вопрос. Я добавлю ответ для редактирования сейчас.   -  person Stibu    schedule 16.04.2016
comment
Стибу - понял, поаккуратнее будет. Пожалуйста, поймите, что мое разъяснение относится только к первым двум строкам вопроса, где я специально задаю вопрос, пытаясь определить регрессию ломаной линии для миль на галлон как функцию от л.с. и веса, с точками останова, исходящими только от л.с. Ценю ваш подробный ответ. Спасибо.   -  person pulp_fiction    schedule 18.04.2016


Ответы (1)


Резюме

Вы все делаете правильно, но неверно истолковываете значение вывода broken.lines() (в ваших обозначениях fted$fit). Не следует ожидать, что эти значения согласуются с mpg.

Вы можете сохранить линейную зависимость для некоторых зависимых переменных, указав в seg.Z только те переменные, где вы хотите иметь ломаную линию.

Что сломанный.line() делает

Вы создаете модель для mpg как функции двух переменных, hp и wt. Модель является кусочно-линейной по обеим этим переменным. Важно отметить, что для прогнозирования значения mpg необходимо указать оба, hp и wt.

Функция broken.line() используется для расчета прогнозов для mpg, если одна из переменных, указанных в аргументе term, изменяется. Вы делаете это для переменной hp следующим образом:

fted = broken.line (seg.o, term="hp")

Но помните: для прогнозирования вам также необходимо указать значение для wt. Значения, которые вы получаете в fted$fit, на самом деле рассчитываются с wt равным нулю.

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

pred <- predict(seg.o, data.frame(hp = hp, wt = 0))
pred - fted$fit
##  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 
##  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0  0

Создание прогнозов из модели

Если вы хотите сравнить прогнозы модели с mpg, вы должны использовать те же значения для обеих переменных, hp и wt, что и для подгонки. Вы также можете сделать это с прогнозом:

pred <- predict(seg.o, data.frame(hp = hp, wt = wt))
plot(hp, mpg)
points(hp, pred, col = "red")

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

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

Построение кусочно-линейной зависимости

Вы также можете посмотреть на кусочно-линейную связь между mpg и одной из переменных. Вы уже рассчитали эти значения в fted, но вы также можете напрямую построить их из seg.o следующим образом:

plot(seg.o, term = "hp")
points(hp, fted$fit, col = "red")

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

Обратите внимание, что также для plot() вам нужно указать, какая переменная будет варьироваться (здесь hp). Другой снова держится на нуле. Я также добавил точки из fted$fit, чтобы показать вам, что график на самом деле эквивалентен тому, что рассчитывается broken.line.

Подогнать ломаную линию только для одной переменной

Если вы хотите поместить ломаную линию только в одну из зависимых переменных и сохранить линейную зависимость для других (других), вам нужно указать в seg.Z только те переменные, для которых вы хотите использовать ломаную линию. Вы просили иметь ломаную линию только для hp, что можно сделать следующим образом:

seg.o2 <- segmented(reg, seg.Z = ~hp, psi = list(hp = hp_thresh))

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

Изменение hp, сохранение wt фиксированным`:

pred_hp <- predict(seg.o2, data.frame(hp = 50:300, wt = 0))
plot(50:300, pred_hp, type = "l")

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

Изменение wt, сохранение hp фиксированным`:

pred_wt <- predict(seg.o2, data.frame(wt = seq(1.5, 5.5, by = 0.1), hp = 0))
plot(seq(1.5, 5.5, by = 0.1), pred_wt, type = "l")

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

Как видите, ваша модель для mpg линейно зависит от wt, но имеет разорванную линейную связь с hp.

person Stibu    schedule 14.04.2016
comment
Спасибо, ваш подробный ответ имеет смысл. Но я все еще не уверен, как мне получить соответствие, когда у меня есть две независимые переменные, но я заинтересован в получении сегментированного отношения только для одной, но не для исключения второй. Обновлен исходный вопрос. - person pulp_fiction; 14.04.2016