Letný semester 2025 | Cvičenie 3 | 10.03.2025
Prihlásenie k SAS OnDemand:
https://www.sas.com/en_us/software/on-demand-for-academics.html
Nutná je registrácia s vytvorením vlastného účtu s jedinečným
identifikačným číslom a potvrdenie registrácia prostredníctvom emailu
zadaného pri registrácii. Identifikačné číslo užívateľa (vo forme
uXXX, kde
XXX je samotné číslo uživateľa)
sa objavuje v niektorých následujúcich SAS skriptoch. Príslušný symbol
XXX je potrebné vždy nahradiť
príslušným identifikačným číslom užívateľa.
Korelované (resp. závislé) opakované (longitudinálne) pozorovania lze často vhodne analyzovať aj klasickými štatistickými metódami a postupmi, ktoré sú primárne určené pre analýzu nezávislých a rovnako rozdelených pozorovaní (náhodný výber – tzv. i.i.d. pozorovania).
Takúto ``jednoduchú’’ analýzu je ale nutné spracovať korektným postupom. Niektoré základné metódy v tomto smere a tiež ich konkrétnu aplikáciu na reálne data v programe SAS ilustrujeme nižšie.
V prvom rade je nutné správne pochopenie celkovej štruktúry
longitudinálnych dat. Formálna (matematická) reprezentácia môže byť ale
rôzna a nemusí byť jednoznačná a jednotlivé spôsoby zápisu nemusia byť
ani ekvivalentné.
Už bolo spomenuté, že v terminológii longitudinálnych dat a ich
analýzy sa bežne používajú pojmy ako long-data, resp.
wide-data.
Z matematického hľadiska by bolo možne oba typy
reprezentovať nasledujúcim spôsobom.
Predpokládajme, že sledujeme opakovane (v čase) \(N \in \mathbb{N}\) vzájomne nezávislé subjekty a zaujíma nás konkrétna odozva – t.j. napr. náhodná veličina \(Y\). Jednotlivé (realizované) porozorvania pre každý subjekt môžeme reprezentovať ako vektor \(\boldsymbol{Y}_{i} = (Y_{i j}, \dots, Y_{i n_i})^\top\), kde \(n_i \in \mathbb{N}\) je počet opakovaných pozorovaní vrámci \(i\)-teho subjektu. Pre celkový počet pozorovaní \(N_T \in \mathbb{N}\) (počet sledovaných subjektov je značený ako \(N \in \mathbb{N}\)) samozrejme platí, že \[ N_T = \sum_{i = 1}^N n_i. \] Celkový vektor pozorovaní (t.j. long-data) je potom možné reprezentovať združene prostredníctvom výsledného vektoru \[ \boldsymbol{Y} = \Big( Y_{1 1}, \dots, Y_{1 n_1}, Y_{2 1}, \dots, Y_{N n_N}\Big)^\top = \Big(\boldsymbol{Y}_1~^\top, \dots, \boldsymbol{Y}_{N}~^\top\Big)^\top. \] Ak sú navyše longitudinálne data balancované, resp. pre každý subjekt je nameraný v rovnakom počete pozorovaní (niekedy sa navyše ešte predpokladá, že jednotlivé pozorovania sú uskutočnené v rovnakých časových okamžikoch), t.j. \(n _i = n \in \mathbb{N}\) pro \(\forall i \in \{1, \dots, N\}\) tak ``data’’ lze reprezentovat i v maticovom zápise (t.j. wide-data) ako \[ \mathbb{Y} = \left( \begin{array}{ccc} Y_{1 1} & \dots & Y_{1 n_1}\\ Y_{2 1} & \dots & Y_{2 n_2}\\ \ldots & \dots & \ldots\\ Y_{N 1} & \dots & Y_{N n_N} \end{array} \right) = \left( \begin{array}{c} \boldsymbol{Y}_1~^\top\\ \boldsymbol{Y}_2~^\top\\ \vdots \\ \boldsymbol{Y}_N~^\top\\ \end{array} \right). \] Jeden aj druhý zápis majú svoje zjavné výhody aj nevýhody (resp. obmedzenia). Pokúste sa formulovať jednotlivé výhody aj nevýhody oboch uvedených reprezentácii. Prípadné výhody a nevýhody sú evidentné hlavne pri formulácii regresného modelu pre jednotlivé reprezentácie.
Regresné rozšírenie pre vektor \(\boldsymbol{Y}\)
Predchádzajúci model lze rozšíriť v zmysle regresného konceptu. Pre slcový vektor závislých pozorovaní \(\boldsymbol{Y} = \Big(\boldsymbol{Y}_1~^\top, \dots, \boldsymbol{Y}_{N}~^\top\Big)^\top\) a regresnú maticu \(\mathbb{X} \in \mathbb{R}^{N%T \times p}\) môžeme uvažovať regresný model v tvare \[ \boldsymbol{Y} = \mathbb{X} \boldsymbol{\beta} + \boldsymbol{\varepsilon}, \] kde \(\boldsymbol{\beta} \in \mathbb{R}^p\) je \(p\)-rozmerný (neznámy) vektor parametrov. Keďže je nutné správne zohľadniť variačnú a kovariačnú štruktúru pozorovaní medzi jednotlivými (nezávislými) subjektami a korelovanosť, resp. závislosť opakovaných meraní vrámci jedného subjektu, je potrebné pre vektor náhodných chýb predpokladať vhodné rozdelenie – napr. mnohorozmerné normálne rozdelenie \[ \boldsymbol{\varepsilon} = \left( \begin{array}{c} \varepsilon_{1 1}\\ \vdots \\ \varepsilon_{1 n_1}\\ \varepsilon_{2 1}\\ \vdots \\ \varepsilon_{N n_N} \end{array} \right) \sim N_{N_T} \left( \left( \begin{array}{c} 0\\ \vdots \\ 0 \end{array} \right), \left( \begin{array}{c} \Sigma_1 & 0 & \dots & 0\\ 0 & \Sigma_2 & \dots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \dots & \Sigma_N \end{array} \right) \right), \]
kde covariančna štruktúra (nulové prvky – resp. nulové matice
vhodných rozmerov) reprezentujú vzájomnú nezávislosť medzi jednotlivými
subjektvami a príslušné (pozitívne definitné) variačné kovariačné matice
\(\Sigma_{i} \in \mathbb{R}^{m_i \times
m_i}\) pre \(i \in \{1, \dots,
n\}\) sú obecně v tvare \[
\Sigma_{i} = \left(
\begin{array}{c}
\sigma_{1 1}^{(i)} & \sigma_{1 2}^{(i)} & \dots & \sigma_{1
n_i}^{(i)}\\
\sigma_{2 1}^{(i)} & \sigma_{2 2}^{(i)} & \dots & \sigma_{2
n_i}^{(i)}\\
\vdots & \vdots & \ddots & \vdots \\
\sigma_{n_i 1}^{(i)} & \sigma_{n_i 2}^{(i)} & \dots &
\sigma_{n_i n_i}^{(i)}\\
\end{array}
\right).
\]
Regresné rozšírenie pre maticu \(\mathbb{Y}\)
V prípade odozvy reprezentovanej v maticovom tvare je zápis modelu trochu odlišny. Analogický model, ako v predchádzajúcom prípade, môžeme formálne zapísať ako \[ \mathbb{Y} = \mathbb{X}\boldsymbol{B} + \boldsymbol{E}, \] kde tentokrát \(\mathbb{X} \in \mathbb{R}^{N \times p}\) a namiesto vektoru neznámych parametrov \(\boldsymbol{\beta} \in \mathbb{R}^p\) (ako v predchádzajúcom prípade) reprezentuje \(\boldsymbol{B} \in \mathbb{R}^{p \times n}\) maticu neznámych parametrov a \(\boldsymbol{E}\) je matica chybových členov, pričom platí (uvažujúc opäť normálny model), že \(\boldsymbol{E} = (\boldsymbol{\varepsilon}_{1}, \dots, \boldsymbol{\varepsilon}_{N})^\top\), pričom náhodné vektory \(\boldsymbol{\varepsilon}_i = (\varepsilon_{i 1}, \dots, \varepsilon_{i n})^\top\) pre \(i = 1, \dots, N\) tvoria náhodný výber z mnohorozmerného normálneho rozdelenia s nulovým vektorom stredných hodnot a variačnou kovaričnou maticou \[ \Sigma = \left( \begin{array}{c} \sigma_{1 1} & \dots & \sigma_{1 n}\\ \vdots & \ddots & \vdots\\ \sigma_{n 1} & \dots & \sigma_{n n} \end{array} \right). \]
Najjednoduchším príkladom štatistickej analýzy longitudinálnych dat
môže byť klasický jednovýberový párový \(t\)-test (t.j., pre každý subjekt máme
pouze dva opakované korelované pozorovania). Tvojvýberový \(t\)-test je čosto veľmi užitočný a
efektívne aplikovateľný aj v prípade, že longitudinálne data, ktoré je
potrebné analyzovať, obsahujú v rámci jednotlivých subjektov výrazne
viacej opakovaných pozorovaní. Keďže správna (korektná) štatistická
analýza longitudinálnych dat je pomerne zložitá, v praxi sa celkom bežne
používajú niektoré jednoduchšie postupy, ktorých cieľom je určité
zjednodušenie štruktúry dat a následná štatistická analýza nezávislých
(i.i.d) pozorovaní.
V následujúcej časti budeme pre ilustráciu uvažovať csv súbor) s datami o pacientoch so sklerózou multiplex. Zameriame sa hlavne na implementáciu párového \(t\)-testu v programe SAS. Ako závislú premennú budeme uvažovať veličinu EDSS (t.j., Expanded Disability Status Scale) .
Data načítame v SAS OnDemand a náslene upravíme do vhodnejšieho tvaru (pre aplikáciu pároveho \(t\)-testu) pomocou následujúcich príkazov:
libname sm '/home/uXXX/sasuser.v94';
filename reffile '/home/uXXX/sasuser.v94/data/sm_data2.csv';
proc import datafile=reffile
dbms=csv
out=sm.data
replace;
getnames=yes;
run;
proc print datafile = sm.data;
run;
SImple boxplot for EDSS:
proc sgplot data=sm.data;
vbox EDSS / group = time;
run;
Transformation into a wide-data format:
proc sort data=sm.data; by id; run;
proc transpose data=sm.data out=sm.dataWide;
by id;
var EDSS;
run;
proc print datafile = sm.dataWide;
run;
Pre ilustráciu budeme pomocou párového \(t\)-testu analyzovať zmenu EDSS v období piatich rokov po aplikácii novej liečby – Lemtrady. Implementácia párového \(t\)-testu v programe SAS je následovná:
proc ttest data=sm.dataWide alpha=0.05;
paired COL5*COL1;
run;
Pre porovnanie, aplikujeme ešte klasický dvojvýberový \(t\)-test a vzájomne porovnáme výsledky.
Intuiitívne značenie by bolo v zmysle datového súboru vo forme dvoch
(nezávislých) náhodných výberov (s pridanou dodatočnou premennou
určujúcou príslušnú skupinu). Z datového súboru sm.dataWide
teda vyberieme pouze relevantne premenné (t.j. stĺpce COL1 a
COL5) a data príslušne upravíme.
data sm.data15;
set sm.dataWide;
keep COL1 COL5;
run;
proc print datafile = sm.data15;
run;
Vytvorili sme nový datový súbor s názvom sm.data15
.
Následne hodnoty z oboch stĺpcov združíme do jedného a príslušné riadky
označíme poradím merania:
data sm.twoSample;
length Sample $284.;
set sm.data15;
array numvars[*] _NUMERIC_;
do i = 1 to dim(numvars);
Sample = vname(numvars[i]);
EDSS = numvars[i];
output;
end;
keep Sample EDSS;
run;
proc print datafile = sm.twoSample;
run;
Následne je už možné priamo aplikovať dvojvýberový \(t\)-test na datový súbor
sm.twoSample
. Konkrétna implementácia v programe SAS je
následujúca:
proc ttest data=sm.twoSample alpha=0.05;
class Sample;
var EDSS;
run;
Intuitívna implementácia pomocou špecifikácie príslušných premenných v pôvodnom (wide) datovom súbore dopadne ale takto:
/* paired t-test */
proc ttest data=sm.dataWide alpha=0.05;
paired COL5*COL1;
run;
/* two sample t-test */
proc ttest data=sm.dataWide alpha=0.05;
var COL5 COL1;
run;
Základné rozdiely medzi “long-data” reprezentaciou (vektor odozvy
\(\boldsymbol{Y}\)) a “wide-data”
reprezentáciou (matica odozvy \(\mathbb{Y}\)) v rámci regresných modelov
formulovaných vyššie, ilustrujeme aj na reálnych datach. Pre tento účel
využijeme datový súbor cars.csv
(data lze stiahnúť ako
csv súbor).
Následne data načítame do programu SAS a pomocou procedúry
print
sa na data môžeme podívať.
libname car '/home/uXXX/sasuser.v94';
filename reffile '/home/uXXX/sasuser.v94/data/cars.csv';
proc import datafile=reffile
dbms=csv
out=car.data
replace;
getnames=yes;
run;
proc print datafile = car.data;
run;
Budeme uvažovať jednoduchhý príklad, kde odozva bude dvojrozmerná a
bude predstavovať dve ceny – výrobcom navrhnutú cenu (t.j.,
Manufacturer’s suggested retail price – MSRP) (premenná
MSRP
) a skutočnú cenu, za ktorú bolo auto zakúpené (t.j.,
premenná Invoice
).
Obe uvedené premenné sú ale v datovom súbore reprezentované ako charakterové hodnoty. Pre účely regresného modelu je potrebné premenné vhodne upraviť, aby nové premenné predstavovali kvantitatívne hodnoty (ceny).
To lze dosiahnúť napr. pomocou následujúceho kódu:
data car.data2;
set car.data;
MSRP2 = input(compress(translate(MSRP,"","$,")),best.);
Invoice2 = input(compress(translate(Invoice,"","$,")),best.);
run;
proc print datafile = car.data2;
run;
Pomocou procedúry proc reg
alebo procedúry
proc glm
môžeme fitovať požadovaný regresný model:
proc reg data=car.data2;
model MSRP2 Invoice2 = EngineSize Horsepower;
run;
proc glm data=car.data2;
model MSRP2 Invoice2 = EngineSize Horsepower;
run;
Modely vyššie porovnajte s následujúcimi modelmi:
proc reg data=car.data2;
model MSRP2 = EngineSize Horsepower;
run;
proc reg data=car.data2;
model Invoice2 = EngineSize Horsepower;
run;
Pomocou nasledujúceho kódu môžeme zároveň otestovať napríklad nulovú
hypotézu, že regresná priamka pre MSRP cenu a regresná priamka pre
skutočnú cenu (Invoice
) sú totožné.
proc reg data=car.data2 corr;
model MSRP2 Invoice2 = EngineSize Horsepower;
mtest intercept, EngineSize, Horsepower, MSRP2-Invoice2;
run;
Ako by analogicky štatistický test vyzeral a bol implementovaný v
programe SAS v prípade, že by sa pozorovania reprezetovali v tzv.
long-data type (t.j., pomocou vektoru \(\boldsymbol{Y}\) )?
Analogický a v určitom zmysle aj ekvivalentný model dostaneme ale aj pomocou tzv. long-data formatu, ked vhodne zostavíme regresný model pre vektor závislých pozorovaní \(\boldsymbol{Y}\).
Pre prehľadnosť vyberieme len relevantné premenné:
data car.dataLong;
set car.data2;
keep MSRP2 Invoice2 EngineSize Horsepower;
run;
proc print datafile = car.dataLong;
run;
Data následne upravíme do vhodného formátu:
data car.twoSample;
length Sample $856.;
set car.dataLong;
array numvars[2] MSRP2 Invoice2;
do i = 1 to dim(numvars);
Type = i;
Price = numvars[i];
output;
end;
run;
proc print datafile = car.twoSample;
run;
A pre účely implementácie potrebných interačných členov prípravíme interakčné premenné:
data car.twoSampleInt;
set car.twoSample;
Type2 = Type - 1;
EngineType = Type2 * EngineSize;
HorseType = Type2 * Horsepower;
run;
Výsledný regresný model získame následujúcim spôsobom:
proc reg data=car.twoSampleInt;
model Price = Type2 EngineSize Horsepower EngineType HorseType;
run;
Porovnajte odhadnuté parametre, príslušné smerodatné chyby a \(p\)-hodnoty príslušných štatistických testov v regresnom modeli, ktorý bol založený na wide-data type (na matici závislých pozorovaní \(\mathbb{Y}\)) a modeli, ktorý bol vybudovaný pre long-data typ (teda vektor \(\boldsymbol{Y}\) ).