Укажите диапазон, используемый для подгонки кривой на графиках R - PullRequest
0 голосов
/ 08 июня 2011

Можно ли нарисовать абзац подгонки только в определенном диапазоне значений x?

У меня есть набор данных с линейным подгонкой для подмножества этого набора данных:

# 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
daten_fit <- lm(formula = y~x, data = daten, subset = 3:5)

Когда я строю данные и рисую линию регрессии:

plot (y ~ x, data = daten)
abline(reg=daten_fit)

Линия рисуется для максимально возможного диапазона значений x.Но я хочу указать диапазон (подмножество данных), который использовался для подбора кривой.Мне пришло в голову две идеи:

  1. Нарисуйте вторую линию , которая толще, но показана только в диапазоне 3: 5.Я проверил параметры аблайна, линий и сегментов, но ничего не смог найти

  2. Добавьте небольшие отметки в соответствующие позиции, перпендикулярные абляции.Теперь у меня есть идея, как я могу это сделать.это, конечно, было бы лучше.

У вас есть идеи для решения?

Спасибо,

Свен

Ответы [ 3 ]

3 голосов
/ 08 июня 2011

Ответ: Нет, невозможно заставить 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

Если у вас есть модель, более сложная, чем та, которую можно обработать с помощью 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.

2 голосов
/ 08 июня 2011

Один из способов - использовать цвета, чтобы различать установленные точки и те, которые не соответствуют:

daten_fit <- lm(formula = y~x, data = daten[3:5, ])

plot(y ~ x, data = daten)
points(y ~ x, data = daten[3:5, ], col="red")
abline(reg=daten_fit, col="red")

enter image description here

Второй способ - нанести отметки на оси абсцисс. Эти галочки называются коврами, и их можно нарисовать с помощью функции rug. Но сначала вы должны рассчитать range:

#points(y ~ x, data = daten[3:5, ], col="red")
abline(reg=daten_fit, col="red")
rug(range(daten[3:5, 1]), lwd=3, col="red")

enter image description here

0 голосов
/ 08 июня 2011

Это довольно простой вопрос о графике - используйте опцию ylim=c(low, high) с подходящими опциями для low и high.

Возможно, вы захотите прочитать Руководство к R , прилагаемое к вашей версии R, а также другую прекрасную документацию на CRAN сайт.

...