이분산성을 사용하여 선형 회귀 시뮬레이션


9

내가 가지고있는 경험적 데이터와 일치하는 데이터 세트를 시뮬레이션하려고하지만 원래 데이터의 오류를 추정하는 방법을 잘 모르겠습니다. 경험적 데이터는 이분산성을 포함하지만 나는 그것을 변환하는 데 관심이 없지만 오히려 경험적 데이터의 시뮬레이션을 재현하기 위해 오류 항이있는 선형 모델을 사용합니다.

예를 들어, 경험적 데이터 집합과 모델이 있다고 가정 해 보겠습니다.

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)

사용하여 plot(n,y)우리는 다음을 얻는다. 여기에 이미지 설명을 입력하십시오

그러나 데이터를 시뮬레이션하려고 simulate(mod)하면 이분산성이 제거되고 모델에 의해 캡처되지 않습니다.

일반화 된 최소 제곱 모형을 사용할 수 있습니다

VMat <- varFixed(~n)
mod2 = gls(y ~ n, weights = VMat)

AIC를 기반으로 더 나은 모델을 제공하지만 출력을 사용하여 데이터를 시뮬레이션하는 방법을 모르겠습니다.

제 질문은 원래 경험적 데이터 (위의 n 및 y)와 일치하도록 데이터를 시뮬레이션 할 수있는 모델을 만드는 방법입니다. 특히, 모델을 사용하여 sigma2, 오류를 추정하는 방법이 필요합니까?


1
따라서 선형 모델은 몇 가지 접근 방식 중 하나를 사용하여 명시 적으로 시도하지 않는 한 조건부 이분산성을 캡처하지 않습니다. 표준 계량 경제 기법은 이분산성을 설명하기 위해 매개 변수의 표준 오류를 조정하지만 명시 적으로 모델링하지는 않습니다.
generic_user

네가 옳아. 이질성을 캡처하기 위해 선형 모델을 사용하려고합니다. 나는 일반화 된 최소 제곱 모델을 사용해야한다고 생각합니다. 다른 권장 사항이 있으면 시도해 봅니다.
user44796

코드에 오류가 있습니다
.`lm

1
코드가 제목에서 요구하는 것처럼 정확하게 달성하기 때문에 질문을 이해하지 못합니다.이 분산 오류로 선형 회귀를 시뮬레이션합니다. 이분산성에 대한 일종의 모형을 추정 할 수있는 방법을 요구하고 있습니까? 그렇다면 모델을 지정해야합니다!
whuber

잘만되면 나는 편집으로 나의 질문을 명확히했다. 위의 질문에서 n과 y는 경험적 데이터를 나타냅니다. 모델을 데이터에 맞추고 모델을 사용하여 원래 데이터의 평균 및 잔차와 일치하는 시뮬레이션 데이터를 생성하려고합니다.
user44796

답변:


9

다양한 오차 분산으로 데이터를 시뮬레이션하려면 오차 분산에 대한 데이터 생성 프로세스를 지정해야합니다. 주석에서 지적했듯이 원본 데이터를 생성 할 때 그렇게했습니다. 실제 데이터가 있고이를 시도하려면 잔차 분산이 공변량에 어떻게 의존하는지 지정하는 함수를 식별하면됩니다. 이를 수행하는 표준 방법은 모델을 적합 화하고 (이분산성 이외의) 모델이 적합한 지 확인하고 잔차를 저장하는 것입니다. 이러한 잔차는 새 모델의 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의 면도기를 기반으로 사용 가능한 정보의 양에 주어진 데이터에 가장 적합한 가장 간단한 기능을 사용합니다. 원하는 경우 스플라인 또는 더 멋진 접근법을 시도 할 수도 있습니다. 이변 량 분포는 저와 상당히 비슷해 보입니다.

여기에 이미지 설명을 입력하십시오


이것은 실제로 내가 오기 시작한 결론 이었지만 결코 그렇게 우아한 대답에 도달하지는 못했을 것입니다.
user44796

5

이분산성을 모델링해야합니다. 한 가지 방법은 dglm분산 일반화 된 선형 모델 인 R 패키지 (CRAN)를 통한 것 입니다. 이것은 glm의 확장이며, 이는 일반적인 것 외에도 glm첫 번째 glm의 잔차에서 분산하기 위해 두 번째 glm에 적합합니다. 나는 그러한 모델에 대한 경험이 없지만 유망한 것처럼 보입니다 ... 여기 몇 가지 코드가 있습니다.

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)

library(dglm)  ### double glm's

mod2   <-  dglm(y ~ n, ~ n, gaussian,ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)
### This uses log link for the dispersion part, should also try identity link ..

y2 <-  simulate(mod2)

plot(n, y2$sim_1)

mod3  <-  dglm(y ~ n, ~ n, gaussian, dlink="identity", ykeep=TRUE,xkeep=TRUE,zkeep=TRUE)  ### This do not work because it leads to negative weights!

시뮬레이션 된 플롯은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

플롯은 시뮬레이션이 추정 분산을 사용한 것처럼 보이지만, 시뮬레이트 () 함수에 dglm에 대한 메소드가 없기 때문에 확실하지 않습니다 ...

(또 다른 가능성은 R패키지를 사용하는 것입니다. 패키지 gamlss를 사용하면 공변량의 함수로 분산을 모델링하는 다른 방법을 사용합니다.)


1
이중 일반화 된 선형 모델은 원래 데이터를 적절히 모델링하는 것으로 보입니다. predict ()를 사용하여 잔차 오류가 어떻게 모델링되는지 확실하지 않습니다. 나는 그것을 조사해야 할 것이다.
user44796
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.