Letný semester 2026 | Cvičenie 2 | 09.03.2026
Prihlásenie k SAS OnDemand:
https://www.sas.com/en_us/software/on-demand-for-academics.html
Nutná je registrácia s vytvorenie účtu s vlastným identifikačným číslom
a potvrdenie registrácie prostredníctvom (univerzitného) emailu zadaného
pri registrácii. Identifikačné číslo užívateľa (vo forme
uXXX, kde
XXX je samotné číslo uživateľa)
sa vyskytuje v jednotlivých SAS skriptoch uvedených nižšie (symbol
XXX v skriptoch je potrebné
nahradiť príslušným identifikačným číslom užívateľa).
Analogicky ako v prípade štandardných (lineárnych) regresných modelov (resp. akejkoľvek štatistickej analýzy – t.j. aplikácie konkrétneho stochastického/pravdepodobnostného modelu), je štatistická analýza dat rozdelená do dvoch samostatných, ale vzájomne prepojených časti – exploratívnej analýzy a konfirmačnej analýzy (exploratory vs. confirmatory part). Exploratívna analýza využíva rôzne popisné charakteristiky (t.j., empirické odhady teoretických charakteristík) a nástroje pre vizualizáciu dat. Konfirmačná analýza (i.e., štatistická inferencia) hľadá pomocou vhodných pravdepodobnostných metód odpoveď na konkrétnu (expertnú) otázku (t.j., testuje konkrétnu nulovú hypotézu).
Hlavnou výhodou longitudinálnych dat (a modelov určených na ich analýzu) je to, že na rozdiel od (viacmenej jednoduchého) cross-sekčného porovnania dvoch (rôznych a disjunktných) subpopulácii umožňujú odhadovať a porovnávať (testovať) aj (výrazne komplexnejšiu a netriviálnu) zmenu v rámci konkrétnych subjektov a to vzhľadom k (časovo/priestorovo) meniacim sa hodnotám nezávislých premenných popisujúcih jednotlivé subjekty. Klasická regresná analýza cross-sekčných dat umožňuje len porovnávať dve podskupiny, ktoré sa vzájomne líšia vzhľadom k hodnotám (uvažovaných) nezávislých premenných. Longitudinálne data a modely ale nad rámec tohto porovnania umožňujú aj porovnanie dynamických zmien v rámci konkrétnych subjektov. Nejedná sa ale o kauzálnu analýzu.
Pre \(N \in \mathbb{N}\) nezavislých
subjektov, z ktorých každý subjekt \(i \in
\{1, \dots, N\}\) sledujeme opakovane \(n_i \in \mathbb{N}\) krát, môžeme data
reprezentovať v tvare \(\{(Y_{ij},
\boldsymbol{X}_{ij}^\top)^\top;~i = 1, \dots, N; j = 1, \dots,
n_{i}\}\). V prípade reprezentácie v zmysle \[
\{(\boldsymbol{Y}_{i}^\top, \boldsymbol{X}_{i 1}^\top, \dots,
\boldsymbol{X}_{i n_i}^\top)^\top;~i = 1, \dots, N\},
\] kde \(\boldsymbol{Y}_i =
(Y_{i1}, \dots, Y_{i n_i})^\top\), môžeme dokonca (pri niektoých
dodatočných predpokladoch) hovoriť o náhodnom výbere (nezávislé a
rovnako (združene) rozdelené náhodné vektory). Je nutné si ale uvedomiť,
že rozmer (dĺžka) náhodných vektorov \((\boldsymbol{Y}_{i}^\top, \boldsymbol{X}_{i
1}^\top, \dots, \boldsymbol{X}_{i n_i}^\top)^\top\) je pre rôzne
\(i \in \{1, \dots, N\}\) rôzna.
Obyčajný linárny regresný (tzv. “cross-sectional”) model môžeme formulovať ako \[ Y_{i 1} = \boldsymbol{x}_{i 1}^\top \boldsymbol{\beta}_{CS} + \varepsilon_{i 1}, \qquad i = 1, \dots, N, \] pre vektor neznámych parametrov \(\boldsymbol{\beta}_{CS} \in \mathbb{R}^p\). Príslušný odhad \(\widehat{\boldsymbol{\beta}}_{CS}\) lze po jednotlivých zložkách interpretovať ako odhadovaný očakávaný rozdiel (i.e., odhad rozdielu v teoretických stredných hodnotách) medzi dvoma podskupinami, ak je rozdiel príslušného regresoru (jeden konkrétny element v \(\boldsymbol{x}_{i 1}\)) jednotkový a ostatné hodnoty regresorov (zvyšných elementov \(\boldsymbol{x}_{i 1}\)) sú rovnaké.
Na druhej strane, jednoduchý model pre longitudinálne data môžeme zapísať aj v tvare \[ Y_{i j} = \boldsymbol{x}_{i 1}^\top \boldsymbol{\beta}_{CS} + (\boldsymbol{x}_{i j} - \boldsymbol{x}_{i 1})^\top \boldsymbol{\beta}_{L} + \varepsilon_{i j}. \qquad i = 1, \dots, N; j = 1, \dots, n_i, \] kde celkový počet pozorovaní je \(\sum_{i = 1}^N n_{i}\). Model ale okrem odhadu pre vektorový parameter \(\boldsymbol{\beta}_{CS}\) (ktorý má ekvivalentnú interpretáciu ako v prípade obýčajného regresného modelu vyššie) umožňuje odhadnúť aj vektorový parameter \(\boldsymbol{\beta}_L\). Interpretácia tohto parametru je ale už specifická pre daný subjekt a vyjadruje zmenu v rámci daného subjektu \(i \in \{1, \dots, N\}\). Príslušný odhad \(\widehat{\boldsymbol{\beta}}_{L}\) môžeme po jednotlivých zložkách interpretovať ako očakávanú zmenu v rámci daného subjektu v čase, ak sa príslušný regresor zmení v čase o jednotku.
Pre ilustráciu použijeme datový súbor
pig_weights.csv, ktorý udáva váhu u 48
ošípaných, ktoré boli postupne merané po dobu 9 týždňov
(tzv.
follow-up period, teda obdobie, počas ktorého boli subjekty opakovane
sledované, je 9 týždňov) – nejedná sa ale nutné o stejných 9 týždňov. Do
programu SAS data načítame následujúcim príkazom:
libname weight '/home/uXXX/sasuser.v94';
filename reffile '/home/uXXX/sasuser.v94/data/pig_weights.csv';
proc import datafile=reffile
dbms=csv
out=weight.data
replace;
getnames=yes;
run;
proc print data = weight.data;
run;
Samostatne sa podívajte na niektoré základné popisné charakteristiky spočítané z dat. Pre ilustráciu niektorých popisných charakteristík poslúži napr. aj následujúci graf. Pokúste sa ale vytvoriť aj niekoľko ďalších grafov a obrázkov samostatne.
proc sgscatter data=weight.data;
matrix weight week /
ellipse=(type=mean)
diagonal=(histogram kernel);
run;
V nasledujúcej časti sa špecificky zameriame na vizualizáciu datového
súboru vhľadom k jeho časovo-zavislej štruktúre a tzv.
subject-specific longitudinálnych profilov.
Porovnajte následujúce grafické výstupy:
proc sgscatter data=weight.data;
plot weight * week ;
run;
proc sgscatter data=weight.data;
plot weight * week / group = id;
run;
proc sgplot data=weight.data;
series y=weight x=week /group=id;
run;
Podívajte sa na základnú syntax procedrúry
PROC sgscatter napr. na
tejto
stránke a analogicky tiež na syntax procedúry
PROC sgplot napr. na
tejto
stránke.
Jednoduché longitudinálne profily nie vždy dobre poslúžia k tomu, aby
sme získali dôležité informácie o (časovom) vývoji konkrétneho
jednotlivca vzhľadom k celkovej skupine. Špeciálne v prípadoch, keď je
uvažovných subjektov príliš mnoho, je niekedy užitočné zvážiť aj graf s
tzv. štandardizovanými longitudinálnymi profilmi.
Jedna z možnosti, ako štandardizované longitudinálne profily získať v programe SAS, je v niekoľkých krokoch uvedená v následujúcich bodoch:
K vytvoreniu štandardizovaných profilov potrebujeme v prvom rade vhodné popisné charakteristiky spočítané z dat. Konkrétne výberové priemery a smerodatné odchýlky v jednotlivých (časových) meraniach. Vytvorenie popisných charakteristík (agregované data vzhľadom k jednotlivým týždňom follow-up obdobia) získame napr. následujúcim spôsobom:
proc means data=weight.data mean std;
class week;
var weight;
output out=summary mean = MeanValue std = StdValue;
run;
proc print data = summary;
run;
V ďalšom kroku potrebujeme priradiť jednotlivé agregované (empirické) charakteristiky k jednotlivým pozorovaniam (t.j., vhodne prepojiť dva datove súbory). V programe SAS je pre tento krok kľúčové správne usporiadanie jednolivých pozorovaní – v tomto konkrétnom prípade ide o usporiadanie oboch datových súborov podľa premennej, ktorá identifikuje jednotlivé týždne (premenná week):
proc sort data=weight.data; by week; run;
proc sort data=summary; by week; run;
Zlúčenie oboch datových súborov dohromady a opätovné preusporiadanie podľa jednotlivých subjektov (ako v pôvodných datach):
data weight.dataStd;
merge summary weight.data ;
by week;
run;
proc sort data=weight.dataStd; by id; run;
V aktuálnom datovom súbore už v podstate priamočiaro a jednoducho (pomocou lineárnej kombinácie už existujúcich premenných) vytvoríme novú premennú, ktorá bude obsahovať štandardizované profily. Na záver štandardizované profily vykreslíme:
data weight.dataStd;
set weight.dataStd;
weightStd = (weight - MeanValue)/StdValue;
run;
proc print data = weight.dataStd;
run;
proc sgplot data=weight.dataStd;;
series y=weightStd x=week /group=id;
run;
Graf štandardizovaných rezíduí je možné napríklad použíť k nahliadnutiu na rezídua, prípadne na overenie niektorých predpokladov súvisiacich s náhodnými chybami.
ods graphics on;
proc loess data=weight.dataStd;
model weightStd=week;
run;
Užitočné je aj pozrieť sa na jednotlivé longitudinálne profily
prostredníctvom jeddnoduchého lineárneho regresného modelu – napr.
regresnej priamky, teda modelu \(Y_{ij} = a_i
+ b_i X_{ij} + \varepsilon_{ij}\), pre pevné \(i \in \{1, \dots, N\}\) (teda jeden
konkrétny subjekt) a jednotlivé pozorovania pre \(j = 1, \dots, n_i\). Uvažujúc prvý subjekt
v datovom súbore (i.e., id = 1), lineárny regresný model
získame pomocou nasledujúcej časti SAS kódu:
Data pre prvý subkjekt:
data weight_id1;
set weight.dataStd;
if id=1;
run;
proc print data = weight_id1;
run;
Popisné charakteristiky pre prvý subjekt a linárny regresný model:
proc means data = weight_id1 mean std;
var weight weightStd;
run;
proc sgplot data=weight.dataStd(where=(id=1));
scatter x=week y=weight;
reg x=week y=weight;
run;
V tejto časti použijeme o niečo komplexnejší datový súbor o pacientoch so sklerózou multiplex (roztroušená skleróza). Podkladový datový súbor je možné stiahnúť ako csv súbor (následne je potrebné súbor uploadovať do SAS OnDemand a pomocou nasledujúceho SAS kódu načítať).
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;
V zásade rozlišujeme (vysvetľujúce, t.j., nezávislé) premenné dvoch typov: tzv. subject-specific variables a tzv. time-dependent variables. V prvom prípade sa jedná o premenné, ktoré sú v čase nemenné (napr. pohlavie pacienta, vek pacienta v čase podstúpenia liečby, zdravotný stav pacienta v čase podstúpenia liečby, alebo aj napr. výskyt/nevýskyt komplikácii počas sledovania). V tom druhom prípade sa jedná o premenné, ktoré sa v rámci konkrétneho jedinca v priebehu opakovaných meraní môžu meniť (napr. hodnota EDSS, alebo opäť výskyt komplikácii zaznamenaný samostatne pri každej kontrole).
Ide o zisťovanie a vyšetrovanie vzťahov (závislostnej štruktúry) v
tzv. subject-specific premenných – porovnávanie v rámci
nezávislých subjektov (t.j., rôznych podskupín a sub-populácii). V
prípade datového súboru s pacientami so sklerózou multiplex je takouto
premennou napríklad premenná EDSSini (t.j., Expanded
Disability Status Scale na začiatku liečby), alebo pohlavie pacienta
gender, prípadne premenné označené ako “before”
(timeBef – čas liečby [v rokoch] od zistenia nemoci;
numBef – počet absolvovaných typov liečby pred nasadením
liečby pomocou Lemtrady).
proc sort data=sm.data;
by gender;
run;
proc loess data = sm.data(where=(time=0));
model EDSSini = age / clm smooth=0.1 0.5 residual;;
by gender;
run;
Jedná sa o zisťovanie vplyvu/zmeny v rámci opakovaných pozorovaní – korelované pozorovania vrámci daného subjektu. Opäť v prípade datového súboru s pacientami so sklerózou multiplex – napríklad EDSS (a jeho vývoj) v závislosti na čase:
proc sort data=sm.data;
by gender;
run;
proc loess data = sm.data;
model EDSS = time / clm smooth=0.1 0.5 residual;
by gender;
run;
Nemusí sa ale nutne jednať pouze o čas ako takový – t.j., premennú time. Analogicky móžeme zisťovať napr. zmenu v EDSS v závislosti na zmene hodnoty v premennej relapse:
proc sort data=sm.data; by relapse; run;
proc boxplot data=sm.data;
plot EDSS*relapse;
run;
Na záver sa opäť vrátime k datovému súboru o váhach ošípaných, ktorý
sme navyše doplnili o štandardizované profily. Vytvorené štandardizované
longitudinálne profily použijeme k tomu, aby sme nahliadli do
časovo-závislej štruktúry.
proc print datafile = weight.dataStd;
run;
Existuje samozrejme množstvo rôznych spôsobov, ako empiricky
vyšetrovať a zisťovať prípadnú závislosť medzi pozorovaniami.
Predpokládame, že jednotlivé súbjekty sú vzájomne nezávisle (malo by to
vyplývať z povahy samotného experimentu). Opakované pozorovania v rámci
konkretného jedinca ale nezávislé samozrejme nie sú. Pre následné
modelovanie (t.j., “confirmatory analysis”) je ale dôležité závislostnú
štruktúru opakovaných pozorovaní pochopiť a následne správne v modeli
ošetriť.
V prvom kroku vhodne pripravíme data. Pri analýze longitudinálnych
dat sa často používa terminológia, ktorá odkazuje na tzv.
long-data štruktúru dat, prípadne tzv. wide-data typ dat.
Data uložené v datovom súbore weight.dataStd sú reprezentované v
tzv. long-data type. Pomocou PROC transpose ale data
môžeme reprezentovať vo wide-data formáte:
proc sort data=weight.dataStd; by id; run;
proc transpose data=weight.dataStd out=weight.dataWide;
by id;
var weightStd;
run;
Získali sme ekvivalentný datový súbor, ktorý ale reprezentuje informáciu o vývoji váhy v čase v tzv. wide formáte:
proc print data = weight.dataWide;
run;
Wide-data formát už môžeme priamo využiť pre spočítanie (resp. odhadnutie) variančenej kovariačnej (resp. korelačnej) matice
proc corr data=weight.dataWide;
var COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9;
run;
prípadne tzv. matice scatterplotov, ktorá časovo-závislostnú štruktúru reprezentuje vizuálne:
proc sgscatter data=weight.dataWide;
title "Scatterplot Matrix -- Repeated observations";
matrix COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9;
run;
title;
Predchádzajúci výstup lze také porovnať s následujúcim výstupom:
proc sgscatter data=weight.dataWide;
matrix COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9
/ diagonal=(histogram kernel) transparency=0.5;
run;
Alternatívne je možné využiť SAS procedúru
PROC CORR:
proc corr data=weight.dataWide plots=matrix;
var COL1 COL2 COL3 COL4 COL5 COL6 COL7 COL8 COL9;
run;
Pripomeňme, že pre ľubovolnú náhodnú veličinu \(X \sim F\) z nejakého (absolútne) spojitého rozdelenia s distribučnou funkciou \(F\) platí, že \[ P[X \leq x] = F(x), \qquad \forall x \in \mathbb{R}. \] Zároveň ale dostávame, že platí tiež \[ P[F(X) \leq x] = P[X \leq F^{-1}(x)] = F\Big(F^{-1}(x)\Big) = x, \qquad \textrm{pre} \quad x \in [0,1], \] kde \(F^{-1}(u)\) pre \(u \in [0,1]\) je príslučná kvantilová funkcia náhodnej veličiny \(X\) (t.j., inverzná funkcia k distribučnej funkcii \(F\)). Inými slovami, transformovaná náhodná veličina \(F(X)\) má rovnomerné (spojité) rozdelenie na intervale \([0,1]\).