[英]How to do a repeated measures analysis in R?
我有這個數據集,我正在嘗試擬合一個 model,它評估治療是否對體重(結果)有影響,特別是允許治療效果隨時間變化。 每個“id”有多個測量值。
我正在嘗試使用重復測量方差分析來分析數據。 數據集包含幾個變量:id(患者的唯一標識符)、treatment(患者是否接受新飲食的指標 (1) 或未接受 (0))和 age(患者在研究開始時的年齡,以年為單位),結果(患者在特定就診時記錄的體重(以磅為單位))和就診編號(就診次數)。
> dput(full)
structure(list(id = c(965, 168, 133, 566, 145, 79, 49, 182, 998,
476, 314, 578, 800, 712, 574, 858, 743, 260, 155, 493, 411, 397,
232, 972, 357, 27, 794, 39, 723, 711, 982, 305, 804, 504, 607,
146, 168, 890, 720, 170, 379, 841, 543, 825, 771, 224, 8, 739,
876, 844, 5, 308, 997, 275, 802, 552, 683, 488, 743, 61, 439,
687, 172, 990, 101, 979, 57, 498, 148, 694, 810, 970, 470, 442,
321, 650, 22, 735, 622, 697, 601, 845, 689, 783, 297, 502, 901,
902, 907, 933, 831, 848, 238, 244, 562, 238, 54, 307, 157, 833
), outcome = c(178.1292789, 152.6929382, 154.9682105, 180.1792337,
155.5643838, 158.1777561, 141.2326605, 158.0372637, 170.7657935,
150.0930737, 144.8978423, 167.7295463, 170.4530778, 166.2320969,
174.6196961, 172.9699754, 165.6665897, 143.5506991, 150.8801473,
152.8867248, 141.627696, 147.7234166, 144.2490439, 186.4303623,
137.4472087, 150.8790336, 175.1623773, 156.37109, 177.8236086,
170.4165886, 175.8410723, 143.3243023, 159.6941819, 180.1754229,
163.2772414, 143.8418165, 143.5552981, 172.6175974, 177.6680813,
137.9041874, 163.4326879, 178.2426015, 173.1707072, 176.0714329,
165.7867407, 145.6877951, 150.2737186, 184.4544812, 158.2952331,
182.1838354, 148.9614953, 149.8798918, 156.5142777, 163.2968075,
177.3107927, 165.4462144, 167.9021459, 148.1217567, 163.2306892,
145.5216289, 154.5574847, 179.0495321, 145.9386308, 181.1654107,
144.8315221, 171.6145523, 148.5750191, 144.775874, 148.1463073,
172.590192, 160.9216146, 174.7643147, 139.3596933, 157.1786811,
153.3880836, 183.8471692, 148.5695133, 173.8687851, 151.5755017,
165.0664097, 180.3950209, 164.5429984, 164.983456, 178.9630521,
137.9087173, 168.668939, 169.8311543, 180.9404174, 174.0725322,
173.8267465, 174.4805713, 166.6538422, 137.5949582, 152.1977455,
166.0765327, 148.9605142, 140.4552133, 147.5073477, 146.426167,
164.9396603), visitnumber = c(4, 3, 1, 4, 1, 2, 2, 1, 2, 2, 5,
2, 5, 1, 4, 2, 2, 5, 3, 3, 4, 4, 1, 5, 5, 4, 4, 3, 4, 4, 1, 2,
2, 5, 1, 5, 5, 4, 5, 5, 1, 5, 3, 2, 1, 3, 3, 5, 1, 5, 4, 4, 1,
2, 5, 3, 1, 1, 1, 4, 3, 5, 4, 4, 4, 1, 5, 3, 3, 2, 2, 5, 4, 2,
2, 4, 3, 1, 1, 2, 2, 2, 2, 5, 3, 2, 5, 4, 2, 5, 4, 1, 5, 1, 2,
2, 4, 2, 3, 1), treatment = c(0, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1,
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 0, 0, 1,
0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0,
1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1,
1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0,
1, 1, 1, 1, 0), age = c(62.56849707, 59.9875489, 58.92425704,
62.86864989, 55.61336473, 64.98774785, 61.58430531, 66.91110054,
60.15734064, 61.336864, 56.22408195, 57.41464728, 62.32706193,
56.24078384, 59.9129205, 59.72669943, 60.7366701, 68.07162556,
65.83706817, 58.34790981, 62.92541931, 60.44772228, 59.05602316,
60.3587956, 64.20115418, 53.6724036, 63.85708009, 56.08114237,
65.0820994, 58.23011895, 62.12986331, 61.85220756, 54.94833195,
54.9549317, 59.08634974, 66.85477235, 59.9875489, 57.57695066,
54.79087254, 66.9157855, 66.20755394, 59.35629854, 62.46671274,
67.65557345, 61.17523285, 60.83744515, 55.4094255, 61.50789629,
60.07359108, 55.77166234, 66.2290783, 56.01880637, 65.75930218,
64.63645494, 59.35355296, 62.6060523, 70.28167557, 52.91174325,
60.7366701, 57.8139364, 58.41752334, 56.53555588, 58.75351312,
60.74961013, 61.51029989, 54.9842095, 56.00229494, 64.40211717,
54.86495493, 66.54053274, 53.74773261, 62.06325335, 59.65814464,
59.07963141, 59.17691183, 53.61106941, 62.58076922, 67.01218874,
54.08783732, 61.38234868, 61.70638178, 61.59147749, 62.97231388,
64.1034271, 53.7801112, 62.22005378, 61.43731322, 60.49405197,
62.2994082, 56.56848077, 59.85286766, 61.65844302, 59.36361724,
61.53807386, 62.97919029, 59.36361724, 61.85642462, 59.21186756,
56.24220335, 61.16389981)), row.names = c(4336L, 750L, 596L,
2524L, 648L, 353L, 211L, 811L, 4487L, 2132L, 1409L, 2577L, 3587L,
3184L, 2559L, 3854L, 3325L, 1158L, 691L, 2204L, 1842L, 1781L,
1032L, 4368L, 1602L, 117L, 3558L, 169L, 3237L, 3182L, 4411L,
1366L, 3602L, 2256L, 2708L, 656L, 752L, 3997L, 3224L, 760L, 1699L,
3779L, 2427L, 3700L, 3452L, 999L, 35L, 3309L, 3930L, 3794L, 22L,
1382L, 4481L, 1228L, 3596L, 2466L, 3051L, 2184L, 3324L, 268L,
1966L, 3073L, 769L, 4450L, 454L, 4396L, 251L, 2227L, 661L, 3104L,
3629L, 4359L, 2105L, 1978L, 1440L, 2905L, 96L, 3289L, 2774L,
3119L, 2682L, 3796L, 3080L, 3509L, 1330L, 2244L, 4045L, 4049L,
4070L, 4190L, 3732L, 3808L, 1063L, 1088L, 2504L, 1060L, 235L,
1375L, 700L, 3739L), class = "data.frame")
我做了model <- aov(outcome~factor(treatment)+Error(factor(id)), data = new)
但不確定這是正確的。 非常感謝!
您可以按如下方式運行單向重復測量方差分析 model,假設visitnumber
是唯一的受試者內因素,以檢查治療是否對五次訪問的體重結果有影響(我將樣本數據定義為df
):
rm_model <- aov(outcome ~ treatment + age + Error(id/visitnumber), data = df)
summary(rm_model)
# > summary(rm_model)
#
# Error: id
# Df Sum Sq Mean Sq
# treatment 1 11053 11053
#
# Error: id:visitnumber
# Df Sum Sq Mean Sq
# treatment 1 813.4 813.4
#
# Error: Within
# Df Sum Sq Mean Sq F value Pr(>F)
# treatment 1 2759 2759.4 64.97 2.24e-12 ***
# age 1 21 21.2 0.50 0.481
# Residuals 95 4035 42.5
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
您可以使用lme4()
運行混合效果 model 。 您可以包括id
的隨機截距,並且可以包括通過visitnumber
交互進行的treatment
,以允許treatment
效果隨時間變化。
library(lme4)
library(sjPlot)
model_linear <- lmer(
outcome ~ treatment * visitnumber + (1 | id), # random intercepts for id
data = mydata
)
summary(model_linear)
#> Linear mixed model fit by REML ['lmerMod']
#> Formula: outcome ~ treatment * visitnumber + (1 | id)
#> Data: mydata
#>
#> REML criterion at convergence: 607.8
#>
#> Scaled residuals:
#> Min 1Q Median 3Q Max
#> -0.85534 -0.11282 0.00127 0.12433 0.95700
#>
#> Random effects:
#> Groups Name Variance Std.Dev.
#> id (Intercept) 28.9641 5.3818
#> Residual 0.7958 0.8921
#> Number of obs: 100, groups: id, 97
#>
#> Fixed effects:
#> Estimate Std. Error t value
#> (Intercept) 162.3155 1.5297 106.111
#> treatment -2.4956 1.9717 -1.266
#> visitnumber 3.2594 0.4517 7.216
#> treatment:visitnumber -7.0199 0.5466 -12.844
#>
#> Correlation of Fixed Effects:
#> (Intr) trtmnt vstnmb
#> treatment -0.776
#> visitnumber -0.872 0.676
#> trtmnt:vstn 0.721 -0.826 -0.826
plot_model(model_linear, terms = c("visitnumber", "treatment"), type = "pred")
# add quadratic term for time
model_quadratic <- lmer(
outcome ~ treatment * poly(visitnumber, 2) + (1 | id),
data = mydata
)
summary(model_quadratic)
#> Linear mixed model fit by REML ['lmerMod']
#> Formula: outcome ~ treatment * poly(visitnumber, 2) + (1 | id)
#> Data: mydata
#>
#> REML criterion at convergence: 582.7
#>
#> Scaled residuals:
#> Min 1Q Median 3Q Max
#> -2.140e-03 -2.970e-04 7.930e-06 3.135e-04 2.350e-03
#>
#> Random effects:
#> Groups Name Variance Std.Dev.
#> id (Intercept) 2.985e+01 5.463718
#> Residual 4.837e-06 0.002199
#> Number of obs: 100, groups: id, 97
#>
#> Fixed effects:
#> Estimate Std. Error t value
#> (Intercept) 171.9800 0.7511 228.961
#> treatment -23.7468 1.1147 -21.302
#> poly(visitnumber, 2)1 46.1923 6.6151 6.983
#> poly(visitnumber, 2)2 4.0663 2.4504 1.659
#> treatment:poly(visitnumber, 2)1 -90.0634 6.6152 -13.615
#> treatment:poly(visitnumber, 2)2 -16.7434 2.4506 -6.832
#>
#> Correlation of Fixed Effects:
#> (Intr) trtmnt p(,2)1 p(,2)2 t:(,2)1
#> treatment -0.674
#> ply(vst,2)1 -0.041 0.028
#> ply(vst,2)2 -0.041 0.028 1.000
#> trtmn:(,2)1 0.041 -0.028 -1.000 -1.000
#> trtmn:(,2)2 0.041 -0.028 -1.000 -1.000 1.000
plot_model(model_quadratic, terms = c("visitnumber", "treatment"), type = "pred")
由reprex package (v2.0.1) 創建於 2022-03-14
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.