##### Оглавление # 1. Загрузка и подключение необходимых библиотек R # 2. Генерация исходных данных для примера # 3. Вычисление размера эффекта (ES) # 3.1. Абсолютный размер ES # 3.1.1. Для количественных (числовых) переменных (MD) # 3.1.1 (а) Создание диаграммы с исслюстрацией абсолютной разницы между средними двух групп (исследуемой и контрольной) # 3.1.2. Для бинарных переменных (RD) # 3.2. Относительный размер ES # 3.2.1. Для количественных (числовых) переменных (SMD, d, g, delta) # 3.2.2. Для бинарных переменных (OR, RR) # 3.3. Оценка клинической эффективности в форме NNT # 3.3.1. Для количественных (числовых) переменных # 3.3.2. Для бинарных переменных #СОДЕРЖАНИЕ ЭТАПОВ # 1. Загрузка и подключение необходимых библиотек R if(!require(effectsize)) install.packages("effectsize") if(!require(simstudy)) install.packages("simstudy") if(!require(DescTools)) install.packages("DescTools") if(!require(gmodels)) install.packages("gmodels") # if(!require(ggplot2)) install.packages("ggplot2") # if(!require(epiR)) install.packages("epiR") # if(!require(meta)) install.packages("meta") # if(!require(yarrr)) install.packages("yarrr") # library(effectsize) library(simstudy) library(DescTools) library(gmodels) library(ggplot2) library(epiR) library(meta) library(yarrr) # Пакет dmetar загружается и подключается согласно инструкции на сайте https://bookdown.org/MathiasHarrer/Doing_Meta_Analysis_in_R/dmetar.html library(dmetar) # 2. Генерация исходных данных для примера # Клиническое исследование посвящено оценке влияния местных анестетиков на боль после септопластики. Проспективное двойное слепое исследование проводилось у пациентов, перенесших септопластику из-за искривления носовой перегородки. Одной из задач КИ являлось сравнение групп пациентов, получавших 1% лидокаина + 0,000625% адреналина (исследуемая группа) и 0,9% хлорида натрия (контрольная группа) в носовых тампонах Мероцель (Merocel). Местные анестетики или хлорид натрия были повторно применены в восьмой послеоперационный час. Каждому пациенту был предоставлен вопросник, в котором он отмечал оценку боли по вербальной аналоговой шкале (VAS) в определенные послеоперационные часы между 0 и 10 баллами, где 0 означает отсутствие боли, а 10 означает худшую боль, которую они могли себе представить. В случае, если пациенту требовалась дополнительная анальгезия, парентерально вводились 8 мг лорноксикама, нестероидного противовоспалительного анальгетика (это оценивалось как положительный исход). # Исходные данные, представленные в статье Karaman E. et all, 2011: https://link.springer.com/article/10.1007/s00405-010-1432-7 # Verbal analog score (VAS) scores are presented as mean ± standard deviation # Lidocaine + adrenaline (n = 30): 3.07 ± 1.77 # Control (n = 26): 4.28 ± 1.17 # The number of patients who required rescue drug. Rescue: patients who needed rescue drug. Successful: patients who did not require rescue drug # Lidocaine + adrenaline (n = 30): Rescue:3; Successful:27 # Control (n = 26):Rescue:15; Successful:11 # В таблице 2x2 представлены обозачения результатов #######Outcome ########Yes No # T TY TN # C CY CN TY<-3 # число пациентов в группе лечения с положительным исходом (необходимость парентерального введения обезболивающего средства) TN<-27 # число пациентов в группе лечения с отрицательным исходом (безнеобходимости парентерального введения обезболивающего средства) CY<-15 # число пациентов в контрольной группе с положительным исходом (необходимость парентерального введения обезболивающего средства) CN<-11 # число пациентов в контрольной группе с отрицательным исходом (без необходимости парентерального введения обезболивающего средства) n <- CY+CN+TY+TN # всего пациентов # Среднее и дисперсия VAS в исследуемой и контрольной группе VASTmu<-30.7 # средняя VAS в группе лечения VASCmu<-42.8 # средняя VAS в группе контроля VASTvar<-17.7 # дисперсия VAS в группе лечения VASCvar<-11.7 # дисперсия VAS в группе контроля # Для создания набора данных используется пакет "simstudy". Для воспроизводимости результатов этой задачи задается параметр генерации (333) # В итоговом наборе данных: # "id" - идентификатор записи # "GRTR" - группа # "OUT" - исход (1-парентеральное введение обезболивающего препарата, 0- без введения) # "VAS" - значение VAS (умноженное на 10) set.seed(333) def <- defData(varname = "GRTR", dist = "binary", formula = (TY+TN)/n, id = "id") dt <- genData(100, def) defOUT <- defCondition(condition = "GRTR == 1", formula = TY/(TY+TN), dist = "binary") defOUT <- defCondition(defOUT, condition = "GRTR == 0", formula = CY/(CY+CN), dist = "binary") defVAS <- defCondition(condition = "GRTR == 1", formula = VASTmu, variance = VASTvar, dist="normal") defVAS <- defCondition(defVAS, condition = "GRTR == 0", formula = VASCmu, variance = VASCvar, dist="normal") dt <- addCondition(defOUT, dt, "OUT") dt <- addCondition(defVAS, dt, "VAS") df<-as.data.frame(dt) df$VAS<-round(df$VAS,1) df<-df[,c("id","GRTR","OUT","VAS")] View(df) # 3. Вычисление размера эффекта (ES) # 3.1. Абсолютный размер ES # 3.1.1. Для количественных (числовых) переменных (MD) # первый способ вычисления MD заключается в нахождении разницы предварительно вычисленных средних для двух групп mean.gr1 <-mean(df[which(df$GRTR=="1"),]$VAS) # среднее VAS в исследуемой группе mean.gr0 <-mean(df[which(df$GRTR=="0"),]$VAS) # среднее VAS в контрольной группе mean.diff <- mean.gr0-mean.gr1 # разница средних # второй способ использует функцию проверки гипотезы о равенстве средних двух групп с помощью t-критерия Стьюдента. Одним из атрибутов объекта, созданного этой функцией является доверительный интервал для разности средних двух групп. Посмотреть все аттрибуты можно функцией attributes(объект) t1<-t.test(VAS~GRTR, data=df) t1$estimate # выводит средние значения двух групп t1$conf.int # выводит доверительный интервал (по умолчанию, 95%) mean.diff<-t1$estimate[1]-t1$estimate[2] # так как разницу средних среди статистик для этой функций нет, мы ее вычисляем вречную, через обращение к атрибутам напрямую names(mean.diff)<-"mean.diff" # так как имя переменной разницы средних наследуется из первого слагаемого, мы его можем переназначить mean.diff # вывод MD ############################# # 3.1.1 (а) Создание диаграммы с исслюстрацией абсолютной разницы между средними двух групп (исследуемой и контрольной) var.gr1<-var(df[which(df$GRTR=="1"),]$VAS) # дисперсия оценки VAS в группе лечения var.gr0<-var(df[which(df$GRTR=="0"),]$VAS) # дисперсия оценки VAS в группе контроля # для создания диаграммы средние значения групп (mean.gr1, mean.gr0) и их дисперсии (var.gr1, var.gr0), предварительно вычисляются и вводятся в R вручную plot(1, xlim = c(0, 100), ylim = c(0, 0.04), type = "n", main = "", ylab = "f(x)", xlab = "VAS") # Вставка надписи "Mean diff." и двунаправленной стрелки (code=3) text((43.2+31.6)/2, 0.038, labels = paste("MD","\n",43.2-31.6, sep=""), font=2) arrows(31.6,0.035,43.2,0.035,length = .1, lwd = 1,code=3) # Вставка подписи и стрелки для средних значений # adj указывает на смещение текста: положительное число - влево, отрицательное - вправо text(65, 0.035, labels = paste("Mean","\n","Control","\n",43.2,"", sep=""), font=3,adj=0, pos=1) arrows(60,0.03,43.2,0.02,length = .1, lwd = 1,code=2) # pos выравнивание всего блока текста вокруг середины ("верчение вокруг центра"): 1-снизу, 2 слева, 3 сверху,4-справа text(20, 0.035, labels = paste("Mean","\n","Treatment","\n",31.6,"", sep=""), font=3, ,pos = 1) arrows(25,0.029,31.6,0.027,length = .1, lwd = 1,code=2) # Вставка прямоугольника для представления разницы между средними двух групп rect(31.6, 0, 43.2, 0.035, density = 0, border = "black", lty =1) # Установка набора цветов из которого выбирается цвет отдельных кривых col.vec <- piratepal("google") # dnorm(mean = 2, sd = .2) my.funTr <- function(x) {return(dnorm(x, mean = 31.6, sd = 17.7))} my.funCtrl <- function(x) {return(dnorm(x, mean = 43.2, sd = 11.7))} curve(expr = my.funTr, from = 0, to = 100, add = TRUE, lwd = 3, col = col.vec[1]) curve(expr = my.funCtrl, from = 0, to = 100, add = TRUE, lwd = 3, col = col.vec[2]) # Добавление легенды legend("bottomright",title="Group", legend = c("Treatment", "Control"), col = col.vec[1:2], lwd = 3) # 3.1.2. Для бинарных переменных (RD) # см. пункт 3.2.2. С помощью функции epi.2by2() вычисляется и разность рисков RD (или атрибутивный риск) # 3.2. Относительный размер ES # 3.2.1. Для количественных (числовых) переменных (SMD, d, g, delta) # Мы используем две ветви (arm) лечения: контроль и исследуемая группа, для каждой из которых вычленяется соответсвующий набор данных VAS по группирововчному признаку treatment <-df[which(df$GRTR=='1'),]$VAS # исследуемая группа control <- df[which(df$GRTR=='0'),]$VAS # контрольная группа var.test(treatment,control) # F test для сравнения двух дисперсий d.cohens <- cohens_d(treatment,control) #Cohen’s d g.hedges <- hedges_g(treatment,control) #Hedges’ g delta.glass <- glass_delta(treatment,control) #Glass’ delta ############################# # 3.2.2. Для бинарных переменных (OR, RR) # Целесообразно преобразовать переменные для таблицы 2х2 в факторные, и назвать, примеру: group<-df$GRTR, out<-df$OUT trout<-table(df$GRTR,df$OUT) trout<-cbind(trout[,2],trout[,1]) # меняем местами и строки, и столбцы trout<-rbind(trout[2,],trout[1,]) rownames(trout)<-c("Treatment","Control") # даем новые названия строкам, если столбцам - colnames(trout)<-c("Out+","Out-") epi.2by2(trout, method="cohort.count",conf.level=0.95) # если дизайн "case.control", RR не вычисляется - epi.2by2(TAB, method="case.control",conf.level=0.95) #Для доступа и использования результатов вычисления функции используется команда attributes(), в скобках указывается объект, атрибуты которого мы хотим посмотреть. Например ep<-epi.2by2(trout, method="cohort.count",conf.level=0.95) TY<-as.numeric(ep$tab[1,1]) TN<-as.numeric(ep$tab[1,2]) CY<-as.numeric(ep$tab[2,1]) CN<-as.numeric(ep$tab[2,2]) EER <-TY/(TY+TN) CER <-CY/(CY+CN) attributes(ep) # просмотр атрибутов созданного объекта # определение, назначение переменным значений конкретных атрибута для дальнейшего использования в выражениях ORest<-ep$res$OR.crude.wald$est ORestL<-ep$res$OR.crude.wald$lower ORestU<-ep$res$OR.crude.wald$upper # 3.3. Оценка клинической эффективности в форме NNT # 3.3.1. Для количественных (числовых) переменных NNT(d = delta.glass) # Kraemer & Kupfer's метод, если известны только ES (d или g) с помощью library(dmetar) # 3.3.2. Для бинарных переменных #ORestL, ORestU, ORest рассчитаны выше функцией epi.2by2 nntOR<-nnt(ORest, p.c = CY/(CY+CN), sm = "OR", lower=ORestL, upper=ORestU) nntOR # вывод результатов #или # Binary event data, расчитанная ранее NNT(event.e=TY, event.c=CY, n.e=TY+TN, n.c=CY+CN)