2017-12-20 150 views
5

実線の終点から予測値まで点線を延長する簡単な方法はありますか?ggplot:異なる線種で予測値に回帰直線を延長する

x = rnorm(10) 
y = 5 + x + rnorm(10,0,0.4) 

my_lm <- lm(y~x) 
summary(my_lm) 

my_intercept <- my_lm$coef[1] 
my_slope <- my_lm$coef[2] 
my_pred = predict(my_lm,data.frame(x = (max(x)+1))) 

ggdf <- data.frame(x = c(x,max(x)+1), y = c(y,my_pred), obs_Or_Pred = c(rep("Obs",10),"Pred")) 

ggplot(ggdf, aes(x = x, y = y, group = obs_Or_Pred)) + 
    geom_point(size = 3, aes(colour = obs_Or_Pred)) + 
    geom_abline(intercept = my_intercept, slope = my_slope, aes(linetype = obs_Or_Pred)) 

これは私が見に期待したい出力を与えるものではありません:

以下はそれで私の基本的な試みです。

ggdf2 <- data.frame(x = c(x,max(x),max(x)+12), y = c(y,my_intercept+max(x)*my_slope,my_pred), obs_Or_Pred = c(rep("Obs",8),"Pred","Pred"), show_Data_Point = c(rep(TRUE,8),FALSE,TRUE)) 

ggplot(ggdf2, aes(x = x, y = y, group = obs_Or_Pred)) + 
    geom_point(data = ggdf2[ggdf2[,"show_Data_Point"],] ,size = 3, aes(colour = obs_Or_Pred)) + 
    geom_smooth(method = "lm", se=F, aes(colour = obs_Or_Pred, linetype=obs_Or_Pred)) 

これが正しい出力が得られますが、私は余分を含めるために持っていた:私は、私が思い付くした最高のがあるように、いくつかの他の回答を見てきましたし、何もsimple.Theを見ていませんデータポイントを表示するかどうかを指定する列。予測するggplotを指示する簡単な方法があります

enter image description here

:私はないと、私はフィット回帰直線の最後に余分なポイントを持っているこれら二つのプロットの第二、で終わります線形モデルから単一の点を取り出し、破線を描きますか?

+0

あなたの方法はわかりやすいようです。 – Gregor

+0

事前に予測をしてから、どの行をポイントとして、どのラインをどのラインとして表示するかを指定する必要があるのは気になりません。それは少数の予測/時間がある場合には問題ありませんが、私が繰り返しそれをやりたいのであれば、手動で行うのは面倒です。 – AodhanOL

+0

つまり、 'ggplot'はモデリングパッケージではなく、プロットするパッケージです。それはあなたがそれを与えるデータをプロットするのに最適です。 'geom_smooth'はシンプルなユースケースには便利ですが、非標準モデル/予測が必要なときは、プロットしたいデータを明示的に与える必要があることに驚かないでください。 – Gregor

答えて

5

実際のデータのみを使用してポイントをプロットし、予測データフレームを作成してラインを追加することができます。 max(x)が2回現れるので、Obs行とPred行の両方のエンドポイントになることがあります。また、飾り記号shapeを使用して、Predの凡例キーに表示されるポイントマーカーを削除できるようにします。

# Build prediction data frame 
pred_x = c(min(x),rep(max(x),2),max(x)+1) 
pred_lines = data.frame(x=pred_x, 
         y=predict(my_lm, data.frame(x=pred_x)), 
         obs_Or_Pred=rep(c("Obs","Pred"), each=2)) 

ggplot(pred_lines, aes(x, y, colour=obs_Or_Pred, shape=obs_Or_Pred, linetype=obs_Or_Pred)) + 
    geom_point(data=data.frame(x,y, obs_Or_Pred="Obs"), size=3) + 
    geom_line(size=1) + 
    scale_shape_manual(values=c(16,NA)) + 
    theme_bw() 

enter image description here

1

セミ醜い:あなたは予測のために使用されるX値の範囲を設定するためにscale_x_continuous(limits =を使用することができます。最初に予測された線をfullrange = TRUEでプロットし、上に '観察された'線を追加します。オーバープロットは完全にレンダリングされないので、観測される線のサイズを少し大きくすることができます。

ggplot(d, aes(x, y)) + 
    geom_point(aes(color = "obs")) + 
    geom_smooth(aes(color = "pred", linetype = "pred"), se = FALSE, method = "lm", 
                 fullrange = TRUE) + 
    geom_smooth(aes(color = "obs", linetype = "obs"), size = 1.05, se = FALSE, method = "lm") + 
    scale_linetype_discrete(name = "obs_or_pred") + 
    scale_color_discrete(name = "obs_or_pred") + 
    scale_x_continuous(limits = c(NA, max(x) + 1)) 

enter image description here


しかし、私はグレゴールに同意する傾向がある: "ggplotはプロットパッケージではなく、モデリングパッケージです"。

関連する問題