使用ggplot(),我试图绘制ANCOVA的结果,其中两个线性分量的斜率是相等的:即,lm(y ~ x + A).默认行为geom_smooth(method = "lm")是为每个因子的每个级别绘制单独的斜率和截距.例如,有两个级别A
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")
Run Code Online (Sandbox Code Playgroud)

我可以单独安装ANCOVA lm(),然后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)
Run Code Online (Sandbox Code Playgroud)

我知道ancova()在HH包中自动绘图,但我并不关心格子图形.所以我正在寻找一种ggplot()中心解决方案.
library(HH)
ancova(y ~ x + A, data = df)
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这个目的ggplot()?对于此示例,A有两个级别,但我有3个,4个或更多级别的情况.这个formula论点geom_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)
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))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3510 次 |
| 最近记录: |