r - 用ggplot约束stat_smooth中的斜率(绘图ANCOVA)

标签 r plot ggplot2

我使用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")

我可以用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)

我知道HH软件包中的ancova()可以自动执行绘图,但是我并不真正关心晶格图形。因此,我正在寻找以ggplot()为中心的解决方案。
library(HH)
ancova(y ~ x + A, data = df)

有没有一种方法可以使用ggplot()完成此操作?对于此示例,A具有两个级别,但是我遇到的情况是3、4或更多级别。 formulageom_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))

关于r - 用ggplot约束stat_smooth中的斜率(绘图ANCOVA),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4251294/

相关文章:

R ggplot2 : draw multiple line segments connecting pairs of points on map

R data.table 使用日期非等值连接与查找 data.table 从查找中添加列

R/MATLAB : restricting which libraries can be loaded

r - 无法基于 ranef(lmerMod) 更改 dotplot() (格子包)的布局

plot - 在Gadfly中使用Geom.subplot_grid时如何将参数发送到Geom.histogram?

r - 如何使用 R 中的 grid.arrange 在并排排列的图周围绘制框/边框

r - 如何保护 R 中的矩阵不被 Rcpp 更改?

python - bar() 缺少 1 个必需的位置参数 : 'left'

用 gnuplot 绘制单列二进制文件

r - 使用 ggplot2 在一个图上绘制多个箱线图