Выберите любой если хотя бы два из них отличаются. Установите и slope и определите(xi)β0β1
y0i=β0+β1xi.
Это подходит идеально. Не меняя подгонку, вы можете изменить на , добавив к нему любой вектор ошибок при условии, что он ортогонален как вектору и вектору констант . Простой способ получить такую ошибку - выбрать любой вектор и позволить быть остатками при регрессии против . В приведенном ниже коде генерируется как набор независимых случайных нормальных значений со средним и общим стандартным отклонением.y0y=y0+εε=(εi)x=(xi)(1,1,…,1)e ε e x e 0eεexe0
Кроме того, вы даже можете предварительно выбрать количество разброса, возможно, указав, какой должен быть . Позволяя , измените масштаб этих остатков, чтобы иметь дисперсиюR2τ2=var(yi)=β21var(xi)
σ2=τ2(1/R2−1).
Этот метод является полностью общим: все возможные примеры (для данного набора ) могут быть созданы таким образом.xi
Примеры
Анскомб квартет
Мы можем легко воспроизвести квартет Анскомба из четырех качественно различных двумерных наборов данных, имеющих одинаковую описательную статистику (через второй порядок).
Код удивительно прост и гибок.
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)
Выходные данные дают описательную статистику второго порядка для данных для каждого набора данных. Все четыре строки идентичны. Вы можете легко создать больше примеров, изменив (x-координаты) и (шаблоны ошибок) в самом начале.(x,y)x
e
Симуляторы
Эта 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))
}
(Нетрудно перенести это в Excel - но это немного больно.)
В качестве примера его использования, вот четыре моделирования данных с использованием общего набора значений, ( то есть , отсекаемые и наклон ) и .(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