Thay đổi giả thuyết null trong hồi quy tuyến tính


18

Tôi có một số dữ liệu có tương quan cao. Nếu tôi chạy hồi quy tuyến tính, tôi nhận được một đường hồi quy có độ dốc gần bằng một (= 0,93). Những gì tôi muốn làm là kiểm tra xem độ dốc này có khác biệt đáng kể so với 1.0 hay không. Kỳ vọng của tôi là nó không phải là. Nói cách khác, tôi muốn thay đổi giả thuyết khống về hồi quy tuyến tính từ độ dốc bằng 0 sang độ dốc một. Đây có phải là một cách tiếp cận hợp lý? Tôi cũng thực sự đánh giá cao nó, bạn có thể bao gồm một số mã R trong câu trả lời của mình để tôi có thể thực hiện phương pháp này (hoặc một phương pháp tốt hơn mà bạn đề xuất!). Cảm ơn.

Câu trả lời:


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

Đầu ra:

            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 .

Cảm ơn bạn! Tôi không thể tìm ra cách thay đổi lệnh lm.
Nick Crawford

Vậy thì nó có chính xác là "lm (yx ~ x)" so với "lm (y ~ x, offset = 1.00 * x)" (hoặc không có 1,00) không? Liệu nền tảng đó có phải là vấn đề với các giả định cho bình phương nhỏ nhất hoặc với cộng tuyến không? Tôi muốn sử dụng nó cho một hồi quy logistic với hiệu ứng ngẫu nhiên glmer (....). Sẽ thật tuyệt nếu có một phương pháp đơn giản nhưng chính xác để có được các giá trị p.
skan

Tại đây stats.stackexchange.com/questions/111559/ Đá Matifou nói rằng phương pháp này tệ hơn so với sử dụng Wald bài kiểm tra.
skan

7

Rβ= =rβRr

y= =β0+β1x+bạn

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

Đối với các loại giả thuyết này, bạn có thể sử dụng linearHypothesischức năng từ gói xe :

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 

Điều này có thể được sử dụng cho một bài kiểm tra một phía?
jpmath

6

Có vẻ như bạn vẫn đang cố gắng từ chối một giả thuyết khống. Có rất nhiều vấn đề với điều đó, trong đó ít nhất là có thể bạn không có đủ sức mạnh để thấy rằng bạn khác với 1. Có vẻ như bạn không quan tâm rằng độ dốc là 0,07 khác với 1. Nhưng nếu bạn không thực sự nói thì sao? Điều gì sẽ xảy ra nếu bạn thực sự ước tính độ dốc thay đổi dữ dội và thực sự có thể khá xa so với 1 với khoảng tin cậy là 0,4. Chiến thuật tốt nhất của bạn ở đây không phải là thay đổi giả thuyết khống mà thực sự nói một cách hợp lý về ước tính khoảng thời gian. Nếu bạn áp dụng lệnh confint () cho mô hình của mình, bạn có thể nhận được khoảng tin cậy 95% quanh độ dốc của mình. Sau đó, bạn có thể sử dụng điều này để thảo luận về độ dốc bạn đã nhận được. Nếu 1 nằm trong khoảng tin cậy, bạn có thể nói rằng nó nằm trong phạm vi giá trị mà bạn cho rằng có khả năng chứa giá trị thực. Nhưng quan trọng hơn là bạn cũng có thể nói phạm vi của các giá trị đó là gì.


3

Điểm kiểm tra là bạn muốn từ chối giả thuyết khống của mình, không xác nhận nó. Thực tế là không có sự khác biệt đáng kể, không có cách nào là bằng chứng cho sự vắng mặt của một sự khác biệt đáng kể. Vì thế, bạn sẽ phải xác định kích thước hiệu ứng nào bạn cho là hợp lý để từ chối null.

Stôiope-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

Bây giờ bạn nên nhận thức được thực tế rằng kích thước hiệu ứng mà sự khác biệt trở nên đáng kể, là

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

với điều kiện chúng ta có một công cụ ước tính tốt về lỗi tiêu chuẩn trên độ dốc. Do đó, nếu bạn quyết định rằng chỉ nên phát hiện sự khác biệt đáng kể từ 0,1, bạn có thể tính toán DF cần thiết như sau:

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

Tâm trí bạn, điều này khá phụ thuộc vào ước tính của vừng. Để có được ước tính tốt hơn về vừng, bạn có thể thực hiện lấy lại dữ liệu của mình. Một cách ngây thơ sẽ là:

n <- length(y)
seslope2 <-
  mean(
    replicate(n,{
      id <- sample(seq.int(n),1)
      model <- lm(y[-id]~x[-id])
      coef(summary(model))[2,2]
    })
  )

đưa seslope2 vào chức năng tối ưu hóa, trả về:

$minimum
[1] 6.954609

Tất cả điều này sẽ cho bạn biết rằng tập dữ liệu của bạn sẽ trả về một kết quả quan trọng nhanh hơn bạn thấy cần thiết và bạn chỉ cần 7 bậc tự do (trong trường hợp này là 9 quan sát) nếu bạn muốn chắc chắn rằng không quan trọng có nghĩa là những gì bạn muốn có nghĩa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.