J'ai créé une simulation qui répondrait à la description de Breiman et n'ai trouvé que l'évidence: le résultat dépend du contexte et de ce que l'on entend par «extrême».
Beaucoup pourrait être dit, mais permettez-moi de le limiter à un seul exemple mené au moyen de R
code facilement modifiable que les lecteurs intéressés pourront utiliser dans leurs propres investigations. Ce code commence par mettre en place une matrice de conception composée de valeurs indépendantes approximativement uniformément réparties qui sont approximativement orthogonales (afin que nous n'entrions pas dans des problèmes de multicolinéarité). Il calcule une seule interaction quadratique (c'est-à-dire non linéaire) entre les deux premières variables: ce n'est là qu'un des nombreux types de "non-linéarités" qui pourraient être étudiées, mais au moins c'est une commune, bien comprise. Ensuite, il standardise tout pour que les coefficients soient comparables:
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
Pour le modèle OLS de base (sans non-linéarité), nous devons spécifier certains coefficients et l'écart-type de l'erreur résiduelle. Voici un ensemble de coefficients unitaires et un écart-type comparable:
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))
Plutôt que de parcourir toutes les sorties ici, regardons ces données en utilisant la sortie de la plot
commande:
Les traces inférieures sur le triangle inférieur ne montrent essentiellement aucune relation linéaire entre l'interaction ( x.12
) et la variable dépendante ( y
) et des relations linéaires modestes entre les autres variables et y
. Les résultats de l'OLS le confirment; l'interaction est à peine significative:
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 *
Je prendrai la valeur de p du terme d'interaction comme test de non-linéarité: lorsque cette valeur de p est suffisamment faible (vous pouvez choisir à quel point elle est faible), nous aurons détecté la non-linéarité.
(Il y a ici une subtilité dans ce que nous recherchons exactement. En pratique, nous pourrions avoir besoin d'examiner toutes les interactions quadratiques possibles 7 * 6/2 = 21, ainsi que peut-être 7 termes quadratiques supplémentaires, plutôt que de nous concentrer sur un seul terme comme cela est fait ici. Nous voudrions faire une correction pour ces 28 tests interdépendants. Je ne fais pas explicitement cette correction ici, car à la place j'affiche la distribution simulée des valeurs de p. Vous pouvez lire les taux de détection directement à partir de les histogrammes à la fin en fonction de vos seuils de signification.)
Mais ne faisons pas cette analyse une seule fois; faisons-le beaucoup de fois, générant de nouvelles valeurs de y
à chaque itération selon le même modèle et la même matrice de conception. Pour ce faire, nous utilisons une fonction pour effectuer une itération et renvoyer la valeur de p du terme d'interaction:
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]
}
J'ai choisi de présenter les résultats de la simulation sous forme d'histogrammes des valeurs de p, en faisant varier le coefficient normalisé gamma
du terme d'interaction. Tout d'abord, les histogrammes:
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
Maintenant, faisons le travail. Cela prend quelques secondes pour 1000 essais par simulation (et quatre simulations indépendantes, en commençant par la valeur donnée du terme d'interaction et en la divisant par deux à chaque fois)
temp <- sapply(2^(-3:0) * gamma, h)
Les resultats:
x
sd
beta
1/ 41 / 81 / 16gamma
1 / 2
1 / 321 / 4x
sd
beta
sd
En bref, une simulation comme celle-ci peut prouver tout ce que vous aimez si vous la configurez et l'interprétez correctement. Cela suggère que le statisticien individuel devrait mener ses propres explorations, adaptées aux problèmes particuliers auxquels il est confronté, afin de parvenir à une compréhension personnelle et approfondie des capacités et des faiblesses des procédures qu'il utilise.