Линейная регрессия [R]: как рассчитать несколько коэффициентов для одного и того же предиктора на основе появления категориальной переменной

У меня есть прогноз с проблемой линейной регрессии. В этой задаче имеют значение дни недели. На данный момент использую:

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

Где y и x - непрерывные переменные, а дни недели - фиктивные переменные (они могут быть либо 0, либо 1). Таким образом, недельная зависимость задается различными интерцепторами (коэффициентами перед манекенами). Однако я хотел бы рассчитать другой коэффициент для x для каждого дня недели.

Я могу выполнить эту операцию, когда использую GAM (библиотека: mgcv) внутри сплайн-функции, где «день» - это категориальная переменная, содержащая название дня недели.

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

Я показываю несколько строк последовательности фреймов данных

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 я получаю разные сплайны для каждого дня недели (каждое значение факторной переменной «день»), с линейной моделью я хотел бы получить много коэффициентов для x как числа значений факторных переменных. Является ли это возможным? Любой обходной путь?


person spec3    schedule 02.02.2019    source источник


Ответы (2)


Может быть, я что-то упускаю, но мне кажется, вы спрашиваете о взаимодействии между 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)
person Anders Ellern Bilgrau    schedule 02.02.2019

Вы хотите избежать создания двоичных терминов самостоятельно. Фактически, то, как нотация 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 внутренне отбрасывает некоторые эффекты; вы не можете подобрать точку пересечения и все эти термины дня, потому что одна из отдельных переменных дня линейно зависит от точки пересечения и, следовательно, не может быть однозначно идентифицирована.

person Gavin Simpson    schedule 03.02.2019