【R言語】線形回帰から複雑なモデルまで!係数抽出の全手法

2025-05-26

モデルの係数を抽出するための最も一般的な関数は coef() です。

coef() 関数の基本的な使い方

# 例として、線形回帰モデルを作成します
model <- lm(mpg ~ wt + disp, data = mtcars)

# coef() 関数を使ってモデルの係数を抽出します
coefficients <- coef(model)

# 抽出された係数を表示します
print(coefficients)

このコードを実行すると、以下のような出力が得られます(数値は例です)。

(Intercept)          wt        disp
  37.285126  -3.877830  -0.009370
  • disp: disp(排気量)が 1 単位増加すると、他の予測変数(この場合は wt)が一定であれば、mpg(燃費)は約 0.0094 単位減少すると予測されます。こちらも係数が負の値なので、排気量が増加すると燃費は悪くなる傾向があることを示しています。
  • wt: wt(車の重量)が 1 単位増加すると、他の予測変数(この場合は disp)が一定であれば、mpg(燃費)は約 3.88 単位減少すると予測されます。係数が負の値なので、重量が増加すると燃費は悪くなる傾向があることを示しています。
  • (Intercept): 切片(せっぺん)と呼ばれ、他のすべての予測変数の値がゼロである場合の応答変数の予測値を示します。この例では、wt(車の重量)と disp(排気量)がどちらもゼロの場合、mpg(燃費)は約 37.29 と予測されます。
  • 特定の係数だけを取り出したい場合は、抽出された係数オブジェクトに対してインデックスを指定することができます。例えば、coefficients["wt"] とすれば、wt の係数だけを取り出すことができます。
  • モデルによっては、係数以外にも標準誤差、t 値、p 値などの情報が一緒に表示されることがあります。これらの情報は、係数の統計的な有意性を評価するのに役立ちます。
  • coef() 関数は、lm() 関数だけでなく、glm()lmer() など、他の多くのモデル構築関数で作成されたモデルオブジェクトに対しても使用できます。


モデルオブジェクトが存在しない、または名前が間違っている

  • トラブルシューティング
    • モデルを作成した際の変数名を再度確認してください。
    • ls() 関数を使用して、現在の R 環境に存在するオブジェクトの一覧を表示し、モデルオブジェクトの名前が正しいか確認してください。
    • モデル作成のコードが正しく実行されていることを確認してください。
  • 原因
    coef() 関数に渡しているモデルオブジェクトの名前が、実際に作成したオブジェクトの名前と異なっているか、まだそのオブジェクトを作成していない可能性があります。
  • エラー例
    coef(my_model)
    # エラー: オブジェクト 'my_model' が見つかりません
    

coef() 関数に適切なモデルオブジェクトが渡されていない

  • トラブルシューティング
    • class() 関数を使用して、coef() に渡そうとしているオブジェクトのクラスを確認してください。
    • モデル構築関数 (lm(), glm(), lmer() など) を使用して、適切なモデルオブジェクトを作成していることを確認してください。
  • 原因
    coef() 関数は、線形回帰モデル (lm)、一般化線形モデル (glm)、混合効果モデル (lmer) など、特定のクラスのモデルオブジェクトに対して適用される関数です。データフレームなどの他のオブジェクトを渡すと、上記のようなエラーが発生します。
  • エラー例
    my_data <- data.frame(x = 1:5, y = 2*(1:5) + rnorm(5))
    coef(my_data)
    # エラー: 'no applicable method for 'coef' applied to an object of class "data.frame"'
    

モデルがまだ作成されていない、またはエラーが発生して作成に失敗している

  • トラブルシューティング
    • モデル構築のコードを再度実行し、エラーメッセージが表示されていないか注意深く確認してください。
    • モデルオブジェクトの内容を summary() 関数などで確認し、モデルが正常に構築されているか確認してください。
  • 原因
    モデル構築のコードが実行されていないか、実行時にエラーが発生してモデルオブジェクトが正しく作成されていない可能性があります。
  • エラー例
    coef() を実行してもエラーは表示されないが、期待される係数が得られない(例えば NULL が返ってくるなど)。

モデルに係数が存在しない場合

  • トラブルシューティング
    • モデルの summary() を確認し、係数のセクションが存在するか、エラーや警告メッセージが表示されていないか確認してください。
    • モデルの構築方法や設定が意図通りであるか再検討してください。
  • 原因
    一部の特殊なモデルや、何らかの理由で係数が推定されなかった場合、coef() を実行しても係数が得られないことがあります。

パッケージがロードされていない

  • トラブルシューティング
    • 必要なパッケージが library() 関数でロードされていることを確認してください。
  • エラー例
    特定のパッケージ(例えば lme4 パッケージの lmer() で作成したモデルなど)のモデルに対して coef() を使用しようとした際に、関連する関数が見つからないというエラーが発生する可能性があります。

