さまざまなエラー分散を持つデータをシミュレーションするには、エラー分散のデータ生成プロセスを指定する必要があります。コメントで指摘されているように、元のデータを生成したときにそれを行いました。実際のデータがあり、これを試したい場合は、残差分散が共変量にどのように依存するかを指定する関数を特定するだけです。これを行うための標準的な方法は、モデルを適合させ、それが妥当であることを確認し(異分散性以外)、残差を保存することです。それらの残差は新しいモデルの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)
このモデルのスケール位置プロットでも残差分散が増加しているように見えることを心配する必要はありません。ここでも曲線のわずかなヒントがあります。そのため、2乗項を当てはめ、それが役立つかどうかを確認できます(ただし、効果はありません)。
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のかみそりに基づいて、利用可能な情報量を与えたデータに適切に適合する最も単純な関数を使用します。必要に応じて、スプラインやより洗練されたアプローチを試すこともできます。二変量分布は私とかなり似ています。