Sử dụng glm () để thay thế cho kiểm tra chi vuông đơn giản


15

Tôi quan tâm đến việc thay đổi các giả thuyết null bằng cách sử dụng glm()trong R.

Ví dụ:

x = rbinom(100, 1, .7)  
summary(glm(x ~ 1, family = "binomial"))

kiểm tra giả thuyết rằng . Điều gì xảy ra nếu tôi muốn thay đổi null thành p = một số giá trị tùy ý, bên trong ? p=0.5pglm()

Tôi biết điều này cũng có thể được thực hiện với prop.test()chisq.test(), nhưng tôi muốn khám phá ý tưởng sử dụng glm()để kiểm tra tất cả các giả thuyết liên quan đến dữ liệu phân loại.


7
+1. hiển nhiên đề cập đến tham số Binomial được biểu thị như một xác suất. Vì liên kết tự nhiên (và liên kết được sử dụng theo mặc định) là logit, để tránh nhầm lẫn, điều quan trọng là phải phân biệt p với logit của nó, đó là nhật ký tỷ lệ cược log ( p / ( 1 - p ) ) . pglmplog(p/(1p))
whuber

Câu trả lời:


19

Bạn có thể sử dụng giá trị : glmvới family="binomial"các tham số ước tính trên tỷ lệ cược log hoặc tỷ lệ logit, do đó tương ứng với tỷ lệ cược log là 0 hoặc xác suất 0,5. Nếu bạn muốn so sánh với xác suất của p , bạn muốn giá trị cơ bản là q = logit ( p ) = log ( p / ( 1 - p ) ) . Mô hình thống kê hiện nayβ0=0pq=logit(p)=log(p/(1p))

YBinom(μ)μ=1/(1+exp(η))η=β0+q

trong đó chỉ dòng cuối cùng đã thay đổi từ thiết lập tiêu chuẩn. Trong mã R:

  • sử dụng offset(q)trong công thức
  • chức năng logit / log-odds là qlogis(p)
  • hơi khó chịu, bạn phải cung cấp giá trị bù cho từng thành phần trong biến phản hồi - R sẽ không tự động sao chép giá trị không đổi cho bạn. Điều này được thực hiện dưới đây bằng cách thiết lập khung dữ liệu, nhưng bạn chỉ có thể sử dụng rep(q,100).
x = rbinom(100, 1, .7)
dd <- data.frame(x, q = qlogis(0.7)) 
summary(glm(x ~ 1 + offset(q), data=dd, family = "binomial"))

2
(+1) điều này sẽ cung cấp cho bạn bài kiểm tra Wald. Một LRT có thể được thực hiện phù hợp với mô hình null glm(y ~ offset(q)-1, family=binomial, data=dd)và sử dụng lrtesttừ lmtestgói. Kiểm tra chi bình phương của Pearson là bài kiểm tra điểm cho mô hình GLM. Wald / LRT / Điểm đều là các thử nghiệm nhất quán và sẽ cung cấp suy luận tương đương trong các cỡ mẫu hợp lý lớn.
AdamO

1
Tôi nghĩ bạn cũng có thể sử dụng anova()từ cơ sở R trên glm để có được bài kiểm tra LR
Ben Bolker

Thật thú vị, tôi đã mất thói quen sử dụng ANOVA. Tuy nhiên, tôi quan sát thấy anova từ chối in giá trị cho bài kiểm tra trong khi lrtestđó.
AdamO

2
có lẽ anova(.,test="Chisq")vậy
Ben Bolker

6

Nhìn vào khoảng tin cậy cho các thông số của GLM của bạn:

> set.seed(1)
> x = rbinom(100, 1, .7)
> model<-glm(x ~ 1, family = "binomial")
> confint(model)
Waiting for profiling to be done...
    2.5 %    97.5 % 
0.3426412 1.1862042 

Đây là khoảng tin cậy cho tỷ lệ cược log.

Với ta có log ( o d d s ) = log pp= =0,5đăng nhập(oddS)= =đăng nhậpp1-p= =đăng nhập1= =0p= =0,5 tương đương với việc kiểm tra xem khoảng tin cậy có chứa 0. Điều này không, vì vậy giả thuyết bị từ chối.

p


1
Điều này hữu ích, nhưng chỉ hoạt động để kiểm tra xem p<0,05. Nếu bạn muốn giá trị p thực tế, câu trả lời của tôi sẽ hữu ích hơn.
Ben Bolker

2
Bạn có thể yêu cầu bất kỳ mức độ tự tin trong confint. Vì vậy, nó không chỉ dành chop<0,05. Tất nhiên giải pháp của bạn tốt hơn nhiều khi tính toán giá trị p
Łukasz Deryło

2

Không đúng (hoàn toàn) chính xác / chính xác khi sử dụng các giá trị p dựa trên các giá trị z- / t trong hàm glm.summary như một bài kiểm tra giả thuyết.

  1. Đó là ngôn ngữ khó hiểu. Các giá trị được báo cáo được đặt tên là giá trị z. Nhưng trong trường hợp này, họ sử dụng sai số chuẩn ước tính thay cho độ lệch thực. Do đó trong thực tế, chúng gần với giá trị t hơn . So sánh ba kết quả đầu ra sau:
    1) Tóm tắt.glm
    2) t-test
    3) z-test

    > set.seed(1)
    > x = rbinom(100, 1, .7)
    
    > coef1 <- summary(glm(x ~ 1, offset=rep(qlogis(0.7),length(x)), family = "binomial"))$coefficients
    > coef2 <- summary(glm(x ~ 1, family = "binomial"))$coefficients
    
    > coef1[4]  # output from summary.glm
    [1] 0.6626359
    > 2*pt(-abs((qlogis(0.7)-coef2[1])/coef2[2]),99,ncp=0) # manual t-test
    [1] 0.6635858
    > 2*pnorm(-abs((qlogis(0.7)-coef2[1])/coef2[2]),0,1) # manual z-test
    [1] 0.6626359
  2. Chúng không phải là giá trị p chính xác. Một tính toán chính xác của giá trị p sử dụng phân phối nhị thức sẽ hoạt động tốt hơn (với khả năng tính toán hiện nay, đây không phải là vấn đề). Phân phối t, giả sử phân phối Gaussian của lỗi, không chính xác (nó đánh giá quá cao p, vượt quá mức alpha xảy ra ít thường xuyên hơn trong "thực tế"). Xem so sánh sau:

    # trying all 100 possible outcomes if the true value is p=0.7
    px <- dbinom(0:100,100,0.7)
    p_model = rep(0,101)
    for (i in 0:100) {
      xi = c(rep(1,i),rep(0,100-i))
      model = glm(xi ~ 1, offset=rep(qlogis(0.7),100), family="binomial")
      p_model[i+1] = 1-summary(model)$coefficients[4]
    }
    
    
    # plotting cumulative distribution of outcomes
    outcomes <- p_model[order(p_model)]
    cdf <- cumsum(px[order(p_model)])
    plot(1-outcomes,1-cdf, 
         ylab="cumulative probability", 
         xlab= "calculated glm p-value",
         xlim=c(10^-4,1),ylim=c(10^-4,1),col=2,cex=0.5,log="xy")
    lines(c(0.00001,1),c(0.00001,1))
    for (i in 1:100) {
      lines(1-c(outcomes[i],outcomes[i+1]),1-c(cdf[i+1],cdf[i+1]),col=2)
    #  lines(1-c(outcomes[i],outcomes[i]),1-c(cdf[i],cdf[i+1]),col=2)
    }
    
    title("probability for rejection as function of set alpha level")

    CDF of rejection by alpha

    Đường cong màu đen đại diện cho sự bình đẳng. Các đường cong màu đỏ là dưới nó. Điều đó có nghĩa là đối với một giá trị p được tính toán cho bởi hàm tóm tắt glm, chúng ta thấy tình huống này (hoặc chênh lệch lớn hơn) ít thường xuyên hơn trong thực tế so với giá trị p chỉ ra.


Hmm .. Tôi có thể nhầm lẫn về lý do sử dụng phân phối T cho GLM. Bạn có thể lấy một đỉnh ở một câu hỏi liên quan tôi vừa hỏi ở đây không?
AdamO

2
Câu trả lời này thú vị nhưng có vấn đề. (1) OP không thực sự hỏi về sự khác biệt giữa các cách tiếp cận dựa trên điểm số, bình phương, "chính xác" hoặc dựa trên GLM để kiểm tra các giả thuyết về phản ứng nhị thức (họ thực sự có thể biết tất cả những điều này), vì vậy điều này không ' t trả lời câu hỏi đã được hỏi; (2) các ước tính của phương sai dư, v.v. có một nhóm các giả định và phân phối lấy mẫu khác nhau từ các mô hình tuyến tính (như trong câu hỏi của @ AdamO), vì vậy việc sử dụng thử nghiệm t là điều gây tranh cãi; ...
Ben Bolker

2
(3) Khoảng tin cậy 'chính xác' cho các phản ứng nhị thức thực sự rất khó (khoảng 'chính xác' [Clopper-Wilson] là bảo thủ; các bài kiểm tra điểm có thể thực hiện tốt hơn trong một số phạm vi
Ben Bolker 29/12/17

@Ben Bạn nói đúng rằng z-test si thực sự tốt hơn so với t-test. Biểu đồ hiển thị trong câu trả lời là dành cho bài kiểm tra z. Nó sử dụng đầu ra của chức năng GLM. Điểm mấu chốt của câu trả lời của tôi là "giá trị p" là một điều khó khăn. Do đó, tôi thấy tốt hơn là tính toán nó một cách rõ ràng, ví dụ như sử dụng phân phối bình thường, thay vì trích xuất giá trị p từ hàm glm, đã được dịch chuyển rất thuận tiện với phần bù nhưng ẩn nguồn gốc của các phép tính cho giá trị p .
Sextus Empiricus

1
@BenBolker, tôi tin rằng thử nghiệm chính xác thực sự bảo thủ, nhưng ... chỉ bởi vì trong thực tế, chúng tôi không lấy mẫu từ các phân phối nhị thức hoàn hảo. Thử nghiệm z thay thế, chỉ tốt hơn từ quan điểm thực nghiệm . Đó là hai "lỗi" triệt tiêu lẫn nhau 1) phân phối nhị thức không phải là phân phối thực của phần dư trong các tình huống thực tế, 2) phân phối z không phải là biểu thức chính xác cho phân phối nhị thức. Một câu hỏi đặt ra là liệu chúng ta có nên phân phối sai cho mô hình sai hay không , chỉ vì trong thực tế, nó hóa ra 'ok'.
Sextus Empiricus
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.