はだだだだ

定食にサラダは不要だと思う。

MENU

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の違いを理解するにはもっと勉強する必要がありそうです。