Rで関数の引数に条件式を使用する方法
回帰モデルを作成するときに、複数のformulaを用意して外部からlm()の引数に入れる方法を探していました。以下の記事にやり方が載っていました。
テストしてみました。
# sample data x <- c(rnorm(100)) y <- c(rnorm(100)) df <- data.frame(x, y) # set seed value set.seed(100) # function1 ols1 <- function(formula, df) { f <- eval(formula) result <- lm(f, df) } # function2 ols2 <- function(formula, df) { e <- substitute(formula) r <- eval(e) result <- lm(r, df) } # test two types of functions (ols1(y ~ x, df)) (ols2(y ~ x, df)) # compare answers lm(y ~ x, data = df)
実行結果が以下です。
> # test functions > (ols1(y ~ x, df)) Call: lm(formula = f, data = df) Coefficients: (Intercept) x 0.01145 -0.10537 > (ols2(y ~ x, df)) Call: lm(formula = r, data = df) Coefficients: (Intercept) x 0.01145 -0.10537 > # compare answers > lm(y ~ x, data = df) Call: lm(formula = y ~ x, data = df) Coefficients: (Intercept) x 0.01145 -0.10537
推計結果が一致しました。リンクの記事ではols2の書き方の方が"スマート"と表現されていましたが、ols1とols2の違いを理解するにはもっと勉強する必要がありそうです。