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)
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)
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,