使用ggplot

时间:2017-09-15 11:03:18

标签: r ggplot2 regression

我试图用ggplot绘制一些线性和多项式回归。估算<{1>}函数内的回归系数时,这非常简单:

geom_smoot

但是,在这里,我想根据之前关于回归参数的知识,绘制一个预测(或更多,如上例所示)。

因此,我的回归估计可以通过以下方式打印:

ggplot (mtcars, aes(x=wt, y=mpg, fill=factor(cyl), colour=factor(cyl))) + geom_smooth(method='lm', formula = y ~ poly(x,2)) + geom_point()

现在我想以相反的方式建立情节,从估计到情节。或者更好的是,根据这些估算的其他值构建预测(对于dlply(mtcars,.(cyl), lm, formula=mpg ~ poly(wt,2)) %>% llply(summary) %>% ldply(coefficients) ,ej。Intercept=20poly(wt,2)1=-15poly(wt,2)2=4),然后获得一个图表作为一个上方。

但这里是我不知道如何继续的地方。我想我需要为cyl=4的每个级别使用不同的geom_smoothgeom_line或类似内容,包括每个级别的相应估算值,但无法弄清楚如何。

2 个答案:

答案 0 :(得分:3)

我通常通过生成预测数据框来实现这一目标。

mod <- lm(mpg ~ poly(wt,2), mtcars)
pred <- data.frame(wt = seq(0,6,0.01))
pred$mpg <- predict(mod, pred)
ggplot() +
  geom_line(data = pred, aes(x=wt, y=mpg)) +
  geom_point(data = mtcars, aes(x=wt, y=mpg, colour=factor(cyl)))

当然,您可以将参数更改为您喜欢的任何参数。

pred$mpg <- 57 - pred$wt * 21 + pred$wt^2 * 3.3

或者,您可以使用stat_function

ggplot(pred, aes(x=wt)) +
  stat_function(fun = function(x) 57 - 21*x + 3.3*x^2) +
  geom_point(data = mtcars, aes(y=mpg, colour=factor(cyl)))

最后一点:you can't interpret the coefficients of a poly() fit the way you think you would

答案 1 :(得分:3)

我认为查看broom包可能是一个很好的练习。我不太确定你想要走哪条路,所以这里有一些我发现的例子:

绘制回归:

我不知道你如何绘制多项式函数,这对你来说是一个练习,但这里有一些代码可以将多项式回归到数据框中:

library(dplyr)
library(broom)
library(tidyr)

mtcars %>% group_by(cyl) %>% do(tidy(lm(mpg ~ poly(wt, 2), data=.))) %>%
     select(cyl, term, estimate) %>%
     spread(term, estimate)
# Source: local data frame [3 x 4]
# Groups: cyl [3]
# 
# cyl `(Intercept)` `poly(wt, 2)1` `poly(wt, 2)2`
# * <dbl>         <dbl>          <dbl>          <dbl>
# 1     4      26.66364     -10.170962       3.003872
# 2     6      19.74286      -2.426656      -1.589859
# 3     8      15.10000      -6.003055      -1.933630

但这是线性回归的一个:

fit <- mtcars %>% group_by(cyl) %>% do(tidy(lm(mpg ~ wt, data=.))) %>%
  select(cyl, term, estimate) %>%
  spread(term, estimate)
ggplot(mtcars, aes(x=wt, y=mpg, colour=cyl)) + geom_point() +
  geom_abline(data=fit, aes(slope=wt, intercept=`(Intercept)`, colour=cyl))

enter image description here

你不能只是绘制拟合,因为你需要提供x值和y值,所以可能有一些预测值:

wt <- c(2:5)
mtcars %>% group_by(cyl) %>% do(augment(lm(mpg ~ poly(wt, 2), data=.), newdata=data.frame(wt=wt))) %>%
  ggplot(aes(x=wt, y=.fitted, group=cyl, colour=cyl)) + geom_line() 

enter image description here