従属変数が連続変数の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