Презентация профессора Святослава Леонидовича Плавинского "Изучение распространения болезней. Эпидемиология и SAS." на осенней школе по математическому моделированию ЦНИИОИЗ в октябре 2013г.
2. Небольшое вводное
замечание
• Привычное использование SAS
– Клинические испытания
– Health Care Data (обработка форм и
подготовка счетов)
– Научные исследования
3. Цели эпидемиологических
исследований
• Описать состояние здоровья
популяции
• Объяснить этиологию заболевания
• Предсказать возникновение
заболеваний
• Контролировать распространение
заболеваний
4. Типы исследований
• Описательные
– Оценка популяционных параметров (I, P)
• Гипотезо-генерирующие (EDA)
– В отсутствие четко сформулированной
гипотезы
• Какие факторы влияют на болезненность (IRR,
PR, OR)
• Подтверждающие (с заранее
сформулированной гипотезой)
5. Задача описательных
исследований
• … описать ситуацию,
• Возможно сравнить с другими
регионами, странами, группами
• Возможные отличия и поиск
этиологических факторов…
6. Что можно описывать?
• Частоту встречаемости чего-то в
популяции (распространенность,
prevalence)
• Скорость появления чего-то в
популяции (заболеваемость,
смертность, incidence)
• Средние уровни показателя
• Распределение показателя
10. Соответственно…
• Incidence
– Всегда по отношению ко времени (т.е. на
100 тыс. жителей в год), т.н. человековремя
• Prevalence
– Доля (усредненный размер популяции
(mid-period) или в конкретный момент).
12. Когда теория и практика не
совпадают
• Превалентные случаи принципиально отличаются от
инцидентых (инцидентные более тяжелые,
превалентные более доброкачественные) –
опасность скрининга
13. Когда теория и практика не
совпадают…
• Поэтому для того, чтобы установить
знак равенства между превалентными и
инцидентными случаями надо вначале
организовать наблюдение (когортное
исследование)
14. Выборка
• Для описательных (да и
эпидемиологических вообще)
исследований крайне важно обеспечить
репрезентативность данных
• Выборки
– Простая случайная
– Сложная
17. Взяли выборку
•
•
•
•
Обследовали
Измерили показатель интереса
Описываем
Например, число лиц с AUDIT > 16 делим на общее число
обследованных (prevalence)
• Количество умерших делим на сумму количества лет, которые
все пациенты находились под наблюдением (mortality)
• Число ИМ делим на на сумму количества лет, которые все
пациенты находились под наблюдением (incidence)
• Число новых случаев ИМ в течении года делим на размер
стационарной популяции (вопрос только в том, как ее точно
измерить…)
18. Стандартизация
• Довольно часто получаемые
результаты не вполне сравнимы друг с
другом ввиду различий в составе
исходных популяций
• Для облегчения сравнения данные
стандартизируются, т.е.
модифицируются так, чтобы они
соответствовали исходным данным и
некоей стандартной популяции
22. Прямая стандартизация
• Алгоритм
– Выбираем стандартную популяцию
– Рассчитываем интенсивные показатели
(заболеваемость, смертность) в подгруппах
– Оцениваем ожидаемое количество по подгруппам
(произведение интенсивного показателя и
численности в стандартной популяции)
– Суммируем и делим на численность стандартной
популяции
23. Стандартная популяция
• Выбирается произвольно (поэтому данные не
сравнимы, если используются разные
стандартные популяции)
• Выбор популяции зависит от целей
(стандартная европейская, российская, и т.п.)
• Популяции (Европа, Канада, США) можно
взять здесь:
http://seer.cancer.gov/stdpopulations/
29. Анализ
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
data new_old_audit;
set new_old_audit;
if age=0 then age=.;
if age > 15;
if age=99 then age=.;
ageg=5*floor(age/5);
alc_high= (audit GE 16);
id=_n_;
run;
proc freq;
tables ageg*alc_high;
run;
proc freq;
tables sex*gr*alc_high/nopercent nocol;
run;
proc freq data=new_old_audit noprint;
tables sex*gr*ageg*alc_high/out=x_alc(DROP=percent where=(sex=1));
run;
proc means data=x_alc noprint nway;
class gr ageg;
output out=xx_alc(DROP= _TYPE_ _FREQ_) sum(count)=n_group;
run;
30. Анализ
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
proc sort data=x_alc; by gr ageg; run;
proc sort data=xx_alc; by gr ageg; run;
data xxx_alc;
merge x_alc xx_alc;
by gr ageg;
if alc_high=1;
pct_high=count/n_group;
run;
proc sql;
create table std_alc as select
tmp_xrum2.ageg, tmp_xrum2.m_mil,
xxx_alc.gr, xxx_alc.ageg, xxx_alc.pct_high,
(tmp_xrum2.m_mil*xxx_alc.pct_high) as comp_std
from
tmp_xrum2, xxx_alc
where tmp_xrum2.ageg=xxx_alc.ageg;
quit;
proc means sum;
class gr;
var comp_std;
run;
32. Одна проблема…
• Если у нас группа 10 человек, то…
• +1 = +10%
• Надо указать, где пределы нашей
ошибки (не надо делать с данными
государственной статистики – там нет
выборки)
34. Код (не надо в последней версии
SAS)
• proc sql;
•
create table std_alc2 as select
•
tmp_xrum2.ageg, tmp_xrum2.m_mil,
•
xxx_alc.* from
•
tmp_xrum2, xxx_alc
•
where tmp_xrum2.ageg=xxx_alc.ageg;
• quit;
•
•
•
•
•
•
•
•
data an;
set std_alc2;
w_i=m_mil/1000000;
ir_i=pct_high;
nmr=count;
dnm=n_group;
varpy_i=nmr/dnm**2;
run;
35. Код (не надо в последней версии
SAS)
•
•
•
•
proc sort; by gr ageg; run;
data an;
set an;
by gr ageg;
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
retain irw varpy varpyw sumwi wmax crnum crden;
if first.gr then do;
irw=0;
varpy=0;
varpyw=0;
sumwi=0;
wmax=0;
crnum=0;
crden=0;
end;
irw=irw+(w_i*ir_i);
varpy=varpy+((w_i**2)*varpy_i);
sumwi=sumwi+w_i;
crnum=crnum+nmr;
crden=crden+dnm;
wmax=max(wmax,w_i/dnm);
36. Код (не надо в последней версии
SAS)
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
if last.gr then do;
varpyw=varpy/sumwi**2;
lgam=(varpyw/(2*irw))*CINV(0.025,((2*(irw**2))/varpyw));
if irw=0 and varpyw=0 then do;
lgam2=0; end;
else lgam2=(varpyw/irw)*gaminv(0.025,((irw**2)/varpyw));
ugam=((varpyw+(wmax**2))/(2*(irw+wmax)))*cinv(0.975,
((2*((irw+wmax)**2))/(varpyw+(wmax**2))));
if irw=0 and varpyw=0 then do;
ugam2=(0.5*cinv(0.975,2))/crden;
end;
else ugam2=(varpyw/irw)*gaminv(0.975,(((irw**2)/varpyw)+1));
output;
end;
run;
proc print;
var gr irw lgam2 ugam2;
run;
43. Повторим
• Идея заключается в том, что строится
модель, пытающаяся предсказать значения y
в зависимости от x. Тогда остаточные
значения (residuals) показывают колебания y
не связанные с x. Соответственно, можно
рассчитать значение y при интересующем
нас значении x (стандартном) и прибавить
остаточное для этого наблюдения. В
результате влияние х будет устранено, а
полученные значения y - стандартизированы.
44. Пример
• Надо проанализировать зависимость
CD4 от пути заражения
• Простой анализ показывает:
– Половой путь 491 (264) кл/мл
– ПИН 470 (247) кл/мл
– Разница 21 кл/мл
49. Таким образом
• Использование общей линейной
модели позволяет стандартизировать
(корректировать) количественные
показатели если есть подозрение, что
другие переменные оказывают влияние
на эту количественную переменную.
50. Качественные переменные
• Два основных подхода - в случае
анализа выживаемости (модель
пропорционального риска Кокса) и в
случае табличных данных (Пуассонова
регрессия).
52. Анализ
• Можно анализировать как простую таблицу
2*2, но будет сложно с добавлением других
переменных, поэтому используем Пуассонову
регрессию:
• PROC GENMOD;
• CLASS sex;
• MODEL arv_now=sex/
• DIST=POISSON LINK=LOG;
• RUN;
55. Таким образом
• Можно стандартизировать показатели (в
примере выше для мужчин) был
стандартизованный - для тех, кто принимал
наркотики в последние 4 недели
• Можно добавить количественный показатель
(возраст, время от заражения) и затем
рассчитать вероятности при средних
значениях этих параметров
56. Если учитывалось время
• Можно получить более точный результат
если есть данные по времени наблюдения
(ЧЛН)
• Количество ЧЛН для каждой ячейки таблицы
вносится при помощи команды offset.
• Соответственно, полученные результаты уже
указывают на частоту наступления на
единицу времени (т.е. заболеваемость, rate)
57. Если учитывалось время
• Если есть возможность, можно учесть время
наблюдения за каждым пациентом
• DATA new; SET iem.mu99;
• lfut=LOG(fut99/365.25);
• RUN;
• PROC GENMOD;
• CLASS idn;
• MODEL mort99=age edhigh edlow smpr ch/
• DIST=poisson LINK=log OFFSET=lfut;
• REPEATED SUBJECT=idn/TYPE=IND;
• RUN;
60. Если…
• Вымирание (заболеваемость) не
стабильная, то надо воспользоваться
моделью Кокса
• PROC FORMAT;
• VALUE gr 0=’средние’ 1=’заданные’;
• DATA bas;
• age=50; ch=220; smpr=1; edhigh=0;
edlow=0;
• RUN;
61. Сама модель и график
• PROC PHREG DATA=iem.mu99;
• MODEL fut99*mort99(0)=age ch smpr edhigh edlow;
• BASELINE OUT=mum COVARIATES=bas
SURVIVAL=surv;
• RUN;
• DATA mum; SET mum; IF smpr=1 THEN group=1;
• ELSE group=0;
• FUTy=FUT99/365.25;
• FORMAT group gr.; RUN;
• PROC GPLOT; SYMBOL I=J value=star;
• PLOT surv*FUTy=group;
• RUN; QUIT;
63. Для сложных выборок
– Surveyselect
– Surveyfreq
– Surveylogistic
– Surveymeans
– Surveyphreg
– Surveyreg
64. Выводы
• Существует значительное количество
методов стандартизации
– Простейшие - прямая и непрямая позволяют сравнивать группы,
разделенные на небольшое число
подгрупп
– Модельные позволяют сравнивать группы
после коррекции по практически любым
переменным