(Statistică) Coliniaritate în regresie | R-bloggeri

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

Blogul lui Zhenguo Zhang https://fortune9.netlify.app/2026/10/16/statistics-collinearity-in-regression/ –

library(knitr)
library(ggplot2)
library(dplyr)
library(tidyr)
library(broom)

Problemă

Când efectuați o analiză de regresie, puteți întâlni doi sau mai mulți predictori care sunt foarte corelați. Aceasta se numește coliniaritate sau multicoliniaritate. Poate cauza probleme în estimarea coeficienților de regresie și interpretarea rezultatelor.

În această postare, voi arăta modul în care coliniaritatea poate afecta analiza regresiei, cum să detectăm coliniaritatea și cum să o faceți.

Exemplu: un predictor este o funcție liniară a altui predictor

Să simulăm datele cu următoarele variabile:

  • X1: o variabilă aleatorie extrasă dintr-o distribuție normală cu medie 0 și abatere standard 1.
  • X2: o altă variabilă aleatoare extrasă dintr-o distribuție normală cu media 0 și abaterea standard 1, independent de X1.
  • Z: o variabilă legată liniar de X2definit ca Z = 5*X2 + noiseunde zgomotul este extras dintr-o distribuție normală cu medie 0 și abatere standard 1.
  • Y: o combinație liniară a X1 şi X2 plus zgomot, definit ca Y = 3*X1 + 2*X2 + noiseunde zgomotul este extras dintr-o distribuție normală cu medie 0 și abatere standard 1.
set.seed(123)
n <- 100
X1 <- rnorm(n, mean = 0, sd = 1)
X2 <- rnorm(n, mean = 0, sd = 1)
Z <- 5 * X2 + rnorm(n, mean = 0, sd = 1)
Y <- 3 * X1 + 2 * X2 + rnorm(n, mean = 0, sd = 1)

Coeficienții de corelație dintre cei trei predictori sunt:

kable(cor(cbind(X1, X2, Z)), caption="Correlation of the predictors")
Tabelul 1: Corelarea predictorilor
X1 1,0000000 -0,0495321 -0,0730836
X2 -0,0495321 1,0000000 0,9814767
Z -0,0730836 0,9814767 1,0000000

Acum să potrivim două modele de regresie liniară: unul cu X1 şi X2 ca predictori, iar altul cu X1, X2și Z ca predictori. Vom examina apoi modul în care se modifică următoarele valori: coeficienți, erori standard, valori t, valori p, R-pătrat, R-pătrat ajustat.

fit1 <- lm(Y ~ X1 + X2)
fit2 <- lm(Y ~ X1 + X2 + Z)
coef_results <- rbind(
  tidy(fit1) %>% mutate(model = "fit1"),
  tidy(fit2) %>% mutate(model = "fit2")
)
# move model to the first column
coef_results <- coef_results %>% select(model, everything())
# now R-squared and adjusted R-squared
rsq_results <- rbind(
  glance(fit1) %>% mutate(model = "fit1"),
  glance(fit2) %>% mutate(model = "fit2")
) %>%
  select(model, everything())
kable(coef_results, caption = "The coefficients and statistics")
Tabelul 2: Coeficienții și statisticile
potrivi1 (Intercepta) -0,0270771 0,1058626 -0,2557758 0,7986656
potrivi1 X1 2,9521917 0,1154749 25,5656651 0,0000000
potrivi1 X2 2,0448517 0,1090059 18,7590842 0,0000000
potrivi2 (Intercepta) -0,0193261 0,1073437 -0,1800395 0,8575011
potrivi2 X1 2,9445494 0,1168766 25.1936688 0,0000000
potrivi2 X2 2,3331532 0,5743463 4,0622761 0,0000993
potrivi2 Z -0,0573870 0,1122308 -0,5113302 0,6102939
kable(rsq_results, caption = "The goodness of fit")
Tabelul 2: Bunătatea potrivirii
potrivi1 0,9082614 0,9063699 1,047502 480,1763 0 2 -145,0117 298,0234 308,4441 106,4342 97 100
potrivi2 0,9085106 0,9056516 1,051513 317,7673 0 3 -144,8757 299,7514 312,7773 106,1452 96 100

După cum arată rezultatele, primul model, fit1surprinde aproximativ relația reală în datele simulate, iar ambii coeficienți sunt foarte semnificativi statistic.

Adăugând Z la modelul de regresie produce mai multe modificări: (1) coeficientul pt X2
devine mai mică, (2) eroarea sa standard crește de peste cinci ori și (3) valoarea p pentru testul coeficientului crește în consecință substanțial. În general, R-pătratul modelului se modifică puțin, dar valorile sale AIC și BIC cresc, sugerând că modelul cu trei predictori este mai puțin favorabil decât modelul cu doi predictori.

Pe scurt, includerea unui predictor care este foarte corelat cu un predictor existent reduce semnificația statistică a predictorului existent.

Exemplu: doi predictori cu niveluri diferite de corelație

Acum să simulăm seturi de date care conțin două variabile cu niveluri diferite de corelație. Vom folosi descompunerea Cholesky pentru a simula datele.

Mai întâi, să scriem o funcție care simulează date pentru un coeficient de corelație specificat:

