Choisissez n'importe quel (xi) condition qu'au moins deux d'entre eux diffèrent. Définir une ordonnée à l'origine β0 et une pente β1 et définir
y0i=β0+β1xi.
Cet ajustement est parfait. Sans modifier l'ajustement, vous pouvez modifier y0 en y=y0+ε en y ajoutant tout vecteur d'erreur ε=(εi) à condition qu'il soit orthogonal à la fois au vecteur x=(xi) et au vecteur constant (1,1,…,1) . Un moyen facile d'obtenir une telle erreur est de choisir n'importe quel vecteur e et de laisser ε les résidus lors de la régression de econtre x . Dans le code ci-dessous, e est généré comme un ensemble de valeurs normales aléatoires indépendantes avec une moyenne de 0 et un écart-type commun.
De plus, vous pouvez même présélectionner la quantité de dispersion, peut - être en précisant ce que R2 devrait être. En laissant τ2=var(yi)=β21var(xi) , redimensionnez ces résidus pour avoir une variance de
σ2=τ2(1/R2−1).
Cette méthode est entièrement générale: tous les exemples possibles (pour un ensemble donné de xi ) peuvent être créés de cette façon.
Exemples
Quatuor d'Anscombe
Nous pouvons facilement reproduire le Quatuor d' Anscombe de quatre ensembles de données bivariés qualitativement distincts ayant les mêmes statistiques descriptives (par le second ordre).
Le code est remarquablement simple et flexible.
set.seed(17)
rho <- 0.816 # Common correlation coefficient
x.0 <- 4:14
peak <- 10
n <- length(x.0)
# -- Describe a collection of datasets.
x <- list(x.0, x.0, x.0, c(rep(8, n-1), 19)) # x-values
e <- list(rnorm(n), -(x.0-peak)^2, 1:n==peak, rnorm(n)) # residual patterns
f <- function(x) 3 + x/2 # Common regression line
par(mfrow=c(2,2))
xlim <- range(as.vector(x))
ylim <- f(xlim + c(-2,2))
s <- sapply(1:4, function(i) {
# -- Create data.
y <- f(x[[i]]) # Model values
sigma <- sqrt(var(y) * (1 / rho^2 - 1)) # Conditional S.D.
y <- y + sigma * scale(residuals(lm(e[[i]] ~ x[[i]]))) # Observed values
# -- Plot them and their OLS fit.
plot(x[[i]], y, xlim=xlim, ylim=ylim, pch=16, col="Orange", xlab="x")
abline(lm(y ~ x[[i]]), col="Blue")
# -- Return some regression statistics.
c(mean(x[[i]]), var(x[[i]]), mean(y), var(y), cor(x[[i]], y), coef(lm(y ~ x[[i]])))
})
# -- Tabulate the regression statistics from all the datasets.
rownames(s) <- c("Mean x", "Var x", "Mean y", "Var y", "Cor(x,y)", "Intercept", "Slope")
t(s)
La sortie donne les statistiques descriptives du second ordre pour les données (x,y) pour chaque ensemble de données. Les quatre lignes sont identiques. Vous pouvez facilement créer plus d'exemples en modifiant x
(les coordonnées x) et e
(les modèles d'erreur) au début.
Des simulations
R
yβ=(β0,β1)R20≤R2≤1x
simulate <- function(x, beta, r.2) {
sigma <- sqrt(var(x) * beta[2]^2 * (1/r.2 - 1))
e <- residuals(lm(rnorm(length(x)) ~ x))
return (y.0 <- beta[1] + beta[2]*x + sigma * scale(e))
}
(Il ne serait pas difficile de porter cela sur Excel - mais c'est un peu douloureux.)
(x,y)60 xβ=(1,−1/2)1−1/2R2=0.5
n <- 60
beta <- c(1,-1/2)
r.2 <- 0.5 # Between 0 and 1
set.seed(17)
x <- rnorm(n)
par(mfrow=c(1,4))
invisible(replicate(4, {
y <- simulate(x, beta, r.2)
fit <- lm(y ~ x)
plot(x, y)
abline(fit, lwd=2, col="Red")
}))
summary(fit)
R2xi