まず練習にあたり必要なパッケージをインストールしましょう。
ここはよく分からなくても大丈夫です。
```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)
```