Doğrusal regresyonda sıfır hipotezini değiştirme


18

Oldukça ilişkili bazı verilerim var. Doğrusal bir regresyon çalıştırırsam, birine yakın bir eğime sahip bir regresyon çizgisi alırım (= 0.93). Yapmak istediğim şey, bu eğimin 1.0'dan önemli ölçüde farklı olup olmadığını test etmektir. Benim beklentim öyle değil. Başka bir deyişle, doğrusal regresyonun sıfır hipotezini sıfır eğimden bir eğime değiştirmek istiyorum. Bu mantıklı bir yaklaşım mı? Ayrıca, bu yöntemi (veya önerdiğiniz daha iyi bir tane!) Uygulayabilmeniz için cevabınıza bazı R kodlarını ekleyebilmenizi gerçekten takdir ediyorum. Teşekkürler.

Yanıtlar:


11
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

Çıktılar:

            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 .

Teşekkür ederim! Ben lm komutunu nasıl değiştireceğimi bilemedim.
Nick Crawford

O zaman "lm (y ~ x, ofset = 1.00 * x)" ile tam olarak aynı mı? Bu çıkarma, en küçük kareler için varsayımlarda veya eşzamanlılıkta sorun olmaz mı? Ben rastgele etkileri glmer (....) ile lojistik regresyon için kullanmak istiyorum. P-değerlerini elde etmek için basit ama doğru bir yönteme sahip olmak harika olurdu.
skan

İşte stats.stackexchange.com/questions/111559/… Matifou, bu yöntemin Wald testini kullanmaktan daha kötü olduğunu söylüyor.
skan

7

R,β=rβR,r

y=β0+β1x+u

β1=0R,=[0,1]r=1

Bu tür hipotezler linearHypothesisiçin paket arabadaki işlevi kullanabilirsiniz :

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 

Bu tek taraflı bir test için kullanılabilir mi?
jpmath

6

Hala boş bir hipotezi reddetmeye çalışıyorsunuz. Bununla ilgili bir sürü sorun var, en azından değil, 1'den farklı olduğunuzu görmek için yeterli gücünüz yok. 1. Peki ya gerçekten söyleyemezseniz? Peki ya çılgınca değişen bir eğimi tahmin ediyorsanız ve ± 0,4 güven aralığı gibi bir şeyle 1'den oldukça uzak olabilir. Buradaki en iyi taktiğiniz sıfır hipotezini değiştirmiyor, aslında bir aralık tahmini hakkında makul bir şekilde konuşuyor. Confint () komutunu modelinize uygularsanız, eğiminizin etrafında% 95 güven aralığı elde edebilirsiniz. Ardından, aldığınız eğimi tartışmak için bunu kullanabilirsiniz. 1 güven aralığı içindeyse, gerçek değeri içerdiğine inandığınız değerler aralığında olduğunu belirtebilirsiniz. Ancak daha da önemlisi, bu değer aralığının ne olduğunu da belirtebilirsiniz.


3

Testin amacı, sıfır hipotezinizi reddetmek, reddetmek istemenizdir. Önemli bir fark olmaması, hiçbir şekilde önemli bir farkın olmadığının kanıtı değildir. Bunun için, null değerini reddetmek için hangi efekt büyüklüğünü makul bulduğunuzu tanımlamanız gerekir.

slÖpe-1

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

Şimdi, bir farkın önemli hale geldiği etki büyüklüğünün,

> qt(0.975,DF)*seslope
[1] 0.08672358

eğimdeki standart hatanın iyi bir tahmincisine sahip olmamız koşuluyla. Bu nedenle, önemli bir farkın sadece 0.1'den tespit edilmesi gerektiğine karar verirseniz, gerekli DF'yi aşağıdaki gibi hesaplayabilirsiniz:

optimize(
    function(x)abs(qt(0.975,x)*seslope - 0.1),
    interval=c(5,500)
) 
$minimum
[1] 6.2593

Dikkat edin, bu seslope tahminine oldukça bağlıdır. Seslop hakkında daha iyi bir tahmin elde etmek için verilerinizin yeniden örneklenmesini yapabilirsiniz. Saf bir yol olurdu:

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'yi optimizasyon işlevine koyarak, şunu döndürür:

$minimum
[1] 6.954609

Tüm bunlar, veri kümenizin gerekli gördüğünüzden daha hızlı önemli bir sonuç döndüreceğini ve anlamlı olmayanın istediğinizi ifade ettiğinden emin olmak istiyorsanız sadece 7 dereceye (bu durumda 9 gözlem) ihtiyacınız olduğunu söyleyecektir. anlamına geliyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.