異分散性で線形回帰をシミュレーションする


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 2017年

あなたが正しい。線形モデルを使用して不均一性を捉えようとしています。一般化された最小二乗モデルを使用する必要があると思います。他に推奨事項があれば、試してみます。
user44796 2017年

コードにエラーがあります
。`lm(y〜n

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)

ここに画像の説明を入力してください

このモデルのスケール位置プロットでも残差分散が増加しているように見えることを心配する必要はありません。ここでも曲線のわずかなヒントがあります。そのため、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のかみそりに基づいて、利用可能な情報量を与えたデータに適切に適合する最も単純な関数を使用します。必要に応じて、スプラインやより洗練されたアプローチを試すこともできます。二変量分布は私とかなり似ています。

ここに画像の説明を入力してください


これは実際に私が思い始めた結論でしたが、それほどエレガントな答えに到達することはなかったでしょう。
user44796 2017年

5

異分散性をモデル化する必要があります。1つのアプローチは、Rパッケージ(CRAN)によるdglm分散一般化線形モデルです。これはglmの拡張であり、通常のに加えてglm、最初のglmからの残差からの分散のために2番目の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!

シミュレートされたプロットを以下に示します。

ここに画像の説明を入力してください

プロットはシミュレーションが推定分散を使用したように見えますが、simulate()関数にはdglmのメソッドがないため、わかりません...

(調査する別の可能性は、Rパッケージgamlssを使用することです。これは、共変数の関数として分散をモデル化する別のアプローチを使用します。)


1
二重一般化線形モデルは、元のデータを適切にモデル化しているように見えます。残差エラーがどのようにpredict()を使用してモデル化されるかについては不明です。私はそれを調べなければならないでしょう。
user44796 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.