Prace dyplomowe · Regresja

Wysoki VIF – co zrobić ze współliniowością?

Krótka odpowiedź z przykładem w R: kiedy wysoki VIF naprawdę przeszkadza, dlaczego usunięcie predyktora potrafi zafałszować wynik i jak opisać współliniowość w pracy.

Strona główna / Blog / Wysoki VIF – co zrobić
W skrócie: Wysoki VIF sam w sobie nie oznacza błędu w modelu. Najpierw sprawdź, którego predyktora dotyczy: jeśli tylko zmiennych kontrolnych, zostaw je i nie interpretuj osobno. Jeśli predyktora z hipotezy, oceń szerokość jego przedziału ufności. Nie usuwaj zmiennej tylko z powodu VIF: w przykładzie usunięcie skorelowanych nadgodzin zawyżyło efekt obciążenia pracą z 2.07 do 2.99 przy prawdziwej wartości 2.0.

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:

  1. Którego predyktora dotyczy wysoki VIF? Jeśli tylko zmiennych kontrolnych, a nie predyktora z Twojej hipotezy, zwykle nie masz problemu.
  2. 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.

Współczynnik obciążenia pracą i jego VIF w trzech wersjach modelu wypalenia
Modelb obciążenia95% CIVIF 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

Typowe sytuacje z wysokim VIF i zalecane postępowanie
SytuacjaCzy to problem?Co zrobić
Wysoki VIF tylko w zmiennych kontrolnychNieZostaw je; jeśli trzeba, przetestuj je łącznie (test F dla bloku)
Wysoki VIF iloczynu w moderacji albo składnika kwadratowegoNieWycentruj zmienne, żeby łatwiej interpretować efekty niższego rzędu
Wysoki VIF zmiennych 0/1 jednej zmiennej kategorialnejZwykle nieSprawdź GVIF dla całej zmiennej; często wystarczy liczniejsza kategoria odniesienia
Dwa predyktory z hipotez mierzą prawie to samoTak, dla interpretacjiPrzetestuj 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ęciaZostaw obie zmienne i uczciwie opisz szeroki przedział ufności; pomoże większa próba
Model służy wyłącznie predykcjiZwykle nieOceniaj 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:

Współliniowość predyktorów oceniono za pomocą współczynnika VIF. Wysokie wartości dotyczyły zmiennych kontrolnych – wieku i stażu pracy (VIF = 7.94 i 7.95; r = .93) – które łącznie istotnie wyjaśniały wypalenie, F(2, 245) = 7.00, p = .001; ich współczynników nie interpretowano osobno. Obciążenie pracą było skorelowane z liczbą nadgodzin (r = .83; VIF = 3.23). Ponieważ nadgodziny uznano za zmienną zakłócającą, pozostawiono je w modelu. Przy kontroli nadgodzin, wieku i stażu wyższe obciążenie pracą wiązało się z silniejszym wypaleniem, b = 2.07, 95% CI [0.62, 3.52], p = .005.

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.

Przykład reprodukowalny

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

Dane wejściowe: 250 pracowników (dane symulowane, set.seed(2052)): wypalenie zawodowe (0–60), obciążenie pracą (1–5), nadgodziny (godziny tygodniowo), wiek i staż pracy (lata); prawdziwe efekty: obciążenie b = 2.0, nadgodziny b = 0.30.

Co odczytać: macierz korelacji predyktorów, kolumny Estimate, 2.5 % i 97.5 % oraz VIF w trzech modelach, a w tabelach anova() – F i Pr(>F) dla wieku i stażu razem oraz dla obciążenia i nadgodzin razem; na końcu R² i ΔR².

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.176

Bibliografia 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()).

  1. 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/
  2. 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ż

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)

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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}}
R