Ответ: Нет, невозможно заставить abline()
нарисовать выровненную линию только на одной части области графика, где была установлена модель.Это связано с тем, что для рисования линии используются только коэффициенты модели, а не прогнозы из модели.Если вы посмотрите внимательно, вы увидите, что рисование линий фактически выходит за пределы области графика, охватывая рамку графика там, где существует область.
Самое простое решение таких проблем - это прогнозирование по модели длярегионы, которые вы хотите.
# The dataset:
daten <- data.frame(x = c(0:6), y = c(0.3, 0.1, 0.9, 3.1, 5, 4.9, 6.2))
# make a linear fit for the datapoints 3, 4, 5
mod <- lm(y~x, data = daten, subset = 3:5)
Сначала мы получаем диапазон x
значений, которые мы хотим дифференцировать:
xr <- with(daten, range(x[3:5]))
, а затем мы прогнозируем набор равномерно расположенных точек на этомдиапазон с использованием модели:
pred <- data.frame(x = seq(from = xr[1], to = xr[2], length = 50))
pred <- transform(pred, yhat = predict(mod, newdata = pred))
Теперь нанесите данные и модель, используя abline()
:
plot(y ~ x, data = daten)
abline(mod)
, затем добавьте регион, который вы хотите подчеркнуть:
lines(yhat ~ x, data = pred, col = "red", lwd = 2)
Что дает нам этот график:
![enter image description here](https://i.stack.imgur.com/2oeeT.png)
Если у вас есть модель, более сложная, чем та, которую можно обработать с помощью abline()
, тогда мы возьмем немногодругая стратегия, прогнозирование по диапазону доступных, нанесенных на график данных, чтобы нарисовать линию, а затем выбрать интервал, который мы хотим выделить.Следующий код делает это:
## range of all `x` data
xr2 <- with(daten, range(x))
## same as before
pred <- data.frame(x = seq(from = xr2[1], to = xr2[2], length = 100))
pred <- transform(pred, yhat = predict(mod, newdata = pred))
## plot the data and the fitted model line
plot(y ~ x, data = daten)
lines(yhat ~ x, data = pred)
## add emphasis to the interval used in fitting
with(pred, lines(yhat ~ x, data = pred, subset = x >= xr[1] & x <= xr[2],
lwd = 2, col = "red"))
Здесь мы используем аргумент subset
, чтобы выбрать значения из предсказаний, которые находятся в интервале, используемом для подгонки, в векторе, который мы передаем subset
является логическим вектором значений TRUE
и FALSE
, указывающих, какие данные находятся в интересующей области, а lines()
только строит линию вдоль этих данных.
R> head(with(pred, x >= xr[1] & x <= xr[2]))
[1] FALSE FALSE FALSE FALSE FALSE FALSE
Можно задаться вопросом, почему у меня естьвыполнили предсказания на 50 или 100 равномерно распределенных значений переменной предиктора, когда мы могли бы, в этом случае, просто сделать предсказание для начала и конца данных или интересующей области и соединить две точки?Что ж, не все упражнения по моделированию настолько просты - вы можете использовать двойную логарифмическую модель из предыдущего вопроса - и общее решение, которое я обрисовал выше, будет работать во всех случаях, тогда как простое объединение двух предсказаний не будет.
@ Андри предоставила вам решение для идеи 2.