
5 курс / ОЗИЗО Общественное здоровье и здравоохранение / Статистический_анализ_данных_в_медицинских_исследованиях_в_2_ч_Красько
.pdfПриложение R-6
library(PropCIs)
# Пример 1 EE=25 EN=125 CE=100 CN=100
OR=(EE/EN)/(CE/CN)
CIOR <- orscoreci(EE,EE+EN,CE,CE+CN, conf.level=0.95)
cat("Отношение шансов: ", OR,"; 95% ДИ ", CIOR$conf.int[1]," – ",CIOR$conf.int[2], "\n")
EER=EE/(EE+EN)
CER=CE/(CE+CN)
RR=EER/CER
CIRR <- riskscoreci (EE,EE+EN,CE,CE+CN, conf.level=0.95)
cat("Относительный риск: ", RR,"; 95% ДИ ", CIRR$conf.int[1]," – ",CIRR$conf.int[2], "\n")
# Пример 2 EE=125 EN=25 CE=100 CN=100
OR=(EE/EN)/(CE/CN)
CIOR <- orscoreci(EE,EE+EN,CE,CE+CN, conf.level=0.95)
cat("Отношение шансов: ", OR,"; 95% ДИ ", CIOR$conf.int[1]," – ",CIOR$conf.int[2], "\n")
EER=EE/(EE+EN)
CER=CE/(CE+CN)
RR=EER/CER
CIRR <- riskscoreci (EE,EE+EN,CE,CE+CN, conf.level=0.95)
cat("Относительный риск: ", RR,"; 95% ДИ ", CIRR$conf.int[1]," – ",CIRR$conf.int[2], "\n")
251
Приложение R-7
#Пример расчета клинического исследования двух препаратов
EE=10
EN=2
CE=4
CN=8
DifP=EE/(EE+EN)-CE/(CE+CN)
DCI <- diffscoreci(EE,EE+EN,CE,CE+CN,conf.level=0.95)
cat("Разность в пропорциях: ", DifP,"; 95% ДИ: ", DCI$conf.int[1]," – ",DCI$conf.int[2], "\n")
OR=(EE/EN)/(CE/CN)
CIOR <- orscoreci(EE,EE+EN,CE,CE+CN, conf.level=0.95)
cat("Отношение шансов: ", OR,"; 95% ДИ: ", CIOR$conf.int[1]," – ",CIOR$conf.int[2], "\n")
252
Приложение R-8
# построение ROC-кривой
library(pROC)
ls <- c(1.0, 1.1, 1.3, 1.5, 2.8, 3.7, 4.6, 4.8, 4.9, 5.5, 5.5, 5.9) response <- c(1,0,1,1,0,1,0,0,1,0,0,0)
roc.data <-roc(response , ls,ci=T) print(roc.data) #ci.auc(roc.data)
plot.roc(roc.data,print.thres='best',print.auc=TRUE, grid=TRUE, family="mono") plot.roc(smooth(roc.data), add=TRUE, col="blue")
ci.thresholds(roc.data,boot.n=200, conf.level=0.95, stratified=FALSE,thresholds='best')
253
Приложение R-9
library(abind, pos=4) library(vcd) library(lattice)
######################################
# три локализации
######################################
MS <- matrix(c(54,57,14,14,33,1), 2, 3, byrow=TRUE) rownames(MS) <- c('Наличие', 'Отсутствие') colnames(MS) <- c('I', 'II', 'III')
names(dimnames(MS)) <- c("Metastasis","Localization") MS # печать таблицы
colPercents(MS) # проценты
TestChiq <- chisq.test(MS, correct=FALSE) # хи-квадрат тест
round(TestChiq$expected, 2) round(TestChiq$stdres, 2) TestChiq
remove(TestChiq)
# создание мозаичной диаграммы рис. 14-1 trellis.device(theme="col.whitebg", family="mono")
#параметры легенды мозаичной диаграммы
q<- legend_resbased(fontsize = 10,
x = unit(1, "lines"), y = unit(0.1,"npc"),
height = unit(0.8, "npc"), width = unit(0.7, "lines"), digits = 3, check_overlap = TRUE, text = NULL,
steps = 200, ticks = 10, pvalue = TRUE, range = NULL)
#параметры мозаичной диаграммы
gg <- shading_hcl(MS, residuals = NULL, expected = NULL, df = 2, h = NULL, c = NULL, l = NULL, interpolate = c(1.5, 2), lty = 1, eps = NULL, line_col = "black", p.value = NULL, level = 0.95)
# получение рисунка
assoc(MS, shade=T, xscale=0.5,margins=c(5,4,4,5),legend = q,gp = gg, ,xlab="", main = "", labeling_args = list(1,2))
remove(MS)
#сравнение II и I metastasis <- c( 57, 54 ) all <- c( 90, 68)
prop.test(metastasis, all, alternative='less', conf.level=.95, correct=FALSE)
#сравнение II и III
metastasis <- c( 57, 14 ) all <- c( 90, 15)
prop.test(metastasis, all, alternative='less', conf.level=.95, correct=FALSE)
# сравнение II и не-II metastasis <- c( 68, 57 ) all <- c(83, 90)
prop.test(metastasis, all, alternative='two.sided', conf.level=.95, correct=FALSE)
254
# доверительные интервалы для II и не-II групп prop.test(57, 90)
prop.test(68, 83)
#Разность в пропорциях metastasis <- c( 68, 57 ) all <- c(83, 90)
t <- prop.test(metastasis, all, alternative='two.sided', conf.level=.95, correct=FALSE)
cat("разность в пропоциях=",t$estimate[1]-t$estimate[2], ", 95% ДИ", t$conf.int[1], " - ", t$conf.int[2],"\n")
#оценка пропорций и разницы в пропоциях
#с помощью библиотеки epiR
library(epiR)
round(epi.conf(matrix(c(68, 15),ncol = 2), ctype = "prop.single"), digits = 3) round(epi.conf(matrix(c(57, 33),ncol = 2), ctype = "prop.single"), digits = 3)
dat <- matrix(c(68, 15, 57, 33),ncol = 4) round(epi.conf(dat, ctype = "prop.unpaired"), digits = 3)
# оценка отношения шансов
MS.2_not2 <- matrix(c(68,15,57,33), 2, 2) rownames(MS.2_not2) <- c('Наличие', 'Отсутствие') colnames(MS.2_not2) <- c('не II', ' II')
MS.2_not2 fisher.test(MS.2_not2)
# оценка относительного риска library(PropCIs)
RR=(68/83)/(57/90)
t <- riskscoreci(68, 83, 57, 90, conf.level=0.95)
cat("относительный риск RR=",RR, ", 95% ДИ", t$conf.int[1], " - ", t$conf.int[2],"\n")
255
Приложение R-10
Исходные данные
Num |
age.at.measure |
Group |
Sex |
Osteocalcin |
BCTX |
1 |
15.7 |
HighDose |
female |
33.43 |
0.836 |
2 |
22.2 |
HighDose |
female |
35.99 |
1.170 |
3 |
21.3 |
HighDose |
male |
43.52 |
1.330 |
4 |
15.2 |
HighDose |
female |
52.36 |
0.919 |
5 |
10.0 |
HighDose |
male |
103.60 |
2.240 |
6 |
15.1 |
HighDose |
male |
86.44 |
1.820 |
7 |
15.8 |
HighDose |
male |
72.51 |
1.470 |
8 |
7.0 |
HighDose |
male |
46.65 |
0.901 |
9 |
21.7 |
HighDose |
male |
32.57 |
1.120 |
10 |
17.9 |
HighDose |
male |
42.03 |
0.877 |
11 |
7.4 |
HighDose |
male |
67.82 |
1.630 |
12 |
18.3 |
HighDose |
female |
21.04 |
0.568 |
13 |
5.7 |
HighDose |
female |
40.48 |
0.741 |
14 |
9.3 |
HighDose |
female |
43.70 |
1.070 |
15 |
17.3 |
HighDose |
female |
43.65 |
0.586 |
16 |
6.3 |
HighDose |
male |
76.78 |
2.120 |
17 |
6.4 |
HighDose |
male |
71.61 |
1.460 |
18 |
13.3 |
HighDose |
male |
30.51 |
0.723 |
19 |
20.0 |
HighDose |
male |
40.42 |
0.408 |
20 |
9.6 |
HighDose |
female |
107.10 |
1.860 |
21 |
5.5 |
HighDose |
male |
66.09 |
1.140 |
22 |
24.3 |
HighDose |
male |
17.11 |
0.211 |
23 |
8.4 |
LowDose |
male |
96.62 |
1.540 |
24 |
8.8 |
LowDose |
male |
101.30 |
2.480 |
25 |
17.8 |
LowDose |
female |
23.24 |
0.585 |
26 |
8.6 |
LowDose |
female |
83.03 |
1.510 |
27 |
21.2 |
LowDose |
female |
24.82 |
0.660 |
28 |
15.2 |
LowDose |
male |
73.47 |
1.130 |
29 |
26.6 |
LowDose |
male |
17.73 |
0.474 |
30 |
24.8 |
LowDose |
male |
30.88 |
0.527 |
31 |
13.8 |
LowDose |
male |
97.27 |
2.140 |
32 |
15.5 |
LowDose |
female |
26.03 |
0.519 |
33 |
12.1 |
LowDose |
female |
80.28 |
1.080 |
34 |
13.1 |
LowDose |
male |
111.90 |
1.780 |
35 |
18.0 |
LowDose |
female |
53.63 |
1.650 |
36 |
18.0 |
LowDose |
male |
62.95 |
1.010 |
37 |
20.7 |
LowDose |
male |
30.29 |
0.762 |
38 |
12.6 |
LowDose |
male |
114.90 |
2.940 |
39 |
11.6 |
LowDose |
male |
24.29 |
1.160 |
40 |
5.8 |
LowDose |
female |
58.73 |
1.260 |
41 |
13.4 |
LowDose |
female |
42.14 |
0.874 |
42 |
15.4 |
LowDose |
male |
59.45 |
1.290 |
43 |
13.6 |
LowDose |
male |
67.04 |
1.440 |
44 |
11.6 |
LowDose |
male |
63.40 |
1.560 |
45 |
17.6 |
LowDose |
male |
35.38 |
0.669 |
46 |
19.4 |
LowDose |
male |
25.46 |
0.573 |
47 |
18.7 |
LowDose |
female |
27.04 |
0.393 |
48 |
12.8 |
LowDose |
female |
72.90 |
1.550 |
49 |
14.4 |
LowDose |
male |
69.05 |
1.760 |
50 |
5.1 |
control |
male |
103.90 |
2.500 |
51 |
5.3 |
control |
female |
63.20 |
1.450 |
52 |
5.9 |
control |
female |
127.90 |
1.880 |
256
53 |
6.4 |
control |
female |
82.75 |
1.530 |
54 |
5.7 |
control |
male |
84.94 |
1.920 |
55 |
6.6 |
control |
male |
60.91 |
0.683 |
56 |
6.6 |
control |
female |
93.15 |
1.900 |
57 |
6.8 |
control |
male |
84.21 |
2.590 |
58 |
7.3 |
control |
male |
55.58 |
1.640 |
59 |
7.5 |
control |
male |
111.40 |
2.390 |
60 |
8.0 |
control |
male |
69.29 |
1.790 |
61 |
8.7 |
control |
female |
83.77 |
1.740 |
62 |
8.8 |
control |
female |
72.53 |
1.650 |
63 |
9.3 |
control |
male |
83.80 |
2.100 |
64 |
9.9 |
control |
male |
152.80 |
3.230 |
65 |
9.3 |
control |
female |
97.25 |
1.790 |
66 |
10.8 |
control |
female |
121.10 |
1.990 |
67 |
10.8 |
control |
female |
88.23 |
1.810 |
68 |
11.3 |
control |
female |
87.87 |
2.110 |
69 |
11.6 |
control |
male |
119.00 |
2.590 |
70 |
11.9 |
control |
female |
102.00 |
1.450 |
71 |
12.5 |
control |
female |
161.50 |
2.120 |
72 |
12.3 |
control |
male |
110.10 |
2.440 |
73 |
12.3 |
control |
male |
97.43 |
2.060 |
74 |
12.4 |
control |
male |
166.80 |
2.890 |
75 |
13.5 |
control |
male |
121.50 |
2.180 |
76 |
14.1 |
control |
female |
70.76 |
1.310 |
77 |
14.1 |
control |
male |
114.10 |
2.400 |
78 |
14.8 |
control |
male |
89.88 |
2.100 |
79 |
14.8 |
control |
female |
64.50 |
1.140 |
80 |
15.1 |
control |
female |
44.04 |
1.100 |
81 |
15.0 |
control |
female |
70.13 |
1.460 |
82 |
15.0 |
control |
male |
69.11 |
1.830 |
83 |
15.2 |
control |
male |
84.71 |
2.460 |
84 |
15.0 |
control |
male |
130.60 |
3.330 |
85 |
15.8 |
control |
male |
64.02 |
1.430 |
86 |
16.3 |
control |
female |
35.15 |
0.649 |
87 |
16.7 |
control |
female |
48.28 |
1.370 |
88 |
17.6 |
control |
male |
32.32 |
0.418 |
89 |
17.7 |
control |
male |
47.66 |
1.190 |
90 |
18.2 |
control |
female |
24.81 |
0.464 |
91 |
18.0 |
control |
male |
51.25 |
1.620 |
92 |
19.3 |
control |
female |
25.71 |
0.987 |
93 |
20.3 |
control |
female |
22.05 |
0.449 |
94 |
20.6 |
control |
female |
14.46 |
0.262 |
95 |
20.9 |
control |
male |
30.45 |
0.671 |
96 |
21.1 |
control |
male |
33.86 |
1.260 |
97 |
21.1 |
control |
male |
62.84 |
0.861 |
98 |
21.2 |
control |
male |
33.90 |
0.793 |
99 |
21.7 |
control |
female |
20.20 |
0.610 |
100 |
21.7 |
control |
male |
21.63 |
0.809 |
101 |
21.8 |
control |
male |
23.55 |
0.437 |
102 |
21.8 |
control |
male |
27.28 |
0.562 |
103 |
23.6 |
control |
male |
24.03 |
0.830 |
104 |
25.4 |
control |
male |
24.63 |
0.631 |
105 |
26.5 |
control |
male |
16.57 |
0.368 |
257
Скрипт R для выполнения анализа
Перед выполнением необходимо скопировать данные, сохранить в текстовом файле или файле EXCEL и импортировать их в набор данных R под именем Markers.
library(abind)
library(nortest)
library(abind)
library(e1071)
library(class)
library(lattice)
library(grid)
library(colorspace)
library(effects)
library(car)
library(effects)
Markers$Group <- factor(Markers$Group, levels=c('control','LowDose','HighDose'))
##############################################
#Наблюдения по полу и объему лечения
#Таблица 16-5
xtabs(~Group + Sex, data=Markers)
##################################################################################
# BCTX
########################################################################
#Шаг 1 предварительные исследования зависимой переменной
########################################################################
#выделение контрольной группы
control.BCTX <- subset(Markers, subset=Group=="control", select=c(BCTX))
#проверка на соответствие закону нормального распределения shapiro.test(control.BCTX$BCTX)
sf.test(control.BCTX$BCTX)
#выделение группы под воздействием
treat.BCTX <- subset(Markers, subset=Group!="control", select=c(BCTX))
# проверка на соответствие закону нормального распределения
shapiro.test(treat.BCTX$BCTX) sf.test(treat.BCTX$BCTX)
# проверка на соответствие закону нормального распределения всей выборки
shapiro.test(Markers$BCTX) sf.test(Markers$BCTX) par(family='mono') plot(density (Markers$BCTX))
# Графики Рис.16-8, Рис.16-9 trellis.device(theme="col.whitebg", family="mono")
scatterplot(BCTX~age.at.measure | Sex, reg.line=FALSE, smooth=TRUE, spread=F, boxplots='xy', cex.axis=0.8, span=0.5, jitter=list(x=1, y=1), by.groups=TRUE, data=Markers)
258
scatterplot(BCTX~age.at.measure | Group, reg.line=FALSE, smooth=TRUE, spread=F, boxplots='xy', cex.axis=0.8, span=0.5, jitter=list(x=1, y=1), by.groups=TRUE, data=Markers)
# создание бинарного предиктора контроль-лечение
Markers$Expose <- with(Markers, 1*(Group!='control')) Markers$Expose <- factor(Markers$Expose, labels=c('control','expose'))
scatterplot(BCTX~age.at.measure | Expose, reg.line=FALSE, smooth=TRUE, spread=F, boxplots='xy', cex.axis=0.8, span=0.5, jitter=list(x=1, y=1), by.groups=TRUE, data=Markers)
# группы возраста
numSummary(Markers[,"age.at.measure"], statistics=c("mean", "sd", "quantiles"),quantiles=c(0,.25,.5,.75,1))
Markers$Age.Group <- with(Markers, 1*(age.at.measure<10)+ 2*(age.at.measure>=10 & age.at.measure<15)+3*(age.at.measure>=15 & age.at.measure<=18)+4*(age.at.measure>18)) Markers$Age.Group <- factor(Markers$Age.Group, labels=c('до 10','10-14','15-18','18+'))
# Таблица 16-6
.Table <- xtabs(~Age.Group+Sex, data=Markers)
.Table
chisq.test(.Table, correct=FALSE)
#проверка на различие возраста в группа, множественное сравнение
TukeyHSD(aov(age.at.measure ~ Age.Group*Sex, data=Markers))
#Таблица 16-7
.Table <- xtabs(~Age.Group+Expose, data=Markers)
.Table
chisq.test(.Table, correct=FALSE) remove(.Table)
##################################
# Шаг 2 предварительная модель #
##################################
#предварительная модель с основными эффектами
LM.0 <- lm(BCTX ~ Age.Group+Group+Sex, data=Markers)
#Таблица 16-8 Anova(LM.0, test="F")
#Таблица 16-9 summary(LM.0)
########################################################################
#Шаг 3 провека линейной гипотезы о равенстве коэффициентов регрессии
#снижение количества параметров модели, сравнение моделей
########################################################################
#проверка линейной гипотезы о различимом воздействии выскокодозного и низкодозного воздействия linearHypothesis(LM.0, "Group[T.HighDose] - Group[T.LowDose] = 0")
#проверка линейной гипотезы о различии возрастных групп до 14 и 10-14
linearHypothesis(LM.0, "Age.Group[T.10-14] = 0")
# сокращение возрастных групп
Markers$Age.Group.BCTX <- with(Markers, 1*(age.at.measure<15)+2*(age.at.measure>=15 & age.at.measure<=18)+3*(age.at.measure>18))
259
Markers$Age.Group.BCTX <- factor(Markers$Age.Group.BCTX, labels=c('до 15','15-18','18+'))
#предварительная модель с основными эффектами
LM.1 <- lm(BCTX ~ Age.Group.BCTX+Expose+Sex, data=Markers)
#Таблица 16-10 Anova(LM.1, test="F")
# сравнение моделей anova(LM.0, LM.1, test="F")
##################################################
# Шаг 4 провека наличия эффектов взаимодействия
##################################################
LM.interaction <- stepAIC(LM.1, ~ .^2 ,direction='both', k=2,trace =T )
#Таблица 16-11 Anova(LM.interaction, test="F")
#Таблица 16-12 summary(LM.interaction)
#проверка линейной гипотезы
linearHypothesis(LM.interaction, "Expose[T.expose] + Age.Group.BCTX[T.18+]:Expose[T.expose] = 0")
##############################################
#Шаг 5 исследование остатков и выбросов
##############################################
#основные графики для исследования остатков Рис. 16-10 oldpar <- par(oma=c(0,0,3,0), mfrow=c(1,2),family='mono') plot(LM.interaction,sub.caption = "LM.interaction", which=c(1,2)) par(oldpar)
#проверка остатков
res.LM.interaction <- residuals(LM.interaction) shapiro.test(res.LM.interaction) sf.test(res.LM.interaction)
#тест на выбросы outlierTest(LM.interaction, cutoff=Inf)
#График Рис 16-11
influencePlot(LM.interaction, id.method="identify")
# влияющие наблюдения
inflm <- influence.measures(LM.interaction) summary(inflm)
##########################################################
# удаление выброса и повторение шагов подгонки модели
##########################################################
Markers.New <- Markers[-c(84),]
# Повтороение подгонки модлеи
LM.prem <- lm(BCTX ~ Age.Group+Group+Sex, data=Markers.New)
260