まず練習にあたり必要なパッケージをインストールしましょう。 ここはよく分からなくても大丈夫です。 ```R # 必要なパッケージをインストール・読み込み if (!require("lme4")) install.packages("lme4") if (!require("ggplot2")) install.packages("ggplot2") library(lme4) library(lmerTest) library(ggplot2) ``` 20人分のデータを作成します。 ```R # 20人の被験者データ、各被験者につき2回の測定値を直接入力 # ID: 被験者ID # visit: 測定回 (1回目か2回目) # systolic: 収縮期血圧 bp_data <- data.frame( ID = c(1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20), visit = c(1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2), systolic = c(128, 135, 115, 118, 142, 138, 125, 129, 137, 142, 118, 122, 130, 133, 140, 145, 119, 122, 131, 134, 147, 152, 122, 125, 139, 136, 133, 138, 126, 129, 145, 150, 129, 133, 136, 133, 122, 128, 138, 143) ) ``` データを確認しましょう。 ```R print(bp_data) ``` このようなデータができます。 ![[Pasted image 20250330054915.png|200]] データ型を変更します ```R bp_data$ID <- factor(bp_data$ID) # IDを因子型に変換 bp_data$visit <- factor(bp_data$visit) # visitを因子型に変換 ``` プロットしましょう。各個人について、2回目の血圧のほうが高くなっていることが分かります。 ```R # 各被験者の2回の測定値を線で繋いだプロット ggplot(bp_data, aes(x = factor(visit), y = systolic, group = ID, color = factor(ID))) + geom_point() + geom_line() + labs(title = "Change in Systolic Blood Pressure per Subject", x = "Visit", y = "Systolic Blood Pressure (mmHg)", color = "Subject ID") + theme_minimal() ``` ![[Pasted image 20250330055952.png|400]] 記述統計もしておきましょう ```R # 記述統計 cat("全体の平均収縮期血圧:", mean(bp_data$systolic), "mmHg\n") cat("1回目の平均収縮期血圧:", mean(bp_data$systolic[bp_data$visit == 1]), "mmHg\n") cat("2回目の平均収縮期血圧:", mean(bp_data$systolic[bp_data$visit == 2]), "mmHg\n") ``` いよいよ混合効果モデルを作ってみましょう ```R # IDをランダム効果として、visitを固定効果として扱う # ランダム切片モデル random_intercept_model <- lmer(systolic ~ visit + (1|ID), data = bp_data) summary(random_intercept_model) ``` 実行結果です。 ``` > summary(random_intercept_model) Linear mixed model fit by REML. t-tests use Satterthwaite's method [lmerModLmerTest] Formula: systolic ~ visit + (1 | ID) Data: bp_data REML criterion at convergence: 239.7 Scaled residuals: Min 1Q Median 3Q Max -1.5835 -0.2813 -0.0923 0.4833 1.7719 Random effects: Groups Name Variance Std.Dev. ID (Intercept) 80.553 8.975 Residual 4.541 2.131 Number of obs: 40, groups: ID, 20 Fixed effects: Estimate Std. Error df t value Pr(>|t|) (Intercept) 131.1000 2.0627 20.0409 63.558 < 2e-16 *** visit2 3.1500 0.6739 19.0000 4.675 0.000165 *** --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Correlation of Fixed Effects: (Intr) visit2 -0.163 ``` 結果が色々でてきています。論文に使われる結果として必要なのは以下の部分です。 ``` Fixed effects: Estimate Std. Error df t value Pr(>|t|) (Intercept) 131.1000 2.0627 20.0409 63.558 < 2e-16 *** visit2 3.1500 0.6739 19.0000 4.675 0.000165 *** ``` `visit1` が `(Intercept)` です。血圧が `131.1` であることが分かります。 `visit2` で、血圧が `3.15` 高くなっていることが分かります。 固定効果の信頼区間やランダム効果を確認しましょう。結果は各自確認してください。 ```R # 固定効果の信頼区間 confint(random_intercept_model, method = "Wald") # ランダム効果の確認 ranef(random_intercept_model) ``` シンプルなt検定をしてみましょう。こちらも結果は各自確認してください。 ```R # 単純な対応のあるt検定 t_test_result <- t.test(systolic ~ visit, data = bp_data, paired = TRUE) print(t_test_result) ```