Scegli una ( xio) purché almeno due differiscano. Impostare un'intercetta β0 e la pendenza β1 e definire
y0 i= β0+ β1Xio.
Questa vestibilità è perfetta. Senza modificare l'adattamento, è possibile modificare y0 in y= y0+ ε aggiungendo qualsiasi vettore di errore ε = ( εio) a condizione che sia ortogonale sia al vettore x=(xi) che al vettore costante (1,1,…,1) . Un modo semplice per ottenere un tale errore è quello di selezionare qualsiasi vettore e e lasciare ε siano i residui dopo aver regredito econtro X . Nel codice seguente, e viene generato come un insieme di valori normali casuali indipendenti con media 0 e deviazione standard comune.
Inoltre, puoi anche preselezionare la quantità di scatter, magari stabilendo quale dovrebbe essere R2 . Lasciare τ2= var ( yio) = β21var ( xio) , ridimensionare i residui per avere una varianza di
σ2= τ2( 1 / R2- 1 ) .
Questo metodo è del tutto generale: tutti i possibili esempi (per un dato set di Xio ) possono essere creati in questo modo.
Esempi
Quartetto di Anscombe
Possiamo facilmente riprodurre il Quartetto di Anscombe di quattro set di dati bivariati qualitativamente distinti con le stesse statistiche descrittive (attraverso il secondo ordine).
Il codice è straordinariamente semplice e flessibile.
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)
L'output fornisce le statistiche descrittive del secondo ordine per i dati ( x , y) per ciascun set di dati. Tutte e quattro le linee sono identiche. Puoi facilmente creare altri esempi modificando x
(le coordinate x) e e
(i modelli di errore) all'inizio.
simulazioni
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))
}
(Non sarebbe difficile portarlo su Excel - ma è un po 'doloroso.)
( x , y)60 Xβ= ( 1 , - 1 / 2 )( ovvero intercetta1 e pendenza - 1 / 2), e R2= 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")
}))
Eseguendo summary(fit)
è possibile verificare che i coefficienti stimati siano esattamente come specificato e il multiploR2è il valore desiderato. Altre statistiche, come il valore p di regressione, possono essere regolate modificando i valori diXio.