井出草平の研究ノート

k-foldクロスバリデーションを用いたロジスティックLasso回帰[R]

従属変数が連続変数のLasso回帰を今まで紹介してきたが、今回は従属変数が2値、つまりロジットモデルのLasso回帰の例を示す。

使用するのは心臓病のデータである。

データの作成

# データの読み込み(heart disease datasetを使用)
url <- "https://archive.ics.uci.edu/ml/machine-learning-databases/heart-disease/processed.cleveland.data"
column_names <- c("age", "sex", "cp", "trestbps", "chol", "fbs", "restecg", "thalach", 
                  "exang", "oldpeak", "slope", "ca", "thal", "num")
heart_data <- read.csv(url, header = FALSE, col.names = column_names)

age: 年齢(年)
sex: 性別(0 = 女性, 1 = 男性)
cp: 胸痛タイプ(1 = 典型的狭心症, 2 = 非典型的狭心症, 3 = 非狭心症痛, 4 = 無症状)
trestbps: 安静時血圧(mm Hg)
chol: 血清コレステロール(mg/dl)
fbs: 空腹時血糖値 > 120 mg/dl(1 = 真, 0 = 偽)
restecg: 安静時心電図結果(0 = 正常, 1 = ST-T波異常, 2 = 左室肥大の可能性)
thalach: 最大心拍数
exang: 運動誘発性狭心症(1 = 有, 0 = 無)
oldpeak: 運動誘発性ST抑制の程度
slope: ピーク運動STセグメントの傾斜(1 = 上向き, 2 = フラット, 3 = 下向き)
ca: 蛋白尿の数(0〜3)
thal: サラセミア(3 = 正常, 6 = 固定欠損, 7 = 可逆欠損)
num: 心臓病の重症度

numは下記のようになっている。これを心臓病あり/なしの2値に変換する。

0: 心臓病なし
1: 1本の主要な血管に狭窄がある
2: 2本の主要な血管に狭窄がある
3: 3本の主要な血管に狭窄がある
4: 4本の主要な血管に狭窄がある

データの前処理

library(dplyr)
heart_data <- heart_data %>%
  mutate(class = ifelse(num > 0, 1, 0)) %>%  # num > 0 を心臓病ありとする
  select(age, sex, cp, thalach, class) %>%    # 使用する変数を選択
  na.omit()  # 欠損値を除去

ロジットモデルのLasso回帰

library(glmnet)
# 独立変数と従属変数の設定
X <- as.matrix(heart_data[, -5])  # 独立変数
y <- heart_data$class             # 従属変数

# Lasso回帰のモデル設定と10-foldクロスバリデーションの実行
set.seed(1234)  # 再現性のためにシードを設定
cv_fit <- cv.glmnet(X, y, alpha = 1, family = "binomial", nfolds = 10)

# 結果の表示
print(cv_fit)

# 最良のλを取得
best_lambda <- cv_fit$lambda.min
print(paste("Best Lambda: ", best_lambda))

# 最終モデルの係数を取得
final_model <- glmnet(X, y, alpha = 1, lambda = best_lambda, family = "binomial")
final_coefs <- coef(final_model)
print("Coefficients: ")
print(final_coefs)
Call:  cv.glmnet(x = X, y = y, nfolds = 10, alpha = 1, family = "binomial") 

Measure: Binomial Deviance 

     Lambda Index Measure      SE Nonzero
min 0.00239    49   1.008 0.05602       4
1se 0.04692    17   1.057 0.03434       4
[1] "Best Lambda:  0.00239002571900237"
[1] "Coefficients: "
5 x 1 sparse Matrix of class "dgCMatrix"
                     s0
(Intercept) -1.69812524
age          0.03972654
sex          1.64286028
cp           0.91205721
thalach     -0.03156749