线性回归 [R]:如何根据分类变量的出现计算同一预测变量的多个系数

Linear regression [R]: how to calculate multiple coefficients for the same predictor based on the occurrence of a categorical variable

我有一个线性回归问题的预测。在这个问题中,星期几很重要。目前我使用:

lm.mod <- lm(y ~ x + monday + tuesday + thursday + friday + saturday + sunday, data=train)

其中 y 和 x 是连续变量,星期几是虚拟变量(它们可以是 0 或 1)。通过这种方式,周相关性由不同的截距(虚拟变量前面的系数)给出。但是,我想为一周中的每一天计算 x 的不同系数。

当我在样条函数中使用 GAM(库:mgcv)时,我可以执行此操作,其中 "day" 是一个包含星期几名称的分类变量

gam.mod <- mgcv::gam(y ~ s(x, bs='cs', by=day) + monday + tuesday + thursday + friday + saturday + sunday, data = train, method="REML", select=TRUE)

我展示几行数据框train

Date        | y          | x          | day       | Monday | Tuesday | Wednesday |
---------------------------------------------------------------------------------
2013-01-01  | 0.87604858 | 0.07339450 | Tuesday   | 0      | 1       | 0         |
2013-01-02  | 0.90190414 | 0.16513761 | Wednesday | 0      | 0       | 1         |

使用 mgcv 我为一周中的每一天获得不同的样条曲线(因子变量的每个值 "day"),使用线性模型我想获得 x 的许多系数作为值的数量因素变量。 可能吗?任何解决方法?

也许我遗漏了一些东西,但在我看来你是在询问 x 和工作日之间的交互?

即简化一点,像这样:

# Toy data
n <- 100
train <- data.frame(replicate(5, rnorm(n)))
names(train) <- c("x", "y", "mon", "tue", "wed")

lm.mod <- lm(y ~ x*(mon + tue + wed), data=train)

您想避免自己创建二进制项。事实上,mgcv 表示法暗示了 day 的样条,您需要将 day 作为模型中的一个因素,而不是所有那些单独的项。

因此,gam 模型将是:

gam(y ~ s(x, bs='cs', by=day) + day, data = train, method="REML", select=TRUE)

其中 day 是水平为 c('Monday','Tuesday', ....) 的因子。

那么线性模型就变成了:

lm(y ~ x * day, data = train)

您必须更加努力地工作才能获得每天的预估收入;将 predict() 用于 gam() 模型,其中 newdata 每天一行,type = 'terms' 并且您可以将截距添加到 day 贡献(效果)。对于 lm() 模型,您可以使用 multcomp 包最轻松地做到这一点。

您也可以只删除截距(将 + 0 添加到模型公式中)。还有其他方法可以对模型进行潜在参数化,以便轻松地为您提供可能需要的估计值。

你的模型甚至拟合是因为 R 内部正在放弃一些效果;您无法拟合截距和所有那些日期项,因为单独的日期变量之一线性依赖于截距,因此无法唯一标识。