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 R
codice 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 plot
comando:
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 y
in 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 gamma
del 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:
x
sd
beta
1 / 41 / 81 / 16gamma
1 / 2
1 / 321 / 4x
sd
beta
sd
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.