web-dev-qa-db-ja.com

ggplotに回帰直線を追加する

Ggplotに回帰線を追加しようとしています。私は最初にablineを試しましたが、うまく機能させることができませんでした。それから私はこれを試しました...

data = data.frame(x.plot=rep(seq(1,5),10),y.plot=rnorm(50))
ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) +
   geom_smooth(method='lm',formula=data$y.plot~data$x.plot)

しかし、それも機能していません。

91
Remi.b

一般に、独自の式を提供するには、ggplot()で指定した値に対応する引数xおよびyを使用する必要があります。この場合、xx.plotおよびyとしてy.plotとして解釈されます。平滑化メソッドと数式の詳細については、stat_smooth()で使用されるデフォルトの統計情報であるため、関数geom_smooth()のヘルプページで見つけることができます。

ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm',formula=y~x)

ggplot()呼び出しで指定したものと同じxおよびy値を使用しており、線形回帰線をプロットする必要がある場合は、geom_smooth()内で数式を使用する必要はなく、method="lm"を指定するだけです。

ggplot(data,aes(x.plot,y.plot))+stat_summary(fun.data=mean_cl_normal) + 
  geom_smooth(method='lm')
128
Didzis Elferts

先ほど考えたように、モデルが多重線形回帰に適合している場合、上記の解決策は機能しません。

元のデータフレームの予測値を含むデータフレームとしてラインを手動で作成する必要があります(この場合はdata)。

次のようになります。

# read dataset
df = mtcars

# create multiple linear model
lm_fit <- lm(mpg ~ cyl + hp, data=df)
summary(lm_fit)

# save predictions of the model in the new data frame 
# together with variable you want to plot against
predicted_df <- data.frame(mpg_pred = predict(lm_fit, df), hp=df$hp)

# this is the predicted line of multiple linear regression
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_line(color='red',data = predicted_df, aes(x=mpg_pred, y=hp))

Multiple LR

# this is predicted line comparing only chosen variables
ggplot(data = df, aes(x = mpg, y = hp)) + 
  geom_point(color='blue') +
  geom_smooth(method = "lm", se = FALSE)

Single LR

32
StefanK

geom_ablineを使用した明らかな解決策:

geom_abline(slope = data.lm$coefficients[2], intercept = data.lm$coefficients[1])

data.lmlmオブジェクトであり、data.lm$coefficientsは次のようになります。

data.lm$coefficients
(Intercept)    DepDelay 
  -2.006045    1.025109 

実際には、stat_functionを使用して、回帰変数をxの関数としてプロットし、predictを使用しています。

stat_function(fun = function(x) predict(data.lm, newdata = data.frame(DepDelay=x)))

デフォルトではn=101ポイントが計算されるため、これは少し効率的ではありませんが、パッケージnpからの非線形predictなど、npregをサポートするモデルの予測曲線をプロットするため、はるかに柔軟です。

注:scale_x_continuousまたはscale_y_continuousを使用すると、一部の値が切り捨てられ、geom_smoothが正しく機能しない場合があります。 代わりにズームするにはcoord_cartesianを使用

5
qwr

ロジスティックモデルを使用した用量反応曲線のような他のタイプのモデルに適合させたい場合は、より滑らかな回帰線が必要な場合は、関数predictでより多くのデータポイントを作成する必要があります。

適合:ロジスティック回帰曲線の適合

#Create a range of doses:
mm <- data.frame(DOSE = seq(0, max(data$DOSE), length.out = 100))
#Create a new data frame for ggplot using predict and your range of new 
#doses:
fit.ggplot=data.frame(y=predict(fit, newdata=mm),x=mm$DOSE)

ggplot(data=data,aes(x=log10(DOSE),y=log(viability)))+geom_point()+
geom_line(data=fit.ggplot,aes(x=log10(x),y=log(y)))
2
user3436882

blog でこの関数を見つけました

 ggplotRegression <- function (fit) {

    `require(ggplot2)

    ggplot(fit$model, aes_string(x = names(fit$model)[2], y = names(fit$model)[1])) + 
      geom_point() +
      stat_smooth(method = "lm", col = "red") +
      labs(title = paste("Adj R2 = ",signif(summary(fit)$adj.r.squared, 5),
                         "Intercept =",signif(fit$coef[[1]],5 ),
                         " Slope =",signif(fit$coef[[2]], 5),
                         " P =",signif(summary(fit)$coef[2,4], 5)))
    }`

関数をロードしたら、単純に

ggplotRegression(fit)

ggplotregression( y ~ x + z + Q, data)にもアクセスできます

お役に立てれば。

2
YellowEagle