2017-09-15 126 views
0

我試圖用ggplot繪製一些線性和多項式迴歸。估計迴歸係數geom_smoot功能時,這是非常簡單的:使用ggplot繪製其係數迴歸

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) 

現在我想建立的情節上逆向,從估計的情節:

所以在這裏與我的迴歸估計可以通過印刷。或者甚至更好,從這些估計值的其他值(例如,Intercept=20,poly(wt,2)1=-15poly(wt,2)2=4,cyl=4)中構建預測值,然後獲得如上所述的圖。

但這裏是我不知道如何進行的地方。我想我需要對cyl的每個級別使用不同的geom_smooth,geom_line或類似值,包括這些估計值的每個相應值,但無法弄清楚。

回答

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

+0

這個預測建立在由lm函數估計的迴歸參數上。我如何根據問題中指出的自定義參數將它用於男性行? – EuGENE

+0

惠顧你的建議,我實際上可以手動修改估計值(ej:'mod $ coefficients [3] = 4'),然後使用'預測'。沒有更直接的方法來完成這個,不是嗎? – EuGENE

+0

編輯我的答案提供解決方案。 –

2

我認爲這可能是一個很好的練習來看看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