对于一个常见的、琐碎的统计问题,我在
ggplot2
中找不到明显的解决方案。我希望 geom_smooth(method = "lm")
在 color
美学中保持组之间的斜率恒定。
我开始的朴素模型是
lm(Sepal.Width ~ Sepal.Length, data = iris)
。将其绘制在 ggplot2
中:
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width) +
geom_point() +
geom_smooth(method = "lm")
为了添加
Species
的控制,我想测试 lm(Sepal.Width ~ Sepal.Length + factor(Species), data = iris
,它保持不同物种之间的斜率常数(该模型配备了一个萼片长度系数,只有物种之间的常数不同)。我还想测试 lm(Sepal.Width ~ Sepal.Length*Species, data = iris)
,它允许萼片长度和萼片宽度之间的关联因物种而异。
第二个模型绘制起来很简单:
library(ggplot2)
ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = Species) +
geom_point() +
geom_smooth(method = "lm")
该图允许斜率变化。 有没有办法防止坡度变化?
您想要的结果需要一些手动工作,即估计
ggplot
之外的模型,并将包含预测值的列添加到数据框中,然后可以使用 geom_line
进行绘制。对于您要测试的其他型号也是如此:
library(ggplot2)
iris2 <- iris
iris2$fit <- predict(lm(Sepal.Width ~ Sepal.Length + factor(Species), data = iris2))
ggplot(iris2, aes(x = Sepal.Length, y = Sepal.Width, color = Species)) +
geom_point() +
geom_line(aes(y = fit))
执行此操作的另一种非常简单的方法是使用
ggeffects
包为您预测值(如其他答案中所示,然后使用 ggpredict()
函数快速绘制它们。我将在下面展示如何执行相同的操作用这个方法:
#### Load Library ####
library(ggeffects)
#### Fit Model ####
fit <- lm(Sepal.Width ~ Sepal.Length + Species, data = iris)
#### Get Predictions ####
pred <- ggpredict(
model = fit,
terms = c("Sepal.Length", "Species")
)
#### Plot ####
plot(
pred,
show_data = T
)
如下图: