다양한 오차 분산으로 데이터를 시뮬레이션하려면 오차 분산에 대한 데이터 생성 프로세스를 지정해야합니다. 주석에서 지적했듯이 원본 데이터를 생성 할 때 그렇게했습니다. 실제 데이터가 있고이를 시도하려면 잔차 분산이 공변량에 어떻게 의존하는지 지정하는 함수를 식별하면됩니다. 이를 수행하는 표준 방법은 모델을 적합 화하고 (이분산성 이외의) 모델이 적합한 지 확인하고 잔차를 저장하는 것입니다. 이러한 잔차는 새 모델의 Y 변수가됩니다. 아래에서는 데이터 생성 프로세스를 위해 그 작업을 수행했습니다. (랜덤 시드를 어디에 설정했는지 알 수 없으므로 문자 그대로 동일한 데이터는 아니지만 비슷해야하며 내 시드를 사용하여 내 것을 정확하게 재현 할 수 있습니다.)
set.seed(568) # this makes the example exactly reproducible
n = rep(1:100,2)
a = 0
b = 1
sigma2 = n^1.3
eps = rnorm(n,mean=0,sd=sqrt(sigma2))
y = a+b*n + eps
mod = lm(y ~ n)
res = residuals(mod)
windows()
layout(matrix(1:2, nrow=2))
plot(n,y)
abline(coef(mod), col="red")
plot(mod, which=3)
참고 R
의 ? plot.lm 당신에게 플롯 (참조, 줄 것이다 여기에 유용하게 당신이 필요 단지 인 LOWESS 맞는와 겹쳐 잔차의 절대 값의 제곱근의 참조). 공변량이 여러 개인 경우 각 공변량에 대해 개별적으로이를 평가할 수 있습니다. 곡선에 대한 힌트는 거의 없지만 직선은 데이터를 적합하게 처리하는 것처럼 보입니다. 따라서 해당 모델을 명시 적으로 맞추겠습니다.
res.mod = lm(sqrt(abs(res))~fitted(mod))
summary(res.mod)
# Call:
# lm(formula = sqrt(abs(res)) ~ fitted(mod))
#
# Residuals:
# Min 1Q Median 3Q Max
# -3.3912 -0.7640 0.0794 0.8764 3.2726
#
# Coefficients:
# Estimate Std. Error t value Pr(>|t|)
# (Intercept) 1.669571 0.181361 9.206 < 2e-16 ***
# fitted(mod) 0.023558 0.003157 7.461 2.64e-12 ***
# ---
# Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#
# Residual standard error: 1.285 on 198 degrees of freedom
# Multiple R-squared: 0.2195, Adjusted R-squared: 0.2155
# F-statistic: 55.67 on 1 and 198 DF, p-value: 2.641e-12
windows()
layout(matrix(1:4, nrow=2, ncol=2, byrow=TRUE))
plot(res.mod, which=1)
plot(res.mod, which=2)
plot(res.mod, which=3)
plot(res.mod, which=5)
우리는이 모델에 대한 스케일 위치 플롯에서 잔차 분산이 증가하는 것처럼 보일 필요가 없습니다. 커브에 대한 가장 작은 힌트가 다시 있으므로, 제곱 항을 맞추고 그것이 도움이되는지 알아볼 수는 있습니다.
res.mod2 = lm(sqrt(abs(res))~poly(fitted(mod), 2))
summary(res.mod2)
# output omitted
anova(res.mod, res.mod2)
# Analysis of Variance Table
#
# Model 1: sqrt(abs(res)) ~ fitted(mod)
# Model 2: sqrt(abs(res)) ~ poly(fitted(mod), 2)
# Res.Df RSS Df Sum of Sq F Pr(>F)
# 1 198 326.87
# 2 197 326.85 1 0.011564 0.007 0.9336
이에 만족하면 이제이 프로세스를 애드온으로 사용하여 데이터를 시뮬레이션 할 수 있습니다.
set.seed(4396) # this makes the example exactly reproducible
x = n
expected.y = coef(mod)[1] + coef(mod)[2]*x
sim.errors = rnorm(length(x), mean=0,
sd=(coef(res.mod)[1] + coef(res.mod)[2]*expected.y)^2)
observed.y = expected.y + sim.errors
이 프로세스는 다른 통계적 방법보다 실제 데이터 생성 프로세스를 찾도록 보장되지 않습니다. 비선형 함수를 사용하여 오류 SD를 생성했으며 선형 함수로 근사했습니다. 실제 데이터 생성 프로세스를 미리 알고있는 경우 (이 경우처럼 원본 데이터를 시뮬레이션했기 때문에)이를 사용할 수도 있습니다. 여기의 근사치가 목적에 충분한 지 결정할 수 있습니다. 우리는 일반적으로 실제 데이터 생성 프로세스를 모르지만 Occam의 면도기를 기반으로 사용 가능한 정보의 양에 주어진 데이터에 가장 적합한 가장 간단한 기능을 사용합니다. 원하는 경우 스플라인 또는 더 멋진 접근법을 시도 할 수도 있습니다. 이변 량 분포는 저와 상당히 비슷해 보입니다.