Постройте подогнанную линию в пределах определенного диапазона R

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

Например, если у меня есть следующий код, я бы хотел, чтобы линия существовала только из значений x и y 1:10 (с параметрами по умолчанию эта линия выходит за пределы диапазона точек данных).

x <- 1:10
y <- 1:10
plot(x,y)
abline(lm(y~x))

person Thraupidae    schedule 05.04.2012    source источник


Ответы (5)


Вместо использования abline() (a) сохраните подобранную модель, (b) используйте predict.lm(), чтобы найти подобранные значения y, соответствующие x=1 и x=10, а затем (c) используйте lines(), чтобы добавить линию между двумя точками. :

f <- lm(y~x)
X <- c(1, 10)
Y <- predict(f, newdata=data.frame(x=X))

plot(x,y)
lines(x=X, y=Y)
person Josh O'Brien    schedule 05.04.2012

В дополнение к использованию predict с lines или segments вы также можете использовать функцию clip с abline:

x <- 1:10
y <- 1:10
plot(x,y)
clip(1,10, -100, 100)
abline(lm(y~x))
person Greg Snow    schedule 06.04.2012
comment
+1, потому что он работает с любой строкой, в том числе с abline(), без использования хака с предсказанием(). Таким образом, можно, например, также обрезать аблайны, которые выходят на края графика, но только с одной стороны, например. вправо, а не влево. - person pfifas; 27.01.2015
comment
Это гораздо лучший ответ, чем принятый. Гораздо проще и на самом деле работает с визуальным представлением, как хотелось бы, вместо того, чтобы создавать какое-то странное новое строковое представление с использованием predict - person setholopolus; 18.01.2020

Вы можете сделать это, используя прогноз.

Вы можете предсказывать определенные значения x (см. ?predict)

x<-1:10
y<-1:10
plot(x,y)
new <- data.frame(x = seq(1, 5, 0.5))
lines(new$x, predict(lm(y~x), new))

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

person Etienne Low-Décarie    schedule 05.04.2012

В библиотеке plotrix есть функция ablineclip() именно для этого:

x <- 1:10
y <- 1:10
plot(x,y)
ablineclip(lm(y~x),x1=1,x2=5)
person Dr.J    schedule 15.03.2016

Альтернативой является использование функции segments (doc здесь).

Допустим, вы оценили линию и получили точку пересечения a и наклон b. Таким образом, ваша подогнанная функция y = a + bx.

Теперь предположим, что вы хотите показать строку для x между x0 и x1. Затем следующий код строит вашу линию:

# inputs

a <- 0.5
b <- 2

x0 <- 1
x1 <- 5

# graph

plot(c(0,5), c(0,5), type = "n", xlab = "", ylab = "", bty='l')
segments(x0, a+b*x0, x1, a+b*x1)

Просто замените значения a, b, x0, x1 выбранными вами.

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


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

plot(c(0,5), c(0,5), type = "n", xlab = "", ylab = "", bty='l')
segments(x0, yo, x1, y1)

Просто замените значения x0, y0, x1, y1 выбранными вами.

person luchonacho    schedule 17.03.2017