Najpierw sprawdź, który predyktor ma wysoki VIF
VIF mówi, ile razy wariancja współczynnika danego predyktora jest większa, niż byłaby bez związku z pozostałymi predyktorami. Nie mówi natomiast, czy wynik jest zły. Dlatego zamiast pytać „czy VIF przekracza 5 albo 10”, zadaj dwa inne pytania:
- Którego predyktora dotyczy wysoki VIF? Jeśli tylko zmiennych kontrolnych, a nie predyktora z Twojej hipotezy, zwykle nie masz problemu.
- Czy przedział ufności współczynnika, który interpretujesz, jest za szeroki, żeby odpowiedzieć na pytanie badawcze? Precyzja zależy nie tylko od VIF, ale też od liczebności próby i wariancji reszt.
O’Brien (2007) przestrzega przed mechanicznym stosowaniem progów: VIF równe 10, 20, a nawet 40 samo w sobie nie wymaga usuwania predyktorów ani łączenia ich w indeks. Vanhove (2021) idzie dalej. Uważa, że współliniowość nie jest chorobą, którą trzeba leczyć: popularne „lekarstwa” albo obciążają oszacowania, albo po cichu zmieniają pytanie badawcze. Skąd biorą się progi i jak liczy się VIF, opisujemy w haśle o VIF. Tu zajmiemy się decyzją, co zrobić z wynikiem.
Przykład: wypalenie, obciążenie pracą i nadgodziny
Studentka bada 250 pracowników (dane symulowane). Hipoteza dotyczy związku obciążenia pracą (skala 1–5) z wypaleniem zawodowym (0–60). W modelu są też nadgodziny oraz dwie zmienne kontrolne: wiek i staż pracy. W modelu, z którego wylosowano dane, obciążenie ma efekt b = 2.0, a nadgodziny b = 0.30.
Predyktory tworzą dwie silnie powiązane pary. Obciążenie koreluje z nadgodzinami (r = .83), a wiek ze stażem (r = .93). W modelu z czterema predyktorami VIF wyniósł 3.23 dla obciążenia i nadgodzin oraz 7.94 i 7.95 dla wieku i stażu. Tabela pokazuje, co dzieje się ze współczynnikiem obciążenia, gdy „leczymy” VIF usuwaniem zmiennych.
| Model | b obciążenia | 95% CI | VIF obciążenia |
|---|---|---|---|
| Pełny (obciążenie, nadgodziny, wiek, staż) | 2.07 | [0.62, 3.52] | 3.23 |
| Bez stażu (VIF wieku spada do 1.00) | 2.04 | [0.59, 3.49] | 3.21 |
| Bez nadgodzin (VIF obciążenia spada do 1.00) | 2.99 | [2.18, 3.80] | 1.00 |
Z tabeli wynikają trzy wnioski.
- Wysoki VIF wieku i stażu nie szkodzi obciążeniu. Po usunięciu stażu współczynnik obciążenia i jego przedział ufności prawie się nie zmieniają. Współliniowość zmiennych kontrolnych rozmywa tylko ich własne współczynniki: osobno wiek i staż były nieistotne (p = .439 i p = .565), ale razem istotnie poprawiały model, F(2, 245) = 7.00, p = .001. Nie interpretujesz ich osobno, więc nie musisz nic usuwać.
- Usunięcie nadgodzin daje fałszywą precyzję. VIF obciążenia spada do 1.00, a przedział ufności się zwęża. Współczynnik rośnie jednak do 2.99, choć prawdziwy efekt wynosi 2.0, bo obciążenie „przejmuje” efekt pominiętych nadgodzin. Teraz odpowiada na inne pytanie: o łączny efekt obciążenia i towarzyszących mu nadgodzin.
- Nieistotne nadgodziny nie znaczą, że nadgodziny nie działają. Ich współczynnik wyniósł 0.25, 95% CI [−0.08, 0.58], p = .133, choć prawdziwy efekt to 0.30. Dwa współliniowe predyktory razem wyjaśniały 17.6% wariancji wypalenia ponad wiek i staż, F(2, 245) = 27.67, p < .001. Model wie, że oba predyktory razem mają znaczenie, ale ma mniej informacji, by podzielić efekt między nie.
Wysocki i in. (2022) przypominają, że o tym, co kontrolować, decyduje założona struktura przyczynowa, a nie statystyka dopasowania. Jeśli nadgodziny są zmienną zakłócającą związek obciążenia z wypaleniem, muszą zostać w modelu, nawet kosztem szerszego przedziału. Więcej o doborze zmiennych kontrolnych piszemy we wpisie czy kontrolować wiek i płeć.
Co zrobić w Twojej sytuacji
| Sytuacja | Czy to problem? | Co zrobić |
|---|---|---|
| Wysoki VIF tylko w zmiennych kontrolnych | Nie | Zostaw je; jeśli trzeba, przetestuj je łącznie (test F dla bloku) |
| Wysoki VIF iloczynu w moderacji albo składnika kwadratowego | Nie | Wycentruj zmienne, żeby łatwiej interpretować efekty niższego rzędu |
| Wysoki VIF zmiennych 0/1 jednej zmiennej kategorialnej | Zwykle nie | Sprawdź GVIF dla całej zmiennej; często wystarczy liczniejsza kategoria odniesienia |
| Dwa predyktory z hipotez mierzą prawie to samo | Tak, dla interpretacji | Przetestuj je łącznie albo połącz w jeden wskaźnik, jeśli teoria uznaje je za jeden konstrukt |
| Predyktor z hipotezy jest silnie skorelowany ze zmienną zakłócającą | Tak, ale nie do usunięcia | Zostaw obie zmienne i uczciwie opisz szeroki przedział ufności; pomoże większa próba |
| Model służy wyłącznie predykcji | Zwykle nie | Oceniaj trafność przewidywań; ewentualnie regresja grzbietowa |
Dwie uwagi do tabeli. Dalal i Zickar (2012) pokazują, że centrowanie usuwa tylko współliniowość „techniczną”: nie zmienia testu interakcji ani dopasowania modelu, a jedynie ułatwia interpretację. Dormann i in. (2013) zauważają z kolei, że przewidywania pogarszają się, gdy w nowych danych struktura korelacji predyktorów jest inna niż w próbie, na której oszacowano model.
Czego nie robić
- Nie usuwaj predyktora tylko dlatego, że jego VIF przekroczył 5 lub 10. Przykład z nadgodzinami pokazuje, że zmienia to pytanie badawcze i może obciążyć wynik.
- Nie wybieraj zmiennych metodą krokową. Przy współliniowych predyktorach jej wybór jest niestabilny i zależy od przypadkowych różnic w danych.
- Nie interpretuj znaku ani istotności pojedynczego współczynnika z bardzo szerokim przedziałem. Kim (2019) zwraca uwagę, że współliniowość może prowadzić do mylących wniosków o istotności poszczególnych predyktorów.
- Nie zamieniaj współczynników na β w nadziei, że problem zniknie. Standaryzacja nie zmienia VIF. Różnice między b i β omawiamy we wpisie współczynniki standaryzowane czy niestandaryzowane.
Cały model, od macierzy korelacji po raport, pokazujemy w poradniku regresja wieloraka krok po kroku, a pozostałe testy założeń – we wpisie diagnostyka regresji w R. Jak ułożyć ze sobą bloki zmiennych i test ich przyrostu R², opisujemy w poradniku o regresji hierarchicznej.
Jak to opisać w pracy
Napisz, jak oceniono współliniowość, których predyktorów dotyczyła i jaką decyzję podjęto. Wzór dla przykładu:
Jeśli promotor lub recenzent prosi o usunięcie zmiennej z wysokim VIF, pokaż mu porównanie modeli takie jak w tabeli powyżej. Przy takich rozmowach pomagamy też w ramach konsultacji statystycznych dla studentów. Kolejne kroki analizy w pracy dyplomowej porządkuje przewodnik statystyka w pracy dyplomowej.
Wysoki VIF w R: trzy wersje modelu
Kod odtwarza wszystkie liczby z tekstu: korelacje predyktorów, model pełny z VIF (car::vif()), modele bez stażu i bez nadgodzin oraz testy łączne bloków zmiennych (anova() dla modeli zagnieżdżonych).
VIF, usuwanie predyktorów i testy łączne
R
# B189 – wysoki VIF: kiedy jest problemem, a kiedy nie
# Dane symulowane: 250 pracowników; wypalenie zawodowe (0–60), obciążenie pracą (1–5),
# nadgodziny (godziny tygodniowo), wiek i staż pracy (lata).
# W modelu, z którego losujemy dane, obciążenie ma efekt b = 2.0, a nadgodziny b = 0.30.
suppressPackageStartupMessages(library(car))
set.seed(2052)
n <- 250
wiek <- round(pmin(65, pmax(23, rnorm(n, 42, 10))))
staz <- pmax(0, round(wiek - runif(n, 19, 31)))
obciazenie <- round(pmin(5, pmax(1, rnorm(n, 3.2, 0.8))), 1)
nadgodziny <- round(pmax(0, 6 + 4 * (obciazenie - 3.2) + rnorm(n, 0, 1.8)))
wypalenie <- 14 + 2.0 * obciazenie + 0.30 * nadgodziny + 0.10 * wiek - 0.05 * staz + rnorm(n, 0, 5)
dane <- data.frame(wypalenie = round(pmin(60, pmax(0, wypalenie))), obciazenie, nadgodziny, wiek, staz)
# 1. Korelacje predyktorów
round(cor(dane[, c("obciazenie", "nadgodziny", "wiek", "staz")]), 2)
# 2. Model pełny i VIF
m_pelny <- lm(wypalenie ~ obciazenie + nadgodziny + wiek + staz, data = dane)
round(cbind(summary(m_pelny)$coefficients, confint(m_pelny)), 3)
round(vif(m_pelny), 2)
# 3. Wysoki VIF tylko w zmiennych kontrolnych: usuwamy staż – co się dzieje z obciążeniem?
m_bez_stazu <- lm(wypalenie ~ obciazenie + nadgodziny + wiek, data = dane)
round(cbind(summary(m_bez_stazu)$coefficients, confint(m_bez_stazu))["obciazenie", ], 3)
round(vif(m_bez_stazu), 2)
# łączny test wieku i stażu (oba razem, mimo wysokiego VIF)
anova(lm(wypalenie ~ obciazenie + nadgodziny, data = dane), m_pelny)
# 4. „Leczenie” VIF przez usunięcie nadgodzin – zmienia pytanie i obciąża wynik
m_bez_nadgodzin <- lm(wypalenie ~ obciazenie + wiek + staz, data = dane)
round(cbind(summary(m_bez_nadgodzin)$coefficients, confint(m_bez_nadgodzin))["obciazenie", ], 3)
round(vif(m_bez_nadgodzin), 2)
# 5. Łączny wpływ obciążenia i nadgodzin – test bloku dwóch współliniowych predyktorów
anova(lm(wypalenie ~ wiek + staz, data = dane), m_pelny)
r2_pelny <- summary(m_pelny)$r.squared
r2_kontrole <- summary(lm(wypalenie ~ wiek + staz, data = dane))$r.squared
round(c(R2_pelny = r2_pelny, R2_same_kontrole = r2_kontrole, delta_R2 = r2_pelny - r2_kontrole), 3)Wynik w R
obciazenie nadgodziny wiek staz
obciazenie 1.00 0.83 -0.02 -0.03
nadgodziny 0.83 1.00 0.00 0.01
wiek -0.02 0.00 1.00 0.93
staz -0.03 0.01 0.93 1.00
Estimate Std. Error t value Pr(>|t|) 2.5 % 97.5 %
(Intercept) 13.345 2.959 4.510 0.000 7.517 19.173
obciazenie 2.067 0.738 2.803 0.005 0.615 3.520
nadgodziny 0.253 0.168 1.508 0.133 -0.077 0.583
wiek 0.072 0.092 0.775 0.439 -0.110 0.254
staz 0.051 0.089 0.576 0.565 -0.123 0.226
obciazenie nadgodziny wiek staz
3.23 3.23 7.94 7.95
Estimate Std. Error t value Pr(>|t|) 2.5 % 97.5 %
2.038 0.735 2.774 0.006 0.591 3.486
obciazenie nadgodziny wiek
3.21 3.21 1.00
Analysis of Variance Table
Model 1: wypalenie ~ obciazenie + nadgodziny
Model 2: wypalenie ~ obciazenie + nadgodziny + wiek + staz
Res.Df RSS Df Sum of Sq F Pr(>F)
1 247 5661.7
2 245 5355.8 2 305.9 6.9966 0.001109 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Estimate Std. Error t value Pr(>|t|) 2.5 % 97.5 %
2.991 0.412 7.265 0.000 2.180 3.802
obciazenie wiek staz
1.00 7.91 7.92
Analysis of Variance Table
Model 1: wypalenie ~ wiek + staz
Model 2: wypalenie ~ obciazenie + nadgodziny + wiek + staz
Res.Df RSS Df Sum of Sq F Pr(>F)
1 247 6565.4
2 245 5355.8 2 1209.6 27.666 1.467e-11 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
R2_pelny R2_same_kontrole delta_R2
0.219 0.042 0.176Bibliografia oprogramowania
Wyniki na tej stronie pochodzą z uruchomienia pokazanego kodu w R 4.5.3 (funkcje lm() i anova() z pakietu stats oraz vif() z pakietu car). W pracy podaj wersje faktycznie użytych pakietów (sessionInfo()).
- R: R Core Team. (2026). R: A language and environment for statistical computing (Version 4.5.3) [Computer software]. R Foundation for Statistical Computing. https://www.R-project.org/
- car (wersja 3.1.5): Fox, J., & Weisberg, S. (2019). An R companion to applied regression (3rd ed.). Sage. https://www.john-fox.ca/Companion/
Najczęstsze pytania
Czy mogę usunąć zmienną z modelu, bo ma wysoki VIF?
Tylko wtedy, gdy i bez tego nie powinna być w modelu. Jeśli to zmienna zakłócająca, jej usunięcie zmienia pytanie badawcze i może obciążyć wynik. W przykładzie z tego wpisu po usunięciu nadgodzin VIF obciążenia spadł do 1.00, ale jego współczynnik wzrósł z 2.07 do 2.99, choć prawdziwy efekt wynosił 2.0.
Czy wysoki VIF zmiennych kontrolnych przeszkadza w interpretacji głównego predyktora?
Zwykle nie. Współliniowość między zmiennymi kontrolnymi, np. wiekiem i stażem pracy, zwiększa błędy standardowe tylko ich współczynników. W przykładzie usunięcie stażu prawie nie zmieniło wyniku dla obciążenia pracą (b = 2.07 wobec 2.04). Zmienne kontrolne testuj łącznie, a ich pojedynczych współczynników nie interpretuj.
Czy wysoki VIF oznacza, że model regresji jest zły?
Nie. Współliniowość nie zmienia R² ani testu F modelu i nie obciąża współczynników, tylko zmniejsza ich precyzję. Model jest problematyczny dopiero wtedy, gdy przedział ufności współczynnika z hipotezy jest tak szeroki, że nie pozwala odpowiedzieć na pytanie badawcze.
Powiązane hasła
Przeczytaj też
Regresja wieloraka krok po kroku
Model i hipotezy, przygotowanie danych, założenia i diagnostyka, ΔR², interpretacja b, β i sr², kod R, SPSS i opis APA – na jednym przykładzie.
Czytaj →PoradnikDiagnostyka regresji w R
Reszty studentyzowane, dźwignia, Cook i DFBETAS, VIF, maskowanie heteroskedastyczności, HC3 i analiza wrażliwości – z danymi i kodem R.
Czytaj →PoradnikCzy kontrolować wiek i płeć?
Kiedy wiek i płeć usuwają zakłócenie, kiedy tylko zwiększają precyzję, a kiedy szkodzą – z przykładem czterech modeli w R i wzorem opisu.
Czytaj →Promotor każe usunąć zmienną z wysokim VIF?
Sprawdzimy model, porównamy jego wersje i pomożemy Ci zrozumieć oraz uzasadnić, które zmienne powinny w nim zostać.
Oferta dla studentówWyceń analizęBibliografia i dalsza literatura naukowa (APA 7)
- Dalal, D. K., & Zickar, M. J. (2012). Some common myths about centering predictor variables in moderated multiple regression and polynomial regression. Organizational Research Methods, 15(3), 339–362. https://doi.org/10.1177/1094428111430540
- Dormann, C. F., Elith, J., Bacher, S., Buchmann, C., Carl, G., Carré, G., Marquéz, J. R. G., Gruber, B., Lafourcade, B., Leitão, P. J., Münkemüller, T., McClean, C., Osborne, P. E., Reineking, B., Schröder, B., Skidmore, A. K., Zurell, D., & Lautenbach, S. (2013). Collinearity: A review of methods to deal with it and a simulation study evaluating their performance. Ecography, 36(1), 27–46. https://doi.org/10.1111/j.1600-0587.2012.07348.x ● Otwarty dostęp
- Kim, J. H. (2019). Multicollinearity and misleading statistical results. Korean Journal of Anesthesiology, 72(6), 558–569. https://doi.org/10.4097/kja.19087 ● Otwarty dostęp
- O’Brien, R. M. (2007). A caution regarding rules of thumb for variance inflation factors. Quality & Quantity, 41(5), 673–690. https://doi.org/10.1007/s11135-006-9018-6
- Vanhove, J. (2021). Collinearity isn’t a disease that needs curing. Meta-Psychology, 5. https://doi.org/10.15626/mp.2021.2548 ● Otwarty dostęp
- Wysocki, A. C., Lawson, K. M., & Rhemtulla, M. (2022). Statistical control requires causal justification. Advances in Methods and Practices in Psychological Science, 5(2), Article 25152459221095823. https://doi.org/10.1177/25152459221095823 ● Otwarty dostęp
Cytowania BibTeX
@article{dalal2012some, author={Dalal, Dev K. and Zickar, Michael J.}, title={{Some common myths about centering predictor variables in moderated multiple regression and polynomial regression}}, journal={Organizational Research Methods}, year={2012}, volume={15}, number={3}, pages={339--362}, doi={10.1177/1094428111430540}}@article{dormann2013collinearity, author={Dormann, Carsten F. and Elith, Jane and Bacher, Sven and Buchmann, Carsten and Carl, Gudrun and Carré, Gabriel and Marquéz, Jaime R. García and Gruber, Bernd and Lafourcade, Bruno and Leitão, Pedro J. and Münkemüller, Tamara and McClean, Colin and Osborne, Patrick E. and Reineking, Björn and Schröder, Boris and Skidmore, Andrew K. and Zurell, Damaris and Lautenbach, Sven}, title={{Collinearity: A review of methods to deal with it and a simulation study evaluating their performance}}, journal={Ecography}, year={2013}, volume={36}, number={1}, pages={27--46}, doi={10.1111/j.1600-0587.2012.07348.x}}@article{kim2019multicollinearity, author={Kim, Jong Hae}, title={{Multicollinearity and misleading statistical results}}, journal={Korean Journal of Anesthesiology}, year={2019}, volume={72}, number={6}, pages={558--569}, doi={10.4097/kja.19087}}@article{obrien2007caution, author={O’Brien, Robert M.}, title={{A caution regarding rules of thumb for variance inflation factors}}, journal={Quality \& Quantity}, year={2007}, volume={41}, number={5}, pages={673--690}, doi={10.1007/s11135-006-9018-6}}@article{vanhove2021collinearity, author={Vanhove, Jan}, title={{Collinearity isn’t a disease that needs curing}}, journal={Meta-Psychology}, year={2021}, volume={5}, doi={10.15626/mp.2021.2548}}@article{wysocki2022statistical, author={Wysocki, Anna C. and Lawson, Katherine M. and Rhemtulla, Mijke}, title={{Statistical control requires causal justification}}, journal={Advances in Methods and Practices in Psychological Science}, year={2022}, volume={5}, number={2}, eid={25152459221095823}, doi={10.1177/25152459221095823}}