解释使用 ggplot 可视化的 R 中线性模型的代码

Explain the code underlying a linear model in R visualised with ggplot

我想了解在分析基因表达数据时如何使用线性模型来替代 t 检验。对于单个基因,我在第 1 组(n=10)和第 2 组(n=10)中共有 20 个基因表达值的数据框。

gexp = data.frame(expression = c(2.7,0.4,1.8,0.8,1.9,5.4,5.7,2.8,2.0,4.0,3.9,2.8,3.1,2.1,1.9,6.4,7.5,3.6,6.6,5.4),
                 group = c(rep(1, 10), rep(2, 10)))

可以使用 ggplot 绘制数据(方框),如下所示:

plot <- gexp %>%
  ggplot(aes(x = group, y = expression)) +
  geom_boxplot() +
  geom_point()
plot

我希望使用回归公式对第 1 组和第 2 组中的表达式建模: Y = Beta0 + (Beta1 x X) + e 其中 Y 是我要建模的表达式,X 代表分别编码为 0 和 1 的两个组。因此,组 1 中的表达式(当 x = 0 时)等于 Beta0;组 2 中的表达式(当 x = 1 时)等于 Beta0 + Beta1。 如果这是建模:

mod1 <- lm(expression ~ group, data = gexp)
mod1

以上代码输出的截距为 2.75,斜率为 1.58。是我不明白的线性模型的可视化。如果您能清楚地解释以下代码,我将不胜感激:

plot +
  geom_point(data = data.frame(x = c(1, 2), y = c(2.75, 4.33)),
               aes(x = x, y = y),
               colour = "red", size = 5) +
    geom_abline(intercept = coefficients(mod1)[1] - coefficients(mod1)[2],
                slope = coefficients(mod1)[2])

我明白为什么选择 data.frame 值(4.33 的值是截距 Beta0 和斜率 Beta1 的总和),但它是 geom_abline 参数我不明白。为什么截距计算如图所示?在我使用它的文本中,'...我们需要在绘制线性模型时从截距中减去斜率,因为组 1 和组 2 在模型中被编码为 0 和 1,但绘制为图中的 1 和 2。' 我不理解这一点,请提供解释,但不要太专业。

如果 group 变量被编码为一个因子,我相信你的代码是正确的。

library(ggplot2)
gexp = data.frame(expression = c(2.7,0.4,1.8,0.8,1.9,5.4,5.7,2.8,2.0,4.0,3.9,2.8,3.1,2.1,1.9,6.4,7.5,3.6,6.6,5.4),
                  group = factor(c(rep(1, 10), rep(2, 10))))

plot <- 
  ggplot(gexp, aes(x = group, y = expression)) +
  geom_boxplot() +
  geom_point()

mod1 <- lm(expression ~ group, data = gexp)

plot +
  geom_point(data = data.frame(x = c(1, 2), y = c(2.75, 4.33)),
             aes(x = x, y = y),
             colour = "red", size = 5) +
  geom_abline(intercept = coefficients(mod1)[1] - coefficients(mod1)[2],
              slope = coefficients(mod1)[2])

reprex package (v2.0.1)

于 2022-03-30 创建

要了解指定线性模型时因子和整数之间的区别,您可以查看模型矩阵。

model.matrix(y ~ f, data = data.frame(f = 1:3, y = 1))
#>   (Intercept) f
#> 1           1 1
#> 2           1 2
#> 3           1 3
#> attr(,"assign")
#> [1] 0 1

model.matrix(y ~ f, data = data.frame(f = factor(1:3), y = 1))
#>   (Intercept) f2 f3
#> 1           1  0  0
#> 2           1  1  0
#> 3           1  0  1
#> attr(,"assign")
#> [1] 0 1 1
#> attr(,"contrasts")
#> attr(,"contrasts")$f
#> [1] "contr.treatment"

reprex package (v2.0.1)

于 2022-03-30 创建

在第一个模型矩阵中,您指定的就是您得到的:您将某些东西建模为截距和 f 变量的函数。在此模型中,您考虑 f = 2f = 1.

的两倍

f 是一个因素时,这会有点不同。 k 级因子被拆分为 k-1 个虚拟变量,其中每个虚拟变量都用 1 或 0 编码,无论它是否偏离参考水平(第一个因子水平)。通过以这种方式建模,您不会认为第二个因子水平可能是第一个因子水平的两倍。

因为在 ggplot2 中,第一个因子水平显示在位置 = 1 而不是位置 = 0(它是如何建模的),你计算的截距是关闭的。您需要从计算的截距中减去 1 * slope 以使其在 ggplot2 中正确显示。