相関性の高いデータがいくつかあります。線形回帰を実行すると、勾配が1(= 0.93)に近い回帰直線が得られます。私がやりたいのは、この勾配が1.0と大きく異なるかどうかをテストすることです。私の期待はそうではないということです。言い換えると、線形回帰の帰無仮説をゼロの勾配から1の勾配に変更したいのです。これは賢明なアプローチですか?また、回答にRコードを含めて、このメソッド(または、より良い方法を提案する)を実装できることを本当に感謝しています。ありがとう。
相関性の高いデータがいくつかあります。線形回帰を実行すると、勾配が1(= 0.93)に近い回帰直線が得られます。私がやりたいのは、この勾配が1.0と大きく異なるかどうかをテストすることです。私の期待はそうではないということです。言い換えると、線形回帰の帰無仮説をゼロの勾配から1の勾配に変更したいのです。これは賢明なアプローチですか?また、回答にRコードを含めて、このメソッド(または、より良い方法を提案する)を実装できることを本当に感謝しています。ありがとう。
回答:
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
summary(lm(y ~ x)) # original model
summary(lm(y ~ x, offset= 1.00*x)) # testing against slope=1
summary(lm(y-x ~ x)) # testing against slope=1
出力:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.75
x 0.91424 0.04128 22.148 1.64e-14 ***
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.7497
x -0.08576 0.04128 -2.078 0.0523 .
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.01532 0.04728 0.324 0.7497
x -0.08576 0.04128 -2.078 0.0523 .
仮説は、として表現できます。は回帰係数で、は制限がの制限行列です。モデルがβ R R
仮説場合、 およびです。、R = [ 0 、1 ] R = 1
これらのタイプの仮説ではlinearHypothesis
、パッケージcarの関数を使用できます。
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2) # generate correlated data
mod <- lm(y ~ x)) # original model
> linearHypothesis(mod,matrix(c(0,1),nrow=1),rhs=c(1))
Linear hypothesis test
Hypothesis:
x = 1
Model 1: restricted model
Model 2: y ~ x
Res.Df RSS Df Sum of Sq F Pr(>F)
1 19 0.96022
2 18 0.77450 1 0.18572 4.3162 0.05234 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
帰無仮説を拒否しようとしているようです。それには多くの問題がありますが、少なくとも1とは違うことを確認するのに十分な力がない可能性があるということです。それは、傾きが0.07 1.しかし、実際に伝えることができない場合はどうなりますか?大幅に変化する勾配を実際に推定しており、実際には1からかなり離れている場合があり、信頼区間は±0.4のようになります。ここでの最善の戦術は、帰無仮説を変更するのではなく、実際に区間推定について合理的に話すことです。モデルにコマンドconfint()を適用すると、傾斜の周りで95%の信頼区間を得ることができます。次に、これを使用して、取得したスロープを議論できます。1が信頼区間内にある場合、真の値を含む可能性が高いと思われる値の範囲内にあると述べることができます。しかし、もっと重要なのは、その値の範囲が何であるかを述べることもできます。
テストのポイントは、帰無仮説を確認せずに拒否することです。有意差がないという事実は、有意差がないことの証明ではありません。そのためには、nullを拒否するのに妥当と思われるエフェクトサイズを定義する必要があります。
set.seed(20); y = rnorm(20); x = y + rnorm(20, 0, 0.2)
model <- lm(y~x)
coefx <- coef(summary(model))[2,1]
seslope <- coef(summary(model))[2,2]
DF <- model$df.residual
# normal test
p <- (1 - pt(coefx/seslope,DF) )*2
# test whether different from 1
p2 <- (1 - pt(abs(coefx-1)/seslope,DF) )*2
ここで、違いが顕著になるエフェクトのサイズが
> qt(0.975,DF)*seslope
[1] 0.08672358
勾配の標準誤差の適切な推定量があれば。したがって、0.1からのみ有意差を検出する必要があると判断した場合、次のように必要なDFを計算できます。
optimize(
function(x)abs(qt(0.975,x)*seslope - 0.1),
interval=c(5,500)
)
$minimum
[1] 6.2593
気を付けてください。これは、セロープの推定値にかなり依存しています。セロープのより良い推定値を得るには、データのリサンプリングを行うことができます。素朴な方法は次のとおりです。
n <- length(y)
seslope2 <-
mean(
replicate(n,{
id <- sample(seq.int(n),1)
model <- lm(y[-id]~x[-id])
coef(summary(model))[2,2]
})
)
seslope2を最適化関数に入れて、以下を返します。
$minimum
[1] 6.954609
これはすべて、データセットが必要と考えるよりも速く重要な結果を返すこと、および有意ではないことを望むことを確実にしたい場合は7自由度(この場合は9回の観測)のみが必要であることを伝えます手段。