Создание сложных формул с функцией - PullRequest
1 голос
/ 08 октября 2019

Я использую следующую функцию для создания формул, где я могу просто назначить вектор имен переменных, где функция гарантирует, что все находится на своем месте и исключаются двойные имена переменных:

formula <- function(depvar, indepvars, instruments=NULL, othervars=NULL) {
    x <- c(indepvars, instruments, othervars)
    totvars <- unique(x)
    totvars <- x[!x %in% depvar]
    formula <- as.formula(
    paste(depvar, paste(totvars, collapse = " + "), sep = " ~ "))
    return(formula)
}
indepvars <- c("indepvarA", "indepvarB", "indepvarC")
instruments <- c("IV_A", "IV_B")
# lm
formula("depvar", indepvars)
# 1st stage - IV's for indepvarC
formula("indepvarC", indepvars, instruments)

Однако я хочу написать более сложную формулу (формула ivreg), а именно:

depvar ~ instrumentedvar + indepvars | instrumentvars + indepvars

Я пробовал следующее:

formula <- function(depvar, indepvars, instruments=NULL, instrumentedvar=NULL, othervars=NULL, twostage=NULL) {
    x <- c(indepvars, instruments, othervars)
    totvars <- unique(x)
    totvars <- x[!x %in% depvar]
    if (is.null(twostage)) {
    formula <- as.formula(
    paste(depvar, paste(totvars, collapse = " + "), sep = " ~ "))
    } else {
    totvarsB <- totvars[!totvars %in% instrumentedvar]
    totvarsB <- c(as.character(totvarsB), as.character(instruments))
    formula <- as.formula(
      paste(depvar, paste(paste(totvars, collapse = " + "), paste("|", paste(totvarsB, collapse = " + " )), sep = " ~ ")))
    }
    return(formula)
}
indepvars <- c("indepvarA", "indepvarB", "indepvarC")
instruments <- c("IV_A", "IV_B")
instrumentedvar <- "indepvarC"
formula("indepvarC", indepvars, instruments, twostage=1)

Но, похоже, я не могу понять это правильно.

1 Ответ

1 голос
/ 08 октября 2019

Определите reform, который берет вектор имен и выводит строку, в которой они связаны со знаком плюс. Затем используйте sprintf для генерации финальной строки и конвертируйте ее, используя as.formula:

reform <- function(x) paste(x, collapse = " + ")
makeFo <- function(lhs, rhs1, rhs2 = NULL, env = parent.frame()) {
  s <- sprintf("%s ~ %s", lhs, reform(c(rhs1, rhs2)))
  if (!missing(rhs2)) s <- sprintf("%s | %s", s, reform(rhs2))
  as.formula(s, env = env)
}

# test
makeFo("y", c("x1", "x2"))
## y ~ x1 + x2

makeFo("y", c("x1", "x2"), c("u1", "u2"))
## y ~ x1 + x2 + u1 + u2 | u1 + u2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...