2015-11-30 4 views
3

У меня есть следующий набор данных:сегмент участка между точкой и линией

x <- 1:5 
y <- c(1, 2, 1.3, 3.75, 2.25) 

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

plot(x, y, pch=19, ylim=c(0,6)) 
xx <- seq(0, 6, length=100) 
fit <- lm(y~x) 
lines(xx, predict(fit, data.frame(x=xx))) 

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

enter image description here

Как я могу это сделать?

ответ

2

Используя базу r вы можете сделать следующее:

x <- 1:5 
y <- c(1, 2, 1.3, 3.75, 2.25) 

fit <- lm(y ~ x) 
plot(x, y) 
abline(fit) 
res <- signif(residuals(fit), 5) 
pre <- predict(fit) 
segments(x, y, x, pre, col = rainbow(length(x))) 

plot

Добавление меток легко с calibrate::textxy:

# install.packages("calibrate") 
library(calibrate) 
textxy(x, y, res) 

plot with labels

1

Мне нравится broom пакет для создания хорошего кадра данных для таких вещей, как это:

library(broom) 
aug_fit = broom::augment(fit) 

with(aug_fit, segments(x0 = x, y0 = y, x1 = x, y1 = .fitted)) 

Бег моего with(... segments()) линии после того, как ваши урожаев участка:

enter image description here

Я оставлю добавление цвета, текстовые надписи и т. д.

0

Использование ggplot:

library(ggplot2) 

#ggplot needs a dataframe 
dat <- data.frame(x=x,y=y) 
fit <- lm(y~x,data=dat) 

#add predicted y for each x, to enable segment drawing 
dat$pred <- predict(fit, dat) 

with thanks to JasonAizkalns: adding labels too 
dat$pred <- predict(fit, dat) 
dat$pred_error <- dat$y - dat$pred 
dat$vjust <- sign(dat$pred_error)*-1.1 #labels can appear above/below points now 

    p1 <- ggplot(dat, aes(x=x,y=y, color=factor(x)))+ 
    geom_point(size=2) + 
    geom_segment(aes(x=x,xend=x,y=y,yend=pred)) + 
    geom_abline(intercept=coefficients(fit)[1],slope=coefficients(fit)[2]) + 
    geom_text(aes(label=round(pred_error,2),vjust=vjust))+ 
    ylim(c(0,5))+ 
    xlim(c(0,5))+ 
    theme_bw()+ 
    theme(legend.position="none") 
p1 

enter image description here

+0

Я отредактировал ответ, спасибо. Обычно в geom_text мне нравится сопоставлять метки внутри aes и устанавливать вещи, которые всегда остаются неизменными. – Heroka

0

Другой ggplot2 ответ., И аналогичные по духу Gregors ответ. Это использует fortify.lm, где вы можете сдать результаты от регрессии lm до ggplot. Чтобы увидеть, что делает крепость, вы можете посмотреть объект fortify(fit).

# Your data and linear model 
x <- 1:5 
y <- c(1, 2, 1.3, 3.75, 2.25) 
fit <- lm(y~x) 

# Plot 
library(ggplot2)  

ggplot(fit, aes(x=x, y=y, xend=x, yend=y, col=factor(x), label=round(.resid, 2))) + 
    geom_point() + 
    geom_line(aes(x=x, y=.fitted), inherit.aes=FALSE) + 
    geom_segment(aes(y=.fitted)) + 
    geom_text(aes(vjust=-1*sign(.resid))) + 
    theme(legend.position="none") 
Смежные вопросы