同じモデル内の2つのパラメーター推定値が大幅に異なる場合、どのようにテストできますか?


12

私はモデルを持っています

y=xa×zb+e

ここで、は従属変数、とzは説明変数、abはパラメーター、eはエラー項です。abのパラメーター推定値とこれらの推定値の共分散行列があります。abが大きく異なるかどうかをテストするにはどうすればよいですか?yxzabeabab

回答:


16

とが異なるという仮説を評価すること 、帰無仮説abab=0 (という代替案に対して)をテストすることと同等です。ab0

次の分析では、をとして推定するのが妥当であると仮定しています また、モデルの定式化(多くの場合、合理的なもの)を受け入れます。これは、エラーが加算的であるため(負の観測値を生成する可能性もあるため)、両側の対数を取ることで線形化することを許可しません。ab

U=a^b^.
y

の分散は共分散行列で表すことができますU(cij)のとして(a^,b^)

Var(U)=Var(a^b^)=Var(a^)+Var(b^)2Cov(a^,b^)=c11+c222c122.

場合されている最小二乗推定と、一方は通常、「t検定を、」使用します つまり、 分布は、自由度のスチューデントt分布で近似されます(はデータカウント、は係数の数をカウントします) )。とにかく、は通常、あらゆるテストの基礎です。たとえば、Zテスト(が大きい場合、または最尤法でフィッティングする場合)を実行したり、ブートストラップしたりできます。(a^,b^)

t=U/Var(U)
n2n2tn

具体的には、t検定のp値は次の式で与えられます。

p=2tn2(|t|)

ここで、はスチューデントのt(累積)分布関数です。これは、「テール領域」の表現の1つです。スチューデントt変数(自由度)が検定統計量サイズ以上になる可能性tn2n2|t|.


より一般的には、数値およびまったく同じアプローチを使用して仮説をテストできます。c1, c2,μ

H0:c1a+c2b=μ

両面代替案に対して。(これは、「コントラスト」の特殊だが広範囲に及ぶケースを含みます。)推定された分散共分散行列を使用して、の分散を推定し、統計を形成します。(cij)U=c1a+c2b

t=(c1a^+c2b^μ)/Var(U).

上記はおよび(c1,c2)=(1,1)μ=0.


このアドバイスが正しいことを確認するために、次のRコードを実行して、このモデル(正規分布エラーe)に従ってデータを作成し、それらを近似し、の値を何度も計算しました。チェックは、(想定されるスチューデントのt分布に基づく)の確率プロットが対角線に密接に従うことです。ここに、(非常に小さなデータセット、分布が正規分布から遠いために選択された)およびのサイズシミュレーションのプロットがありますtt500n=5ta=b=1/2.

確率プロット

この例では、少なくとも手順は美しく機能しています。状況を反映する パラメーター(エラー標準偏差)、およびを使用してシミュレーションを再実行することを検討してください。a, b, σn

コードは次のとおりです。

#
# Specify the true parameters.
#
set.seed(17)
a <- -1/2
b <- -1/2
sigma <- 0.25 # Variance of the errors
n <- 5        # Sample size
n.sim <- 500  # Simulation size
#
# Specify the hypothesis.
#
H.0 <- c(1, -1) # Coefficients of `a` and `b`.
mu <- 0 
#
# Provide x and z values in terms of their logarithms.
#
log.x <- log(rexp(n))
log.z <- log(rexp(n))
#
# Compute y without error.
#
y.0 <- exp(a * log.x + b * log.z)
#
# Conduct a simulation to estimate the sampling distribution of the t statistic.
#
sim <- replicate(n.sim, {
  #
  # Add the errors.
  #
  e <- rnorm(n, 0, sigma)
  df <- data.frame(log.x=log.x, log.z=log.z, y.0, y=y.0 + e)
  #
  # Guess the solution.
  #
  fit.ols <- lm(log(y) ~ log.x + log.z - 1, subset(df, y > 0))
  start <- coefficients(fit.ols) # Initial values of (a.hat, b.hat)
  #
  # Polish it using nonlinear least squares.
  #
  fit <- nls(y ~ exp(a * log.x + b * log.z), df, list(a=start[1], b=start[2]))
  #
  # Test a hypothesis.
  #
  cc <- vcov(fit)
  s <- sqrt((H.0 %*% cc %*% H.0))
  (crossprod(H.0, coef(fit)) - mu) / s
})
#
# Display the simulation results.
#
summary(lm(sort(sim) ~ 0 + ppoints(length(sim))))
qqplot(qt(ppoints(length(sim)), df=n-2), sim, 
       pch=21, bg="#00000010", col="#00000040",
       xlab="Student t reference value", 
       ylab="Test statistic")
abline(0:1, col="Red", lwd=2)

2
これは素晴らしいです。理論、他のテストのために繰り返す手順、明確にするための数値的アプローチ、およびコードを含む回答。これがゴールドスタンダードです。
SecretAgentMan

1
私は「を見つけることはそれがnullまたは代替仮説であるかどうかは明らかではないので、あなたのオープニングの文の曖昧とbが異なるという仮説を」。OPの質問は、彼らが違いの証拠を探していることを明らかにしており、あなたの文の2番目の節はそれを語っています。教育的には、仮説検定を初めて使用する人々が非常に明確になるのに役立つと思います。(ただし、全体的な答えは+1 :)
アレクシス

1
@アレクシスありがとう-あなたの言っていることがわかります。私はそのような人々を念頭に置いているので、明確にします。
whuber
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.