Heterossedastisite ile lineer regresyonu simüle eder


9

Sahip olduğum ampirik verilerle eşleşen bir veri kümesini simüle etmeye çalışıyorum, ancak orijinal verilerdeki hataları nasıl tahmin edeceğimden emin değilim. Ampirik veriler heterossedastisite içerir, ancak onu dönüştürmekle değil, ampirik verilerin simülasyonlarını yeniden üretmek için hata terimiyle doğrusal bir model kullanmakla ilgileniyorum.

Örneğin, bazı ampirik veri kümem ve bir modelim olduğunu varsayalım:

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)

kullanarak plot(n,y)aşağıdakileri elde ediyoruz. resim açıklamasını buraya girin

Ancak, verileri simüle etmeye çalışırsam simulate(mod), heteroseladastisite kaldırılır ve model tarafından yakalanmaz.

Genelleştirilmiş en küçük kareler modelini kullanabilirim

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

Bu, AIC'ye dayalı daha iyi bir model uyumu sağlar, ancak çıktıyı kullanarak verileri nasıl simüle edeceğimi bilmiyorum.

Benim sorum, orijinal, ampirik verilerle eşleştirmek için verileri simüle etmeme izin verecek bir model nasıl oluşturabilirim (yukarıdaki n ve y). Özellikle, bir model kullanarak sigma2, hata, tahmin etmek için bir yol gerekir?


1
Dolayısıyla, doğrusal model, birkaç yaklaşımdan birini kullanarak açıkça yapmaya çalışmadığı sürece koşullu heteroskedastisite yakalamayacaktır. Standart ekonometrik teknikler, heteroskedastisiteyi hesaba katmak için parametrelerdeki standart hataları ayarlar, ancak açıkça modellemezler.
generic_user

Haklısın. Heterojenliği yakalamak için doğrusal bir model kullanmaya çalışıyorum. Bence genelleştirilmiş en küçük kareler modelini kullanmalıyım. Başka öneriler varsa, onları deneyeceğim.
user44796

KODUNUZDA HATA VAR,
Lm

1
Sorunuzu anlamıyorum, çünkü kodunuz tam olarak başlığında sorduğunuz şeyi başarıyor: heteroscedastik hatalarla doğrusal bir regresyon simüle ediyor. Hetero-esneklik için bir tür model tahmin etmek için yöntemler mi arıyorsunuz? Öyleyse, bir model belirtmeniz gerekir!
whuber

Umarım düzenlemeler ile sorumu açıklığa kavuşturmuşumdur. Yukarıdaki soruda, n ve y ampirik verileri temsil etmektedir. Verilere bir model sığdırmak ve daha sonra orijinal verilerin ortalama ve kalıntılarıyla eşleşen simüle veriler oluşturmak için modeli kullanmak istiyorum.
user44796

Yanıtlar:


9

Değişen bir hata varyansı ile verileri simüle etmek için, hata varyansı için veri oluşturma işlemini belirtmeniz gerekir. Yorumlarda belirtildiği gibi, orijinal verilerinizi oluştururken bunu yaptınız. Gerçek verileriniz varsa ve bunu denemek istiyorsanız, kalan varyansın ortak değişkenlerinize nasıl bağlı olduğunu belirten işlevi tanımlamanız yeterlidir. Bunu yapmanın standart yolu, modelinize uymak, mantıklı olup olmadığını kontrol etmek (heterojenlik dışında) ve kalıntıları kurtarmaktır. Bu artıklar yeni bir modelin Y değişkeni haline gelir. Aşağıda bunu veri oluşturma süreciniz için yaptım. (Rastgele tohumu nereye koyduğunuzu görmüyorum, bu yüzden bunlar tam anlamıyla aynı veriler olmayacak, ancak benzer olmalı ve benim tohumumu kullanarak tam olarak çoğaltabilirsiniz.)

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)

resim açıklamasını buraya girin

Not o R'ler ? Plot.lm size bir arsa (Bkz, verecektir burada yardımsever ihtiyacınız olan şey bir lowess oturması ile kaplanmış artıklar mutlak değerlerinin kare kök,). (Birden fazla ortak değişkeniniz varsa, bunu her bir ortak değişkene karşı ayrı ayrı değerlendirmek isteyebilirsiniz.) Bir eğrinin en ufak bir ipucu var, ancak bu düz bir çizginin verilerin uydurulması için iyi bir iş çıkardığı görülüyor. Öyleyse bu modele açıkça uyuyalım:

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)

resim açıklamasını buraya girin

Kalan varyansın bu model için ölçek-konum grafiğinde de artmakta olduğu endişesi taşımamıza gerek yoktur - bu esasen gerçekleşmelidir. Yine bir eğrinin en ufak bir ipucu var, bu yüzden kare bir terime uymayı deneyebilir ve bunun yardımcı olup olmadığını görebiliriz (ancak işe yaramaz):

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

Bundan memnun kalırsak, bu işlemi artık verileri simüle etmek için bir eklenti olarak kullanabiliriz.

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

Bu sürecin gerçek veri üretme sürecini bulmasının diğer istatistiksel yöntemlerden daha fazla garanti edilmediğini unutmayın. Hata SD'lerini oluşturmak için doğrusal olmayan bir işlev kullandınız ve bu işlevi doğrusal bir işlevle yaklaştık. A-priori gerçek veri oluşturma sürecini gerçekten biliyorsanız (bu durumda, orijinal verileri simüle ettiğiniz için), bunu da kullanabilirsiniz. Buradaki yaklaşımın amaçlarınız için yeterince iyi olup olmadığına karar verebilirsiniz. Bununla birlikte, genellikle gerçek veri oluşturma sürecini bilmiyoruz ve Occam'ın usturaya dayanarak, mevcut bilgi miktarına verdiğimiz verilere yeterince uyan en basit işlevle devam ediyoruz. İsterseniz spline veya meraklı yaklaşımları da deneyebilirsiniz. İki değişkenli dağılımlar bana oldukça benzer görünüyor,

resim açıklamasını buraya girin


Bu aslında gelmeye başladığım bir sonuçtu, ama asla bu kadar şık bir cevap bulamazdım.
user44796

5

Heteroskedastisiteyi modellemeniz gerekir. Bir yaklaşım dglm, dispersiyon genelleştirilmiş doğrusal model olan R paketi (CRAN) yoluyladır . Bu, olağan olana ek olarak glm, birinci glm'den artıklardan dağılım için ikinci bir glm'ye uyan glm'lerin bir uzantısıdır. Ben bu tür modelleri ile hiçbir deneyimim yok, ama umut verici görünüyor ... İşte bazı kod:

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!

Simüle edilmiş çizim aşağıda gösterilmiştir:

resim açıklamasını buraya girin

Çizim benzetmeyi tahmini varyansı kullanmış gibi görünüyor, ancak simulate () işlevinin dglm için yöntemleri olmadığı için emin değilim ...

(Bakmak için başka bir olasılık , varyansın değişkenlerin bir fonksiyonu olarak modellenmesi için başka bir yaklaşım kullanan Rpaketi gamlsskullanmaktır.)


1
çift ​​genelleştirilmiş doğrusal model, orijinal verileri yeterince modelliyor gibi görünmektedir. Kalan hatanın nasıl predict () kullanılarak modellenmiş olduğu konusunda net değilim. Buna bakmam gerekecek.
user44796
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.