我的数据如下所示:
library(tidyverse)
set.seed(2017)
df <- tibble(
product = c(rep("A", 50), rep("B", 50)),
sales = round(c(rnorm(50, mean = 55, sd = 10), rnorm(50, mean = 60, sd = 15)))
)
我可以对数据建立线性回归:
mod1 <- lm(sales ~ product, data = df)
并预测产品“A”和“B”的销售额:
predict(mod1, tibble(product = c("A", "B")))
> 1 2
> 55.78 58.96
但我想模拟拟合模型的绘制,而不是仅仅预测拟合值。我想要绘制,以便我可以捕捉点估计周围的不确定性(无需使用 SD、CI 等)。
我通常会使用simulate()
和更改model_object$fitted.values
. 但我不能这样做,因为我的模型的输入是因子/字符级别(“A”和“B”)。
我可以得到分布的形状:
a_mu <- coef(summary(mod1))["(Intercept)", "Estimate"]
a_se <- coef(summary(mod1))["(Intercept)", "Std. Error"]
b_mu <- coef(summary(mod1))["productB", "Estimate"]
b_se <- coef(summary(mod1))["productB", "Std. Error"]
并模拟这样的绘制:
N <- 100
product_A <- replicate(N,
rnorm(n = 1, mean = a_mu, sd = a_se) + rnorm(n = 1, mean = b_mu, sd = b_se) * 0)
product_B <- replicate(N,
rnorm(n = 1, mean = a_mu, sd = a_se) + rnorm(n = 1, mean = b_mu, sd = b_se) * 1)
并将其全部塞入一个小标题中以进行可视化:
pred <- tibble(A = product_A, B = product_B)
但这个过程似乎超级笨拙。如果我的数据增长到 5 个输入变量,每个变量有 10 个因子水平,则不会扩展。那么,我怎样才能使这个通用化呢?
我宁愿留在基地 R 和/或tidyverse
. 是的,我知道我在这里与贝叶斯统计调情,我也许可以使用 Stan 从后验中提取……但这不是重点。