Р: Как я могу эффективно генерировать формулы R для квадратичных c форм во многих переменных? - PullRequest
1 голос
/ 03 мая 2020

Я уже задавал пару версий этого вопроса раньше, но я пытаюсь снова, потому что я полностью убежден, что уже должен быть лучший ответ, чем я видел до сих пор.

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

...