Я уже задавал пару версий этого вопроса раньше, но я пытаюсь снова, потому что я полностью убежден, что уже должен быть лучший ответ, чем я видел до сих пор.
Я пытаясь построить кучу моделей временных рядов в R, которые я рассчитываю оценить, используя различные процедуры и пакеты. Каждая модель изначально имеет от трех до десяти переменных, но я также хочу оценить каждую из них как квадратичную c форму отклика с квадратами и перекрестными произведениями, количеством лагов каждого термина.
Так, например, предположим, что у меня есть шесть переменных: up, down, charm, strange, top
и bottom
.
Затем я буду оценивать каждую переменную как сумму лагов каждой плюс лагов квадрат каждого плюс запаздывания пятнадцати слагаемых второго порядка. И скажем, что я буду оценивать это конкретное уравнение, используя пакет dynlm, чтобы было проще варьировать число лагов и принимать несколько лагов, например так:
as.formula(up ~
lag(up, 1:4) + lag(down, 1:4) + lag(charm, 1:4) + lag(strange, 1:4) + lag(top, 1:4) + lag(bottom, 1:4)) +
плюс 6 квадратных слагаемых
lag(I(up^2), 1:4) + lag(I(down^2), 1:4) + lag(I(charm^2), 1:4) + lag(I(strange^2), 1:4) + lag(I(top^2), 1:4) + lag(I(bottom^2), 1:4)) +
плюс 15 терминов с несколькими продуктами
lag(up_down, 1:4) + lag(up_charm, 1:4) + lag(up_strange, 1:4) + lag(up_top, 1:4) + lag(up_bottom, 1:4) +
lag(down_charm, 1:4) + lag(down_strange, 1:4) + lag(down_top, 1:4) + lag(down_bottom, 1:4) +
lag(charm_strange, 1:4) + lag(charm_top, 1:4) + lag(charm_bottom, 1:4) +
lag(strange_top, 1:4) + lag(strange_bottom, 1:4) +
lag(top_bottom, 1:4))
Я не уверен, что воспроизводимость на самом деле здесь полезна, но здесь есть вещи, чтобы сделать приведенную выше формулу пригодной для использования в таком виде:
set.seed(1)
MX <- matrix(runif(1254), ncol = 6)
colnames(MX)<- c("up", "down", "charm", "strange", "top", "bottom")
library(dynlm)
MX <- mutate(MX,up_down <- up * down,
up_charm <- up * charm,
up_strange <- up * strange,
up_top <- up * top,
up_bottom <- up * bottom,
down_charm <- down * charm,
down_strange <- down * strange,
down_top <- down * top,
down_bottom <- down * bottom,
charm_strange <- charm * strange,
charm_top <- charm * top,
charm_bottom <- charm * bottom,
strange_top <- strange * top,
strange_bottom <- strange * bottom,
top_bottom <- top * bottom)
Я не могу использовать нотацию умножения формул, чтобы получить термины взаимодействия, потому что он отбрасывает квадратные термины и потому что (насколько я знаю) нет способа сделать это правильно с лагами. Обратите внимание, что мне не нужны термины взаимодействия между переменными с разными лагами, например, я не хочу термин для lag(up, 1) * lag(down, 4)
.
Итак, я не предоставил что-то сломанное, что нужно исправить. Это работает. Мне это кажется действительно глупым. Индивидуальная печать этих 27 терминов и необходимость определения всех, кроме моих первоначальных шести переменных, с одним уравнением на переменную, кажется всего лишь видом повторяющейся, склонной к ошибкам тяжелой работы, которую R, как предполагается, позволяет мне избежать.
Более того, моя истинная ситуация значительно хуже, чем эта, потому что я хочу оценить большинство из этих уравнений несколькими способами, недоступными через dynlm, поэтому у меня обычно не будет доступных расширенных функций запаздывания и разности, которые предоставляет dynlm, как используется в примере. над. В частности, я надеюсь использовать инструменты в новом пакете fable / fabletools / tsibble и запускать версии этих формул LASSO и т. П., Поэтому вместо 27 терминов в приведенном выше примере у меня будет отдельный термин для каждого уровень запаздывания, или 208 слагаемых (209 с константой).
Люди используют R на гораздо больших наборах переменных, чем я здесь, и я уверен, что оценка квадратичных c форм по этим переменным имеет Должна быть общая проблема (например, например, производственная функция транслога из экономики или квадратичная c оценка поверхности отклика в факторных и дробных факторных планах из многих дисциплин). Кто-то должен был придумать более разумный подход, чем этот. Кто-нибудь может предложить один?