モデルの構造が複雑で、期待する形式で係数が抽出されない

  • トラブルシューティング
    • モデルの構造を理解し、必要に応じて fixef() (固定効果) や ranef() (ランダム効果) など、より具体的な関数を使用してください。
    • パッケージのドキュメントやヘルプファイル (?fixef など) を参照し、適切な関数の使い方を確認してください。
  • 原因
    混合効果モデルなどの複雑なモデルでは、固定効果とランダム効果など、複数の種類の係数が存在します。単純に coef() を実行しただけでは、期待する特定の係数が抽出されない場合があります。
  • トラブルシューティング
    • そのモデルオブジェクト専用の係数抽出関数が存在するか、パッケージのドキュメントなどを確認してください。例えば、機械学習パッケージ caret で作成したモデルでは、coef(model$finalModel) のようにアクセスする必要がある場合があります。
  • 原因
    一部の特殊な統計モデルや機械学習モデルは、標準的な coef() 関数に対応していない場合があります。


線形回帰モデル (lm) の係数抽出

これは最も基本的な例です。lm() 関数で作成した線形回帰モデルから coef() 関数を使って係数を抽出します。

# サンプルデータの作成
data <- data.frame(
  y = c(5, 8, 12, 15, 18),
  x1 = c(1, 2, 3, 4, 5),
  x2 = c(2, 4, 1, 3, 5)
)

# 線形回帰モデルの構築 (y を x1 と x2 で予測)
model_lm <- lm(y ~ x1 + x2, data = data)

# coef() 関数で係数を抽出
coefficients_lm <- coef(model_lm)

# 抽出された係数の表示
print(coefficients_lm)

出力例

(Intercept)          x1          x2
  2.0000000   2.5000000   0.5000000

この出力は、切片(Intercept)、x1 の係数、x2 の係数を示しています。

一般化線形モデル (glm) の係数抽出

ロジスティック回帰などの一般化線形モデルでも、同様に coef() 関数を使って係数を抽出できます。

# サンプルデータの作成 (二値の応答変数)
data_glm <- data.frame(
  y = factor(c(0, 1, 0, 1, 1)),
  x = c(1, 2, 3, 4, 5)
)

# ロジスティック回帰モデルの構築
model_glm <- glm(y ~ x, data = data_glm, family = binomial(link = "logit"))

# coef() 関数で係数を抽出
coefficients_glm <- coef(model_glm)

# 抽出された係数の表示
print(coefficients_glm)

出力例

(Intercept)           x
 -3.4011974   1.1386629

ロジスティック回帰の係数は、応答変数の対数オッズに対する予測変数の影響を示します。

複数の係数を個別に抽出

抽出された係数オブジェクトは、名前を使って個々の係数にアクセスできます。

# 上記の線形回帰モデル (model_lm) を使用

# x1 の係数を抽出
coefficient_x1 <- coefficients_lm["x1"]
print(coefficient_x1)

# 切片を抽出
intercept <- coefficients_lm["(Intercept)"]
print(intercept)

出力例

x1
2.5
(Intercept)
2

係数と他のモデル情報の組み合わせ

summary() 関数を使うと、係数だけでなく、標準誤差、t 値、p 値などの統計情報も一緒に確認できます。

# 上記の線形回帰モデル (model_lm) を使用

# モデルのサマリーを表示
summary_model_lm <- summary(model_lm)
print(summary_model_lm)

# サマリーから係数に関連する部分を抽出
coefficients_summary <- summary_model_lm$coefficients
print(coefficients_summary)

summary_model_lm$coefficients は、係数、標準誤差、t 値、p 値を含む行列を返します。

混合効果モデル (lmer) の係数抽出 (固定効果)

lme4 パッケージの lmer() 関数で作成した混合効果モデルの場合、固定効果の係数を抽出するには fixef() 関数を使用します。

# lme4 パッケージのロード
library(lme4)

# サンプルデータの作成 (グループ化変数を含む)
data_lmer <- data.frame(
  y = rnorm(30),
  x = rep(1:10, each = 3),
  group = factor(rep(LETTERS[1:3], each = 10))
)

# 混合効果モデルの構築 (ランダム切片モデル)
model_lmer <- lmer(y ~ x + (1 | group), data = data_lmer)

# 固定効果の係数を抽出
fixed_effects <- fixef(model_lmer)
print(fixed_effects)

出力例

(Intercept)           x
 -0.1234567   0.0567890

fixef() は固定効果の係数のみを返します。ランダム効果の分散などは別の関数 (VarCorr()) で確認します。

