V tomto dokumente analyzujem multikolinearitu v regresnom modeli, ktorý vysvetľuje počet zranených pri dopravnej nehode pomocou vybraných charakteristík nehody (počet vozidiel, hodina, deň v týždni a mesiac). Cieľom je prakticky ukázať, ako multikolinearitu diagnostikovať (korelácie, VIF, condition number) a čo s ňou robiť, ak by bola problémom.
Po autokorelácii a heteroskedasticite rezíduí je multikolinearita tretím závažným porušením predpokladov použitia metódy najmenších štvorcov. Pri OLS sa okrem iného predpokladá, že matica \(\mathbf{X}\) je tvorená lineárne nezávislými stĺpcami, čo zabezpečí regularitu matice \(\mathbf{X}^T\mathbf{X}\) a teda možnosť jej inverzie. Tá sa používa pri odhadoch regresných koeficientov.
V praxi sa však môže stať, že vzniká „takmer singulárna“ matica \(\mathbf{X}^T\mathbf{X}\), t. j. vysvetľujúce premenné sú navzájom veľmi podobné a existuje ich taká lineárna kombinácia, kde zvyšok \(\nu_i\) je veľmi malý.
\[ x_{il} = \alpha_0 + \alpha_1 x_{i1} + \dots + \alpha_{l-1} x_{i,(l-1)} + \alpha_{l+1} x_{i,(l+1)} + \alpha_k x_{i,k} + \nu_i \]
V takom prípade je inverzná matica \((\mathbf{X}^T\mathbf{X})^{-1}\) numericky nestabilná a na diagonále môže obsahovať veľké hodnoty. To sa následne premieta do:
Tento problém nazývame multikolinearita.
Multikolinearita patrí medzi najčastejšie problémy viacnásobnej lineárnej regresie. Dôležité je rozlišovať, čo multikolinearita robí a čo nerobí:
V dátach o dopravných nehodách sa multikolinearita môže objaviť napríklad vtedy, ak sú časové premenné (hodina, deň, mesiac) prepojené cez spoločné vzorce správania (špičky, víkendy, sezónnosť) alebo ak niektoré premenné nepriamo kopírujú iné (napr. počet vozidiel súvisí s typom nehody, ktorý sa viaže na konkrétny čas).
Preto je vhodné tieto vzťahy preveriť, aj keď sa na prvý pohľad nezdajú problémové.
Budeme pracovať s regresným modelom z predchádzajúcich cvičení, ktorého cieľom je vysvetliť počet zranených pri dopravnej nehode na základe vybraných charakteristík.
Východiskový regresný model má tvar:
\[ injuries\_total_i = \beta_0 + \beta_1 num\_units_i + \beta_2 crash\_hour_i + \beta_3 crash\_day\_of\_week_i + \beta_4 crash\_month_i + u_i \]
kde:
Použité údaje pochádzajú z databázy dopravných nehôd (premávka). Najprv načítam dáta, vyberiem relevantné premenné a chýbajúce hodnoty nahradím mediánom (jednoduchá a stabilná imputácia, vhodná pri veľkých dátach).
| injuries_total | num_units | crash_hour | crash_month | crash_day_of_week |
|---|---|---|---|---|
| 0 | 2 | 13 | 7 | 7 |
| 0 | 2 | 0 | 8 | 1 |
| 0 | 3 | 10 | 12 | 5 |
| 5 | 2 | 19 | 8 | 4 |
| 0 | 2 | 14 | 8 | 7 |
| 2 | 1 | 0 | 9 | 4 |
| 0 | 2 | 11 | 12 | 3 |
| 1 | 2 | 14 | 9 | 4 |
Tabuľka vyššie ukazuje prvé riadky dát po výbere premenných a po imputácii chýbajúcich hodnôt mediánom. Týmto krokom som si zabezpečila, že regresný model bude možné odhadnúť bez toho, aby mi chýbajúce pozorovania zbytočne znižovali počet dát alebo spôsobovali chyby pri výpočtoch. Zároveň platí, že medián je voči extrémnym hodnotám stabilnejší než priemer, takže pri dátach o nehodách ide o rozumnú „bezpečnú“ voľbu.
V tomto kroku odhadujem základný lineárny regresný model, kde vysvetľovanou premennou je celkový počet zranení pri nehode. Medzi vysvetľujúce premenné zaraďujem počet vozidiel a časové premenné (hodina, deň v týždni, mesiac).
Najprv si urobím „projektový“ výstup: tabuľku koeficientov a krátky prehľad kvality modelu.
| R² | Adj. R² | AIC | BIC | Počet pozorovaní |
|---|---|---|---|---|
| 0.0263 | 0.0262 | 494869.2 | 494930.7 | 209306 |
| term | estimate | std.error | statistic | p.value | conf.low | conf.high |
|---|---|---|---|---|---|---|
| (Intercept) | -0.2478 | 0.0111 | -22.4030 | 0 | -0.2695 | -0.2262 |
| num_units | 0.3234 | 0.0044 | 74.2270 | 0 | 0.3148 | 0.3319 |
| crash_hour | -0.0024 | 0.0003 | -7.9164 | 0 | -0.0030 | -0.0018 |
| crash_month | 0.0030 | 0.0005 | 6.0130 | 0 | 0.0020 | 0.0040 |
| crash_day_of_week | -0.0059 | 0.0009 | -6.7182 | 0 | -0.0076 | -0.0042 |
V prvej tabuľke sú súhrnné metriky kvality modelu. Najdôležitejšie sú hodnoty R² a Adj. R², ktoré hovoria, koľko variability v počte zranení model vysvetľuje (pri nehodách býva prirodzene veľa faktorov mimo modelu). AIC a BIC využívam hlavne na porovnanie alternatívnych špecifikácií – nižšia hodnota znamená „lepšiu“ rovnováhu medzi kvalitou prispôsobenia a zložitosťou modelu.
Druhá tabuľka obsahuje odhady koeficientov a 95 % intervaly spoľahlivosti. Zameriavam sa na znamienko (či premenná zvyšuje/znižuje očakávaný počet zranení) a na šírku intervalu (čím je užší, tým je odhad stabilnejší). Graf koeficientov nižšie tieto výsledky vizualizuje, takže sa dajú rýchlo porovnať medzi sebou.
Na základe odhadnutého modelu vidím, že najsilnejší priamy vplyv má premenná počet vozidiel v nehode (\(num\_units\)). V praxi to dáva zmysel: viac zúčastnených vozidiel znamená väčšiu pravdepodobnosť zranení a zároveň aj viac osôb, ktoré sa môžu zraniť.
Časové premenné (hodina nehody, deň v týždni a mesiac) majú zväčša menšie koeficienty, no stále môžu zachytávať systematické rozdiely v riziku nehôd (napr. dopravné špičky, sezónne obdobia alebo rozdiely medzi pracovnými dňami a víkendom). Hodnota \(R^2\) býva pri dátach o dopravných nehodách často skôr nižšia, pretože nehody ovplyvňuje veľa faktorov, ktoré v modeli nemám (počasie, typ cesty, alkohol, rýchlosť, typ vozidla a pod.). Aj „jednoduchý“ model však vie poskytnúť užitočné smerovanie a základnú kvantifikáciu vplyvov.
V grafe koeficientov vidím odhad každého regresora spolu s intervalom spoľahlivosti. Ak interval nepretína nulu, efekt je v dátach konzistentný (premenná má jasný smer vplyvu). Pri širších intervaloch je naopak vhodné byť opatrnejšia pri interpretácii, pretože odhad je citlivejší na špecifikáciu alebo vzorku.
Korelácia zachytáva párové lineárne vzťahy medzi vysvetľujúcimi premennými. Ak by sme videli veľmi vysoké korelácie (napr. \(|r| > 0.8\) až \(0.9\)), bol by to prvý varovný signál multikolinearity.
| Premenná | num_units | crash_hour | crash_month | crash_day_of_week |
|---|---|---|---|---|
| num_units | 1.000 | 0.016 | 0.003 | 0.003 |
| crash_hour | 0.016 | 1.000 | 0.003 | 0.062 |
| crash_month | 0.003 | 0.003 | 1.000 | -0.006 |
| crash_day_of_week | 0.003 | 0.062 | -0.006 | 1.000 |
Korelačná tabuľka a heatmap slúžia ako prvý „screening“ multikolinearity. Ak by sa niektoré dvojice premenných pohybovali veľmi blízko k ±1, znamenalo by to, že jedna premenná je takmer lineárnou kombináciou druhej. Tu však vidím skôr nízke až stredné korelácie, takže už na párovej úrovni nevyzerá model rizikovo. Heatmap je užitočný hlavne preto, že okamžite ukáže, či sa niekde netvoria „bloky“ vysoko korelovaných premenných.
Z tabuľky vidím, že korelácie medzi premennými sú nízke až stredné a výrazne pod prahmi, ktoré by typicky signalizovali problém. To je dobré znamenie: už na tejto úrovni nič nenasvedčuje tomu, že by premenné boli „takmer duplikáty“.
Scatterplotová matica dopĺňa korelácie o vizuálny pohľad. Hľadám najmä veľmi úzke, takmer priamkové vzťahy – tie by boli typické pre silnú multikolinearitu. Keďže takéto vzorce nepozorujem, výsledok je konzistentný s predchádzajúcou korelačnou analýzou.
Scatterplotová matica dopĺňa korelačnú tabuľku. Keby bola multikolinearita silná, očakávala by som veľmi úzke „elipsy“ alebo takmer priamkové vzťahy v niektorých pároch premenných. V grafoch však nevidím výrazné lineárne väzby, čo je konzistentné s nízkymi koreláciami.
Indikátorom multikolinearity je VIF. Pre premennú \(x_j\) platí:
\[ VIF_j = \frac{1}{1 - R_j^2} \]
kde \(R_j^2\) pochádza z regresie \(x_j\) na všetky ostatné vysvetľujúce premenné.
Praktické pravidlá:
| Premenná | VIF |
|---|---|
| crash_hour | 1.004 |
| crash_day_of_week | 1.004 |
| num_units | 1.000 |
| crash_month | 1.000 |
VIF hovorí, koľkokrát sa „nafúkne“ rozptyl odhadu koeficientu kvôli prepojeniu s ostatnými regresormi. Preto je dobré sledovať, či niektorá premenná výrazne nevyčnieva. Do grafu som pridala referenčné čiary pre hranice 5 (prísnejšie pravidlo) a 10 (voľnejšie pravidlo). Ak sú hodnoty pod týmito hranicami, multikolinearita obvykle nie je hlavný dôvod nestability koeficientov.
V mojom modeli hodnoty VIF neprekračujú kritické hranice. To znamená, že štandardné chyby koeficientov nie sú „umelo nafúknuté“ kvôli silnej podobnosti regresorov.
Condition number (index podmienenosti) zachytáva aj situácie, keď VIF nič výrazné neukáže, ale premenné sú navzájom prepojené „cyklickými“ lineárnymi vzťahmi.
Použijem vzťah:
\[ \kappa = \sqrt{\frac{\theta_{max}}{\theta_{min}}} \]
kde \(\theta\) sú vlastné čísla matice \(\mathbf{X}^T\mathbf{X}\) (bez interceptu).
Pravidlo interpretácie:
| Condition.number..κ. |
|---|
| 25.096 |
| Vlastné.číslo..θ. |
|---|
| 56961748.41 |
| 3304109.29 |
| 1033686.96 |
| 90441.34 |
Condition number dopĺňa VIF, pretože zachytí aj „kombinované“ lineárne závislosti medzi viacerými premennými naraz. Preto ho beriem ako druhú kontrolu: aj keď sú VIF hodnoty nízke, veľmi vysoké κ by znamenalo problém. Ak sa κ pohybuje približne v pásme 10–30, ide o miernu multikolinearitu – výsledky sú zvyčajne interpretovateľné, len je dobré vnímať citlivosť koeficientov na zmeny dát alebo špecifikácie.
Ak je hodnota \(\kappa\) približne v pásme 10–30, ide o miernu multikolinearitu. To väčšinou neznamená, že model je „zlý“, ale je dobré vnímať, že pri interpretácii jednotlivých koeficientov môže byť vyššia citlivosť na zmeny v dátach.
Aj keď diagnostika neukazuje závažný problém, v tejto časti ukážem typické postupy, ktoré sa v praxi používajú. Beriem to ako „návod“, čo by som urobila, keby boli indikátory výrazne vyššie.
Najjednoduchší zásah je vynechať premennú, ktorá spôsobuje problém. Často sa vynechá premenná s najvyšším VIF (alebo tá, ktorá je najmenej dôležitá z pohľadu interpretácie).
Porovnám 2 alternatívne modely: bez num_units a bez crash_hour.
| Model | R² | Adj. R² | AIC | BIC |
|---|---|---|---|---|
| Základný | 0.0263 | 0.0262 | 494869.2 | 494930.7 |
| Bez num_units | 0.0006 | 0.0006 | 500305.7 | 500357.0 |
| Bez crash_hour | 0.0260 | 0.0260 | 494929.9 | 494981.1 |
Zmyslom tohto porovnania je prakticky overiť stabilitu modelu. Ak by bola multikolinearita výrazná, po vynechaní jednej premennej by sa koeficienty ostatných často výrazne zmenili (alebo by sa zásadne zmenila kvalita modelu). Ak sa metriky menia len mierne, je to signál, že základná štruktúra vzťahov je robustná.
Štandardizácia premenných (z-skóre) môže zlepšiť numerickú stabilitu výpočtov. Použijem:
\[ x^{scale} = \frac{x - M}{\sqrt{D}} \]
kde \(M\) je priemer a \(D\) rozptyl.
| R² | Adj. R² | AIC | BIC |
|---|---|---|---|
| 0.0263 | 0.0262 | 494869.2 | 494930.7 |
| Premenná | VIF |
|---|---|
| crash_hour_c | 1.004 |
| crash_day_week_c | 1.004 |
| num_units_c | 1.000 |
| crash_month_c | 1.000 |
| Condition.number..κ. |
|---|
| 1.067 |
Centrovanie a štandardizácia mení jednotky premenných, takže koeficienty sa interpretujú v „štandardných odchýlkach“. V tomto dokumente to používam najmä ako diagnostický krok – či sa niečo zásadné nezmení po zlepšení numerickej stability. Ak sa VIF a condition number po štandardizácii nezhoršujú (alebo sa dokonca zlepšia), je to ďalší argument, že multikolinearita nie je kritická.
Ak chcem zachovať interpretáciu a zároveň dostať koeficienty do podobných rádov, môžem upraviť jednotky (napr. „v desiatkach“).
| term | estimate | std.error | statistic | p.value | conf.low | conf.high |
|---|---|---|---|---|---|---|
| (Intercept) | -0.2478 | 0.0111 | -22.4030 | 0 | -0.2695 | -0.2262 |
| num_units10 | 3.2336 | 0.0436 | 74.2270 | 0 | 3.1482 | 3.3190 |
| crash_hour | -0.0024 | 0.0003 | -7.9164 | 0 | -0.0030 | -0.0018 |
| crash_month | 0.0030 | 0.0005 | 6.0130 | 0 | 0.0020 | 0.0040 |
| crash_day_of_week | -0.0059 | 0.0009 | -6.7182 | 0 | -0.0076 | -0.0042 |
| Premenná | VIF |
|---|---|
| crash_hour | 1.004 |
| crash_day_of_week | 1.004 |
| num_units10 | 1.000 |
| crash_month | 1.000 |
| Condition.number..κ. |
|---|
| 245.38 |
Úprava mierky (napr. „v desiatkach“) je praktická vtedy, keď chcem
zachovať interpretáciu a zároveň mať koeficienty v porovnateľných
rádoch. V tomto prípade koeficient pri num_units10 hovorí,
o koľko sa zmení očakávaný počet zranení pri zvýšení počtu vozidiel o
10 (nie o 1). Takáto interpretácia býva často
intuitívnejšia.
PCA vytvára nové premenné (komponenty), ktoré sú navzájom nekorelované. V praxi to pomáha v prípadoch, keď je multikolinearita silná a nechcem „vyhodiť“ premenné, ale skôr ich skombinovať do menej dimenzií.
| Komponent | Podiel.vysvetlenej.variability |
|---|---|
| PC1 | 0.2662 |
| PC2 | 0.2510 |
| PC3 | 0.2488 |
| PC4 | 0.2339 |
| Premenná | PC1 | PC2 | PC3 | PC4 |
|---|---|---|---|---|
| num_units | 0.1967 | -0.6036 | 0.7602 | 0.1377 |
| crash_hour | 0.7023 | -0.0382 | -0.0843 | -0.7058 |
| crash_month | -0.0196 | -0.7732 | -0.6264 | 0.0972 |
| crash_day_of_week | 0.6839 | 0.1907 | -0.1501 | 0.6881 |
| R² | Adj. R² | AIC | BIC |
|---|---|---|---|
| 0.012 | 0.012 | 497912.1 | 497953.1 |
Tabuľka „podiel vysvetlenej variability“ ukazuje, koľko informácie (variability) zachytí každá hlavná komponenta. Loadings tabuľka zas hovorí, ktoré pôvodné premenné tvoria danú komponentu najviac (vyššia absolútna hodnota = väčší vplyv). Scree plot je rýchly vizuálny nástroj: ak prvé 1–2 komponenty vysvetlia veľkú časť variability, dá sa rozumne znížiť dimenzia bez veľkej straty informácie. Model s PC1 a PC2 tu beriem ako ukážku – v praxi by sa PCA používalo najmä vtedy, ak by multikolinearita bola silná.
Zo scree plotu sa dá odčítať, či je prvá komponenta dominantná alebo či je potrebné ponechať viac komponentov. V prípade, že krivka prudko klesá na začiatku, znamená to, že prvé komponenty nesú najviac informácie.
Ridge regresia stabilizuje odhady tak, že do \(\mathbf{X}^T\mathbf{X}\) pridá penalizáciu \(\lambda\mathbf{I}\). Koeficienty sú potom „stiahnuté“ smerom k nule, čo znižuje varianciu (za cenu malého biasu).
| Premenná | lambda=0 | lambda=5 | lambda=10 |
|---|---|---|---|
| -0.2478 | -0.2478 | -0.2478 | |
| num_units | 0.3234 | 0.3234 | 0.3233 |
| crash_hour | -0.0024 | -0.0024 | -0.0024 |
| crash_month | 0.0030 | 0.0030 | 0.0030 |
| crash_day_of_week | -0.0059 | -0.0059 | -0.0059 |
V ridge regresii sledujem, ako sa koeficienty menia pri rastúcej penalizácii λ. Pri λ = 0 je ridge veľmi blízko klasickej regresii, s vyšším λ sa koeficienty „sťahujú“ smerom k nule. Ridge path graf pomáha vidieť, ktoré koeficienty sa stabilizujú rýchlo a ktoré sú citlivejšie. V tomto reporte to uvádzam ako doplnok – dôležité je, že tento prístup vie v prípade silnej multikolinearity priniesť stabilnejšie odhady.
V tejto úlohe som analyzovala multikolinearitu v regresnom modeli, ktorý vysvetľuje počet zranení pri dopravných nehodách pomocou premenných počet vozidiel, hodina, deň v týždni a mesiac.
Korelácie medzi vysvetľujúcimi premennými sú bez extrémnych hodnôt, ktoré by naznačovali silnú lineárnu závislosť. VIF je pod bežnými kritickými hranicami, čo znamená, že štandardné chyby koeficientov nie sú nafúknuté v dôsledku multikolinearity. Condition number sa pohybuje v pásme miernej multikolinearity, ktorá však nepredstavuje vážny problém pre interpretáciu.
Skúsila som aj typické postupy riešenia (vynechanie premennej, centrovanie/štandardizácia, úprava mierok). Výsledky modelov ostali stabilné a potvrdili, že multikolinearita v tomto konkrétnom modeli nie je dominantným problémom. Záverom teda je, že zvolená špecifikácia modelu je použiteľná a interpretovateľná – multikolinearita neohrozuje hlavné výsledky.