选择任意(xi)只要其中至少两个不同即可。设置截距β0和斜率β1,并定义
y0i=β0+β1xi.
完美贴合。而不改变配合,可以修改y0至y=y0+ε通过添加任何误差矢量ε=(εi)给它,只要它是正交既与矢量x=(xi)和常数向量(1,1,…,1)。获得这种误差的一种简单方法是选择任意向量e然后让ε为回归 e时的残差e针对x。在下面的代码中,e作为一组独立的随机正态值生成,均值为0,共有标准偏差。
此外,甚至可以通过指定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,y)数据的二阶描述性统计信息。 所有四行都是相同的。 您可以通过一开始更改x
(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