モデル係数をデータフレームとして扱う

抽出した係数をさらに処理するために、データフレームに変換することがあります。

# 上記の線形回帰モデル (model_lm) を使用

# 係数をデータフレームに変換
coefficients_df <- as.data.frame(coefficients_lm)
print(coefficients_df)

# 列名をつけて見やすくする
coefficients_df <- as.data.frame(coefficients_lm)
colnames(coefficients_df) <- "Estimate"
print(coefficients_df)
            coefficients_lm
(Intercept)       2.0000000
x1              2.5000000
x2              0.5000000
            Estimate
(Intercept)  2.0000000
x1         2.5000000
x2         0.5000000


モデルオブジェクトの要素に直接アクセス

多くのモデルオブジェクトは、係数に関する情報を含む要素を持っています。これらの要素に直接アクセスすることで、coef() 関数を使わずに係数を抽出できます。ただし、モデルの種類によって要素の名前や構造が異なるため、注意が必要です。

# 線形回帰モデルの例 (lm)
model_lm <- lm(mpg ~ wt + disp, data = mtcars)

# モデルオブジェクトの構造を確認
str(model_lm)

# 係数を含む要素 ($coefficients) に直接アクセス
coefficients_direct <- model_lm$coefficients
print(coefficients_direct)

str(model_lm) を実行すると、モデルオブジェクトが持つ様々な要素が表示されます。線形回帰モデルの場合、通常 $coefficients という要素に係数が格納されています。

summary() 関数の結果を利用

# 線形回帰モデルの例 (lm)
model_lm <- lm(mpg ~ wt + disp, data = mtcars)

# summary() 関数の結果を取得
summary_model <- summary(model_lm)

# summary オブジェクトの構造を確認
str(summary_model)

# 係数を含む要素 ($coefficients) にアクセス
coefficients_from_summary <- summary_model$coefficients[, "Estimate"]
print(coefficients_from_summary)

summary_model$coefficients は係数、標準誤差、t 値、p 値などを含む行列です。[, "Estimate"] を指定することで、係数の推定値の列だけを抽出しています。

モデル固有の関数

一部のパッケージや特定の種類のモデルには、係数を抽出するための専用の関数が用意されている場合があります。

  • survival パッケージの coxph() モデル
    Cox 比例ハザードモデルの係数を抽出する場合も、coef() 関数が一般的に使用できますが、モデルオブジェクトの構造を直接調べたり、summary() の結果を利用したりすることも可能です。

    library(survival)
    # サンプルデータの作成 (survival パッケージのデータセットを利用)
    data(lung)
    model_coxph <- coxph(Surv(time, status) ~ age + sex, data = lung)
    
    # coef() 関数で抽出
    coeffs_coxph <- coef(model_coxph)
    print(coeffs_coxph)
    
    # summary() 関数から抽出
    summary_coxph <- summary(model_coxph)
    coeffs_from_summary_coxph <- summary_coxph$coefficients[, "coef"]
    print(coeffs_from_summary_coxph)
    
  • nlme パッケージの lme() モデル
    固定効果の係数を抽出するには fixed.effects() 関数を使用できます。

    library(nlme)
    # サンプルデータの作成 (nlme パッケージのデータセットを利用)
    data(Orthodont)
    model_lme <- lme(distance ~ age + Sex, random = ~ 1 | Subject, data = Orthodont)
    
    # 固定効果の係数を抽出
    fixed_coeffs_lme <- fixed.effects(model_lme)
    print(fixed_coeffs_lme)
    

broom パッケージの tidy() 関数

broom パッケージは、モデルオブジェクトを整然としたデータフレーム形式に変換するための便利なパッケージです。tidy() 関数を使うと、係数、標準誤差、p 値などを扱いやすいデータフレームとして抽出できます。

# broom パッケージのロード
library(broom)

# 線形回帰モデルの例 (lm)
model_lm <- lm(mpg ~ wt + disp, data = mtcars)

# tidy() 関数で係数を抽出
tidy_coefficients <- tidy(model_lm)
print(tidy_coefficients)

tidy() 関数は、係数の名前 (term)、推定値 (estimate)、標準誤差 (std.error)、t 統計量 (statistic)、p 値 (p.value) を含むデータフレームを返します。

注意点

  • broom::tidy() 関数は、様々な種類のモデルに対応しており、一貫した形式で結果を得られるため、スクリプトの可読性や後続の処理を容易にするのに役立ちます。
  • モデルオブジェクトの内部構造は、パッケージのバージョンやモデルの種類によって変更される可能性があります。そのため、直接要素にアクセスする方法は、coef() などの安定したインターフェースを持つ関数よりも、わずかに脆い場合があります。