Difficoltà di testare la linearità nella regressione


21

In Modellistica statistica: Le due culture scrive Leo Breiman

L'attuale pratica applicata è quella di verificare l'adattamento del modello di dati mediante test di bontà di adattamento e analisi residua. Ad un certo punto, alcuni anni fa, ho creato un problema di regressione simulato in sette dimensioni con una quantità controllata di non linearità. I test standard di bontà di adattamento non hanno rifiutato la linearità fino a quando la non linearità è stata estrema.

Breiman non fornisce i dettagli della sua simulazione. Fa riferimento a un documento che dice fornisce una giustificazione teorica per la sua osservazione, ma il documento non è stato pubblicato.

Qualcuno ha visto un risultato di simulazione pubblicato o un documento teorico a supporto delle affermazioni di Brieman?


1
L'estremo è difficile da giudicare, ogni funzione si avvicina lineare su un certo intervallo; come sappiamo dalla decomposizione della serie Taylor. Perché l'approccio del criterio di informazione di Burnham e Anderson alla selezione dei modelli non servirebbe bene questo problema?
Patrick McCann,

Risposte:


11

Ho creato una simulazione che rispondesse alla descrizione di Breiman e ho trovato solo l'ovvio: il risultato dipende dal contesto e da cosa si intende per "estremo".

Si potrebbe dire moltissimo, ma permettetemi di limitarlo a un solo esempio condotto per mezzo di un Rcodice facilmente modificabile che i lettori interessati possono utilizzare nelle proprie indagini. Questo codice inizia impostando una matrice di progettazione costituita da valori indipendenti distribuiti approssimativamente in modo uniforme che sono approssimativamente ortogonali (in modo da non avere problemi di multicollinearità). Calcola una singola interazione quadratica (cioè non lineare) tra le prime due variabili: questo è solo uno dei molti tipi di "non linearità" che potrebbero essere studiati, ma almeno è comune e ben compreso. Quindi standardizza tutto in modo che i coefficienti siano comparabili:

set.seed(41)
p <- 7                                            # Dimensions
n <- 2^p                                          # Observations
x <- as.matrix(do.call(expand.grid, lapply(as.list(1:p), function(i) c(-1,1))))
x <- x + runif(n*p, min=-1, max=1)
x <- cbind(x, x.12 = x[,1]*x[,2])                 # The nonlinear part
x <- apply(x, 2, function(y) (y - mean(y))/sd(y)) # Standardization

Per il modello OLS di base (senza non linearità) è necessario specificare alcuni coefficienti e la deviazione standard dell'errore residuo. Ecco un insieme di coefficienti unitari e una SD comparabile:

beta <- rep(c(1,-1), p)[1:p]
sd <- 1

1/41-1

gamma = 1/4          # The standardized interaction term
df <- data.frame(x)
df$y <- x %*% c(beta, gamma) + rnorm(n, sd=sd)
summary(df)
cor(df)*100
plot(df, lower.panel=function(x,y) lines(lowess(y~x)), 
     upper.panel=function(x,y) points(x,y, pch=".", cex=4))
summary(lm(df$y ~ x))

Invece di guadare tutto l'output qui, diamo un'occhiata a questi dati usando l'output del plotcomando:

SPM

Le tracce lowess sul triangolo inferiore non mostrano essenzialmente alcuna relazione lineare tra l'interazione ( x.12) e la variabile dipendente ( y) e relazioni lineari modeste tra le altre variabili e y. I risultati OLS lo confermano; l'interazione è poco significativa:

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept)   0.0263     0.0828    0.32    0.751    
xVar1         0.9947     0.0833   11.94   <2e-16 ***
xVar2        -0.8713     0.0842  -10.35   <2e-16 ***
xVar3         1.0709     0.0836   12.81   <2e-16 ***
xVar4        -1.0007     0.0840  -11.92   <2e-16 ***
xVar5         1.0233     0.0836   12.24   <2e-16 ***
xVar6        -0.9514     0.0835  -11.40   <2e-16 ***
xVar7         1.0482     0.0835   12.56   <2e-16 ***
xx.12         0.1902     0.0836    2.27    0.025 *  

Prenderò il valore p del termine di interazione come un test di non linearità: quando questo valore p è sufficientemente basso (puoi scegliere quanto basso), avremo rilevato la non linearità.

(C'è una sottigliezza qui su cosa stiamo esattamente cercando. In pratica potremmo aver bisogno di esaminare tutte le possibili 7 * 6/2 = 21 possibili interazioni quadratiche, così come forse altri 7 termini quadratici, piuttosto che concentrarci su un solo termine come viene fatto qui. Vorremmo apportare una correzione per questi 28 test correlati. Qui non eseguo esplicitamente questa correzione, perché invece visualizzo la distribuzione simulata dei valori p. È possibile leggere i tassi di rilevamento direttamente da gli istogrammi alla fine in base alle tue soglie di significato.)

Ma non facciamo questa analisi una sola volta; facciamolo molte volte, generando nuovi valori yin ogni iterazione secondo lo stesso modello e la stessa matrice di progettazione. A tale scopo, utilizziamo una funzione per eseguire un'iterazione e restituire il valore p del termine di interazione:

test <- function(gamma, sd=1) {
  y <- x %*% c(beta, gamma) + rnorm(n, sd=sd)
  fit <- summary(lm(y ~ x))
  m <- coef(fit)
  n <- dim(m)[1]
  m[n, 4]
}

Ho scelto di presentare i risultati della simulazione come istogrammi dei valori p, variando il coefficiente standardizzato gammadel termine di interazione. Innanzitutto, gli istogrammi:

h <- function(g, n.trials=1000) {
  hist(replicate(n.trials, test(g, sd)), xlim=c(0,1), 
       main=toString(g), xlab="x1:x2 p-value")
}
par(mfrow=c(2,2)) # Draw a 2 by 2 panel of results

Ora per fare il lavoro. Sono necessari alcuni secondi per 1000 prove per simulazione (e quattro simulazioni indipendenti, a partire dal valore dato del termine di interazione e dimezzandolo successivamente ogni volta):

temp <- sapply(2^(-3:0) * gamma, h)

I risultati:

Gli istogrammi

xsdbeta1/41/81/16gamma1/2

1/321/4xsdbetasd

In breve, una simulazione come questa può provare ciò che ti piace se la imposti e la interpreti nel modo giusto. Ciò suggerisce che il singolo statistico dovrebbe condurre le proprie esplorazioni, adeguate ai particolari problemi che devono affrontare, al fine di giungere a una comprensione personale e profonda delle capacità e dei punti deboli delle procedure che stanno utilizzando.


+1, solo FYI, noto che scrivi la tua funzione per standardizzare i tuoi dati, potresti trovare utile la scala .
gung - Ripristina Monica

Grazie @gung. Ero sicuro che esistesse una simile funzione ma non riuscivo a pensare al suo nome. Sono abbastanza nuovo Re apprezzo sempre tali suggerimenti.
whuber

1

Non sono sicuro che dia una risposta definitiva alla domanda, ma darei un'occhiata a questo . Soprattutto il punto 2. Vedi anche la discussione nell'appendice A2 del documento .


Grazie per la ricerca, ma queste sembrano essere applicazioni adatte alla distribuzione piuttosto che alla regressione OLS.
whuber
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.