Ограничивающий уклон в stat_smooth с ggplot (построение ANCOVA) - PullRequest
4 голосов
/ 23 ноября 2010

Используя 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")

Default ggplot()

я могу добавить 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)

With geom_abline()

Я знаю ancova() в ЧЧПакет автоматизирует построение графиков, но мне не особо важна графика решетки.Поэтому я ищу ggplot() -центрическое решение.

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

Есть ли способ сделать это с помощью ggplot()?В этом примере A имеет два уровня, но у меня есть ситуации с 3, 4 или более уровнями.Кажется, что аргумент formula к geom_smooth() не имеет ответа (насколько я могу судить).

1 Ответ

5 голосов
/ 25 ноября 2010

Для полноты, это работает:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...