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

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

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

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

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

Ответы [ 2 ]

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

0 голосов
/ 03 февраля 2019

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