线性回归 [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 内部正在放弃一些效果;您无法拟合截距和所有那些日期项,因为单独的日期变量之一线性依赖于截距,因此无法唯一标识。
我有一个线性回归问题的预测。在这个问题中,星期几很重要。目前我使用:
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 内部正在放弃一些效果;您无法拟合截距和所有那些日期项,因为单独的日期变量之一线性依赖于截距,因此无法唯一标识。