R言語のformulaについて、詳しく解説します。

Rのformulaについて

R言語のformulaとは、「式」を表見するオブジェクトです。ここで言う式とは、変数間の関係の表現のことです。formulaは統計的検定や回帰分析、教師あり機械学習などで頻繁に現れるため、R言語において必須の概念になります。ここでは、formulaの使い方を中心に解説します。そのため、以降は統計的な正しさは一切考慮していないのでご注意ください。また、回帰分析に使用するlm()の使い方や結果解釈の仕方なども一切考慮しておりません。

サンプルデータ

formulaの解説にあたり、Rに標準で搭載されているmtcarsデータセットを用います。mtcarsは、1974年のMotor TrendUS誌から抽出され、32台の自動車(1973〜74年モデル)の燃料消費量と自動車の設計と性能の10の側面で構成されています。

列名 説明
mpg マイル/(US) ガロン
cyl シリンダー数
disp 変位(cu.in.)
hp 総馬力
drat 後輪車軸比
wt 重量(1000ポンド)
qsec 1/4マイルタイム
vs エンジン(0 = V字型、1 = ストレート)
am トランスミッション(0 = 自動、1 = 手動)
gear 前進ギアの数
carb キャブレターの数

mtcars |> head()
(out)                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
(out)Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
(out)Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
(out)Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
(out)Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
(out)Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
(out)Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

formulaの~

formulaの基本は「~」の左側と右側に変数を記述することです。例えば、目的変数がmpg、説明変数がcylの回帰分析の場合、formulaは「mpg ~ cyl」となります。次の出力の(Intercept)は定数項(切片)を意味します。


lm(mpg ~ cyl, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl  
(out)     37.885       -2.876

formulaの+演算子

formulaの+演算子は変数を追加します。例えば、目的変数がmpg、説明変数がcylとdispの回帰分析の場合、formulaは「mpg ~ cyl + disp」となります。


lm(mpg ~ cyl + disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl + disp, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp  
(out)   34.66099     -1.58728     -0.02058

formulaの:演算子

formulaの:演算子は変数間の交互作用を表します。例えば、目的変数がmpg、説明変数がcylとdisp交互作用の回帰分析の場合、formulaは「mpg ~ cyl:disp」となります。


lm(mpg ~ cyl:disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl:disp, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)     cyl:disp  
(out)  27.083381    -0.004314 

formulaの*演算子

formulaの*演算子は2つの変数とその交互作用を表します。例えば、「mpg ~ cyl*disp」は「mpg ~ cyl + disp + cyl:disp」と等価になります。


lm(mpg ~ cyl*disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl * disp, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp     cyl:disp  
(out)   49.03721     -3.40524     -0.14553      0.01585

formulaの^演算子

formulaの^演算子は変数と指定された次数までの交互作用を表します。次は2次までの交互作用(cyl:disp、cyl:hp、disp:hp)を含めていることが確認できます。


lm(mpg ~ (cyl + disp + hp)^2, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ (cyl + disp + hp)^2, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp           hp     cyl:disp       cyl:hp      disp:hp  
(out)  5.601e+01   -4.427e+00   -1.184e-01   -1.142e-01    1.439e-02    1.556e-02   -8.567e-05 

次は3次までの交互作用を含めていることが確認できます。3次の交互作用はcyl:disp:hpです。


lm(mpg ~ (cyl + disp + hp)^3, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ (cyl + disp + hp)^3, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp           hp     cyl:disp       cyl:hp      disp:hp  cyl:disp:hp  
(out)  9.290e+01   -1.059e+01   -3.865e-01   -4.703e-01    5.270e-02    6.734e-02    2.808e-03   -3.841e-04 

formulaの%in%演算子

formulaの%in%演算子は左側の変数が右側の変数と入れ子になっていることを表します。例えば、formula「mpg ~ cyl + disp %in% cyl」は「mpg ~ cly + cly:disp」と等価です。


lm(mpg ~ cyl + disp %in% cyl, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl + disp %in% cyl, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl     cyl:disp  
(out)  34.262579    -1.847215    -0.001692

formulaの/演算子

formulaの/演算子は上記の%in%の省略形です。例えば、formula「mpg ~ cyl / disp」は「mpg ~ cyl + disp %in% cyl」と等価です。


lm(mpg ~ cyl / disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl/disp, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl     cyl:disp  
(out)  34.262579    -1.847215    -0.001692 

formulaの-演算子

formulaの-演算子は指定した項を削除することを表します。例えば、formula「mpg ~ (cyl + disp + hp)^2 – cyl:disp」は「mpg ~ cyl + disp + hp + cyl:hp + disp:hp」と等価です。


lm(mpg ~ (cyl + disp + hp)^2 - cyl:disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ (cyl + disp + hp)^2 - cyl:disp, data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp           hp       cyl:hp      disp:hp  
(out) 46.5392227   -1.6471355   -0.0522712   -0.1712206    0.0145951    0.0001544 

定数項の除外

formulaにおいて、定数項を除外する方法はいくつかあります。
formulaの+演算子を使用して定数項を除外するには、例えばformulaを「mpg ~ 0 + cyl」のように表現します。このformulaは「mpg ~ cyl + 0」と表現することもできます。


lm(mpg ~ 0 + cyl, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ 0 + cyl, data = mtcars)
(out)
(out)Coefficients:
(out) cyl  
(out)2.79 

formulaの-演算子を使用して定数項を除外するには、例えばformulaを「mpg ~ cyl – 1」のように表現します。このformulaは「mpg ~ -1 + cyl」と表現することもできます。


lm(mpg ~ cyl - 1, data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ cyl - 1, data = mtcars)
(out)
(out)Coefficients:
(out) cyl  
(out)2.79 

.演算子

formulaの.演算子はformulaにおいて未使用の変数の全てを表します。例えば、formula「mpg ~ .」は「mpg ~ cyl + disp + hp + drat + wt + qsec + vs + am + gear + carb」と等価です。


lm(mpg ~ ., data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ ., data = mtcars)
(out)
(out)Coefficients:
(out)(Intercept)          cyl         disp           hp         drat           wt         qsec           vs           am         gear  
(out)   12.30337     -0.11144      0.01334     -0.02148      0.78711     -3.71530      0.82104      0.31776      2.52023      0.65541  
(out)       carb  
(out)   -0.19942  

formulaと関数

formula内で関数が使えます。例えばformula「log(mpg) ~ factor(cyl) + disp」と記述することができます。


lm(log(mpg) ~ factor(cyl) + disp, data = mtcars)
(out)
(out)Call:
(out)lm(formula = log(mpg) ~ factor(cyl) + disp, data = mtcars)
(out)
(out)Coefficients:
(out) (Intercept)  factor(cyl)6  factor(cyl)8          disp  
(out)    3.442424     -0.162139     -0.164691     -0.001636 

formulaのI()

これまで見てきたようにformula特有の演算子は算術演算子と重複しています。そのため、formulaで算術演算子を使用したいときにはI()を使用します。例えばformula「mpg ~ I(cyl + disp)」は目的変数がmpg、説明変数が通常のベクトル同士の足し算(cyl + disp)をした結果の変数、という意味になります。


lm(mpg ~ I(cyl + disp), data = mtcars)
(out)
(out)Call:
(out)lm(formula = mpg ~ I(cyl + disp), data = mtcars)
(out)
(out)Coefficients:
(out)  (Intercept)  I(cyl + disp)  
(out)     29.74340       -0.04074 
R入門 formula