2010-11-22 9 views
3

ggplot()を使用して、2つの線形成分の傾きが等しい、すなわちlm(y ~ x + A)のANCOVAの結果をプロットしようとしています。 geom_smooth(method = "lm")のデフォルトの振る舞いは、各要因の各レベルごとに別々の勾配と切片をプロットすることです。例えば、Aggplot(プロットANCOVA)でstat_smoothの勾配を拘束

library(ggplot2) 
set.seed(1234) 

n <- 20 

x1 <- rnorm(n); x2 <- rnorm(n) 
y1 <- 2 * x1 + rnorm(n) 
y2 <- 3 * x2 + (2 + rnorm(n)) 
A <- as.factor(rep(c(1, 2), each = n)) 
df <- data.frame(x = c(x1, x2), y = c(y1, y2), A = A) 

p <- ggplot(df, aes(x = x, y = y, color = A)) 
p + geom_point() + geom_smooth(method = "lm") 

Default ggplot()

2つのレベルでIはlm()で別々ANCOVAに適合し、手動で行を追加するgeom_abline()を使用することができます。このアプローチには、データの範囲を超えて線を伸ばしたり、手動で色を指定したりするなど、いくつかの欠点があります。

fm <- lm(y ~ x + A, data = df) 
summary(fm) 

a1 <- coef(fm)[1] 
b <- coef(fm)[2] 
a2 <- a1 + coef(fm)[3] 

p + geom_point() + 
    geom_abline(intercept = a1, slope = b) + 
    geom_abline(intercept = a2, slope = b) 

With geom_abline()

私はHHパッケージにancova()を知っているプロットを自動化し、私は実際に格子グラフィックスのために気にしません。だから私はggplot()中心の解決策を探しています。

library(HH) 
ancova(y ~ x + A, data = df) 

ggplot()を使用してこれを行う方法はありますか?この例では、Aには2つのレベルがありますが、3,4、またはそれ以上のレベルの状況があります。 geom_smooth()へのformulaの引数は答えを持っていないようです(私が知る限り)。

+0

簡単に言うとは - モデルに適合し、その後_predictions_をプロットします。 'expand.grid'は参考になります – hadley

答えて

5

完全を期すため、これは動作します:

library(ggplot2) 
set.seed(1234) 

n <- 20 

x1 <- rnorm(n); x2 <- rnorm(n) 
y1 <- 2 * x1 + rnorm(n) 
y2 <- 3 * x2 + (2 + rnorm(n)) 
A <- as.factor(rep(c(1, 2), each = n)) 
df <- data.frame(x = c(x1, x2), y = c(y1, y2), A = A) 
fm <- lm(y ~ x + A, data = df) 

p <- ggplot(data = cbind(df, pred = predict(fm)), 
    aes(x = x, y = y, color = A)) 
p + geom_point() + geom_line(aes(y = pred))