การเปลี่ยนสมมติฐานว่างในการถดถอยเชิงเส้น


18

ฉันมีข้อมูลบางอย่างที่มีความสัมพันธ์สูง ถ้าฉันใช้การถดถอยเชิงเส้นฉันจะได้เส้นการถดถอยที่มีความชันใกล้กับหนึ่ง (= 0.93) สิ่งที่ฉันอยากทำคือทดสอบว่าความชันนี้แตกต่างจาก 1.0 อย่างมากหรือไม่ ความคาดหวังของฉันคือมันไม่ได้เป็น กล่าวอีกนัยหนึ่งฉันต้องการเปลี่ยนสมมติฐานว่างของการถดถอยเชิงเส้นจากความชันที่ศูนย์เป็นความชันที่หนึ่ง นี่เป็นแนวทางที่สมเหตุสมผลหรือไม่? ฉันขอขอบคุณที่คุณสามารถรวมรหัส R ในคำตอบของคุณเพื่อให้ฉันสามารถใช้วิธีนี้ (หรือดีกว่าที่คุณแนะนำ!) ขอบคุณ

คำตอบ:


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

ขาออก:

            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 .

ขอขอบคุณ! ฉันไม่สามารถหาวิธีการเปลี่ยนคำสั่ง lm
Nick Crawford

ถ้าเช่นนั้น "lm (yx ~ x)" เท่ากันคือ "lm (y ~ x, offset = 1.00 * x)" (หรือไม่มี 1.00) การแทนที่นั้นจะไม่เป็นปัญหากับสมมติฐานอย่างน้อยกำลังสองหรือกับการจับคู่กันหรือไม่ ฉันต้องการที่จะใช้สำหรับการถดถอยโลจิสติกที่มีผลกระทบแบบสุ่ม glmer (.... ) มันจะเป็นการดีถ้ามีวิธีที่เรียบง่าย แต่ถูกต้องในการรับค่า p
skan

ที่นี่stats.stackexchange.com/questions/111559/… Matifou กล่าวว่าวิธีนี้แย่กว่าการใช้ Wald the test
skan

7

Rβ=RβRR

Y=β0+β1x+ยู

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

สำหรับสมมติฐานประเภทนี้คุณสามารถใช้linearHypothesisฟังก์ชั่นจากแพ็คเกจรถยนต์ :

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 

สามารถใช้สิ่งนี้สำหรับการทดสอบด้านเดียวได้หรือไม่?
jpmath

6

ดูเหมือนว่าคุณยังคงพยายามปฏิเสธสมมติฐานว่าง มีปัญหามากมายไม่น้อยไปกว่านี้คือเป็นไปได้ที่คุณไม่มีพลังมากพอที่จะเห็นว่าคุณแตกต่างจาก 1 ดูเหมือนว่าคุณไม่สนใจว่าความชันนั้นแตกต่างจาก 0.07 หรือไม่ 1. แต่ถ้าคุณบอกไม่ได้จริงๆ ถ้าคุณประมาณความชันที่แตกต่างกันอย่างดุเดือดและอาจจะค่อนข้างไกลจาก 1 ด้วยช่วงความเชื่อมั่นที่± 0.4 ชั้นเชิงที่ดีที่สุดของคุณที่นี่ไม่ได้เปลี่ยนสมมติฐานว่าง แต่จริง ๆ แล้วพูดอย่างสมเหตุสมผลเกี่ยวกับการประมาณช่วงเวลา หากคุณใช้คำสั่ง confint () กับโมเดลของคุณคุณจะได้รับช่วงความมั่นใจ 95% รอบ ๆ ความชันของคุณ จากนั้นคุณสามารถใช้สิ่งนี้เพื่อพูดคุยเกี่ยวกับความชันที่คุณได้รับ หาก 1 อยู่ในช่วงความมั่นใจคุณสามารถระบุได้ว่าอยู่ในช่วงของค่าที่คุณเชื่อว่าน่าจะมีค่าจริง แต่ที่สำคัญคุณสามารถระบุว่าช่วงของค่านั้นคืออะไร


3

ประเด็นการทดสอบคือคุณต้องการปฏิเสธสมมติฐานว่างของคุณไม่ใช่ยืนยัน ความจริงที่ว่าไม่มีความแตกต่างอย่างมีนัยสำคัญไม่มีทางพิสูจน์การขาดความแตกต่างที่สำคัญ สำหรับสิ่งนั้นคุณจะต้องกำหนดขนาดของเอฟเฟกต์ที่คุณเห็นว่าเหมาะสมเพื่อปฏิเสธค่าว่าง

sล.โอพีอี-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

ตอนนี้คุณควรตระหนักถึงความจริงที่ว่าขนาดเอฟเฟกต์ที่แตกต่างกันมีความสำคัญคือ

> 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

ใจคุณนี่มันขึ้นอยู่กับการประมาณของ seslope เพื่อให้ได้ค่าประมาณที่ดีกว่าสำหรับ seslope คุณสามารถทำการ resampling ข้อมูลของคุณได้ วิธีที่ไร้เดียงสาจะเป็น:

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 ข้อสังเกต) หากคุณต้องการให้แน่ใจว่าสิ่งที่ไม่สำคัญคือสิ่งที่คุณต้องการ วิธี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.