1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
* Subject(!): Re: Площадь под кривой.

* Вот синтаксис, который я написал для решения аналогичной проблемы. Площадь
считается по формуле трапеции. Если моменты времени будут равномерно
распределены, синтаксис может быть упрощен, хотя можно применять и так, без
изменений. Нужно только поменять названия переменных и моменты времени.
* Надеюсь, это поможет.

* David Matheson
* Техническая поддержка SPSS


* Исходный вопрос. Как заставить SPSS подсчитать площадь под кривой для
каждого наблюдения в файле данных? У меня есть измерения уровня лекарства в
крови пациента в каждый из 9 моментов времени. Эти моменты неравномерно
распределены, но одинаковы для всех пациентов. Предположим, я строю график
зависимости уровня лекарства от времени для каждого пациента. Мне нужно,
чтобы SPSS подсчитал площадь под кривой каждого графика, используя
интегрирование по формуле трапеции, и сохранил результат в новой переменной.
* Мне также нужно сохранить максимальный уровень лекарства для каждого
пациента и момент времени, в который он впервые наблюдался.

* Пример данных:.
INPUT PROGRAM.
-	LOOP id=1 TO 50.
-		DO REPEAT v=TH00,TH05,TH10,TH15,TH20,TH30,TH40,TH60,TH80.
-			COMPUTE v=UNIFORM(25).
-		END REPEAT.
-	END CASE.
-	END LOOP.
-	END FILE.
END INPUT PROGRAM.

EXECUTE.
DO REPEAT  h = h00 h05 h10 h15 h20 h30 h40 h60 h80
	/ t = 0 .5 1 1.5 2 3 4 6 8 .
COMPUTE h = t.
END REPEAT.
EXECUTE.

* Интегрирование функции drug = f(time) по формуле трапеции.
* drug - лекарство, time - время.

VECTOR time = h00 to h80.
VECTOR drug = th00 to th80.
COMPUTE cmax = MAX(th00 to th80).
COMPUTE tmax = $sysmis.
COMPUTE lagdrug = $sysmis.
COMPUTE lagtime = $sysmis.
COMPUTE auc = 0.
LOOP #k = 1 to 9.
-	DO IF (NOT(MISSING(drug(#k)))).
-		IF (NOT(MISSING(lagdrug)))
			auc = auc + (time(#k) - lagtime)*(lagdrug + drug(#k))/2 .
-		IF (drug(#k) = cmax and missing(tmax)) tmax = time(#k) .
-		COMPUTE lagdrug = drug(#k).
-		COMPUTE lagtime = time(#k).
-		END IF.
END LOOP.
EXECUTE.

* Сохраняем файл с добавленными переменными CMAX (максимальный уровень),
TMAX (номер момента времени, в который наблюдался максимальный уровень), и
AUC (площадь под кривой), удаляя все промежуточные переменные,
использованные для их вычисления.

save outfile drugauc.sav
	/ drop = h00 to h80 lagdrug lagtime.