Come risolvere in r: indefinito a causa delle singolarità
Un messaggio di errore che potresti incontrare in R è:
Coefficients: (1 not defined because of singularities)
Questo messaggio di errore si verifica quando si adatta un modello utilizzando la funzione glm() in R e due o più variabili predittive hanno una relazione lineare esatta tra loro, nota come multicollinearità perfetta .
Per correggere questo errore, puoi utilizzare la funzione cor() per identificare le variabili nel tuo set di dati che hanno una perfetta correlazione tra loro e rimuovere semplicemente una di queste variabili dal modello di regressione.
Questo tutorial spiega come gestire in pratica questo messaggio di errore.
Come riprodurre l’errore
Supponiamo di adattare un modello di regressione logistica al seguente frame di dati in R:
#define data
df <- data. frame (y = c(0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1),
x1 = c(3, 3, 4, 4, 3, 2, 5, 8, 9, 9, 9, 8, 9, 9, 9),
x2 = c(6, 6, 8, 8, 6, 4, 10, 16, 18, 18, 18, 16, 18, 18, 18),
x3 = c(4, 7, 7, 3, 8, 9, 9, 8, 7, 8, 9, 4, 9, 10, 13))
#fit logistic regression model
model <- glm(y~x1+x2+x3, data=df, family=binomial)
#view model summary
summary(model)
Call:
glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.372e-05 -2.110e-08 2.110e-08 2.110e-08 1.575e-05
Coefficients: (1 not defined because of singularities)
Estimate Std. Error z value Pr(>|z|)
(Intercept) -75.496 176487.031 0.000 1
x1 14.546 24314.459 0.001 1
x2 NA NA NA NA
x3 -2.258 20119.863 0.000 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2.0728e+01 on 14 degrees of freedom
Residual deviance: 5.1523e-10 on 12 degrees of freedom
AIC: 6
Number of Fisher Scoring iterations: 24
Si noti che appena prima dell’output del coefficiente, riceviamo il messaggio:
Coefficients: (1 not defined because of singularities)
Ciò indica che due o più variabili predittive nel modello hanno una relazione lineare perfetta e pertanto non tutti i coefficienti di regressione nel modello possono essere stimati.
Ad esempio, si noti che non è possibile effettuare stime di coefficienti per la variabile predittrice x 2 .
Come gestire l’errore
Per identificare quali variabili predittive causano questo errore, possiamo utilizzare la funzione cor() per produrre una matrice di correlazione ed esaminare quali variabili hanno una correlazione esattamente pari a 1 tra loro:
#create correlation matrix
cor(df)
y x1 x2 x3
y 1.0000000 0.9675325 0.9675325 0.3610320
x1 0.9675325 1.0000000 1.0000000 0.3872889
x2 0.9675325 1.0000000 1.0000000 0.3872889
x3 0.3610320 0.3872889 0.3872889 1.0000000
Dalla matrice di correlazione possiamo vedere che le variabili x 1 e x 2 sono perfettamente correlate.
Per risolvere questo errore, possiamo semplicemente rimuovere una di queste due variabili dal modello, poiché in realtà non forniscono informazioni univoche o indipendenti nel modello di regressione.
Ad esempio, supponiamo di rimuovere x 2 e di adattare il seguente modello di regressione logistica:
#fit logistic regression model
model <- glm(y~x1+x3, data=df, family=binomial)
#view model summary
summary(model)
Call:
glm(formula = y ~ x1 + x3, family = binomial, data = df)
Deviance Residuals:
Min 1Q Median 3Q Max
-1.372e-05 -2.110e-08 2.110e-08 2.110e-08 1.575e-05
Coefficients:
Estimate Std. Error z value Pr(>|z|)
(Intercept) -75.496 176487.031 0.000 1
x1 14.546 24314.459 0.001 1
x3 -2.258 20119.863 0.000 1
(Dispersion parameter for binomial family taken to be 1)
Null deviance: 2.0728e+01 on 14 degrees of freedom
Residual deviance: 5.1523e-10 on 12 degrees of freedom
AIC: 6
Number of Fisher Scoring iterations: 24
Tieni presente che questa volta non riceviamo un messaggio di errore “indefinito a causa di singolarità”.
Nota : non importa se rimuoviamo x 1 o x 2 . Il modello finale conterrà la stessa stima del coefficiente per la variabile che decidi di mantenere e la bontà di adattamento complessiva del modello sarà la stessa.
Risorse addizionali
I seguenti tutorial spiegano come gestire altri errori in R:
Come risolvere il problema in R: formula modello non valida in ExtractVars
Come risolvere in R: l’argomento non è né numerico né logico: return na
Come risolvere: randomForest.default(m, y, …): Na/NaN/Inf nella chiamata di funzione esterna