simulate_correlated_data<-function(rho, n=100, seed=NULL) {
  if(is.null(seed)) {
    seed < Sys.time()
  }
  set.seed(seed)
  x <- rnorm(n)
  z <- rnorm(n)
  y <- rho*x + sqrt(1-rho^2)*z
  return(cbind(x,y))
}

Acum să simulăm cinci seturi de date cu corelații țintă de 0,1, 0,3, 0,5, 0,8 și 0,95 între cei doi predictori. De asemenea, vom face ca ambii predictori să contribuie la variabila răspuns, astfel încât să putem examina modul în care diferitele niveluri de corelație afectează potrivirea regresiei:

n<-100
rhos<-c(0.1, 0.3, 0.5, 0.8, 0.95)
simulated_data <- lapply(rhos, simulate_correlated_data, n=n)
# let's calculate the correlation coefficients for the simulated data
simulated_rhos<-sapply(simulated_data, function(d) cor(d(,"x"),d(, "y")))
kable(cbind(expected_rho=rhos, actual_rho=simulated_rhos))
0,10 -0,0271945
0,30 0,3337500
0,50 0,5365344
0,80 0,8167663
0,95 0,9624687

Coeficientul de corelație, rho, din fiecare set de date simulat poate să nu se potrivească exact cu valoarea specificată din cauza eșantionării aleatorii, dar putem totuși examina modul în care nivelul de corelație afectează regresia.

 fits <- lapply(simulated_data, function(d) {
          x1<-d(,"x")
          x2<-d(, "y")
          y <- 10*x1 + 3*x2 + rnorm(n)
          fit<-lm(y~x1 + x2)
          return(fit)
          } 
          )
coef_results<-lapply(seq_along(rhos),
                     function(i) {
                       tidy(fits((i))) %>%
                         mutate(rho = rhos(i)) %>%
                         select(rho, everything())
                     }
                     )
coef_results <- do.call(rbind, coef_results)
kable(coef_results, caption = "Regression statistics with different correlation strengths among predictors")
Tabelul 3: Statistici de regresie cu diferite forțe de corelație între predictori
0,10 (Intercepta) 0,1545731 0,1093261 1,4138713 0,1606012
0,10 x1 10.0038407 0,1047198 95,5296414 0,0000000
0,10 x2 3,0724520 0,1118900 27.4595781 0,0000000
0,30 (Intercepta) 0,0349345 0,1183168 0,2952627 0,7684243
0,30 x1 9,8936718 0,1339565 73,8573235 0,0000000
0,30 x2 3,0068927 0,1113956 26,9929282 0,0000000
0,50 (Intercepta) 0,1417142 0,0972655 1,4569831 0,1483507
0,50 x1 10,0727790 0,1156101 87,1271918 0,0000000
0,50 x2 2,9767374 0,1173528 25.3657122 0,0000000
0,80 (Intercepta) -0,0609381 0,0979742 -0,6219812 0,5354135
0,80 x1 10,3154854 0,1709446 60,3440164 0,0000000
0,80 x2 2,7154226 0,1638409 16,5735364 0,0000000
0,95 (Intercepta) -0,1158642 0,0971670 -1,1924234 0,2360041
0,95 x1 10,0497393 0,3537788 28.4068467 0,0000000
0,95 x2 2.9023068 0,3443712 8,4278435 0,0000000

Să reprezentăm toate valorile:

coef_results <- coef_results %>% 
    mutate(rho = factor(rho)) %>%
    pivot_longer(
      cols = estimate:p.value,
      names_to = "metric",
      values_to = "value"
    )
plt <- ggplot(coef_results, aes(x=rho, y=value)) +
      geom_point(aes(color=term)) +
      facet_wrap(~ metric, ncol=2, scales="free_y") +
      theme(legend.position = "top")
plt

Graficele arată următoarele modele pe măsură ce corelația dintre predictori crește:

  • Coeficienții estimați se modifică puțin, deși rămân unele variații.
  • Valorile p pentru ambii predictori rămân foarte mici.
  • Statisticile testului devin mai mici pe măsură ce rho crește.
  • Erorile standard cresc pe măsură ce rho crește.
  • Pe baza ultimelor două observații, valorile p pentru predictori ar trebui să devină mai mari, adică mai puțin semnificative.

Pe scurt, atunci când predictorii dintr-o regresie sunt corelați, testul pentru fiecare coeficient devine mai puțin semnificativ statistic, chiar dacă mărimile coeficienților rămân apropiate de valorile utilizate pentru simularea datelor.

La pachet

  • Când un predictor, Zeste o funcție liniară a unui alt predictor, Xși nu are nicio relație directă cu variabila răspuns, inclusiv Z face testul pentru predictorul adevărat X mai puțin semnificativă statistic. Coeficientul pentru Z
    poate să nu fie semnificativă deoarece, după contabilizare X, Z nu are efect asupra Y.
  • Când doi predictori afectează ambii Ysemnificația statistică a coeficienților lor scade pe măsură ce corelația dintre predictori crește, chiar dacă mărimile coeficienților pot rămâne apropiate de valorile adevărate.

Luate împreună, aceste exemple sugerează că este posibil să doriți să excludeți anumite variabile din regresie, cu excepția cazului în care știți că acestea afectează răspunsul sau doriți să examinați efectele altor predictori după ce ați controlat acele variabile.

– https://fortune9.netlify.app/2026/10/16/statistics-collinearity-in-regression/ –

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.