2010-11-22 29 views
3

使用ggplot(),我試圖繪製兩個線性分量的斜率相等的ANCOVA的結果:即lm(y ~ x + A)geom_smooth(method = "lm")的默認行爲是爲每個因子的每個等級繪製單獨的斜率和截距。例如,具有兩個A使用ggplot約束stat_smooth中的斜率(繪製ANCOVA)

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()

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有兩個級別,但我有3,4或更多級別的情況。至geom_smooth()formula參數似乎沒有答案(據我所知)。

+0

簡單 - 擬合模型,然後繪製_predictions_。 `expand.grid`會有幫助 – hadley 2010-11-23 04:37:46

回答

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))