Phân tích sức mạnh cho hồi quy logistic thường


Câu trả lời:


27

Tôi thích làm phân tích sức mạnh vượt ra ngoài những điều cơ bản bằng mô phỏng. Với các gói có sẵn, tôi không bao giờ chắc chắn những giả định nào đang được thực hiện.

Mô phỏng cho sức mạnh là khá đơn giản (và giá cả phải chăng) bằng cách sử dụng R.

  1. quyết định những gì bạn nghĩ dữ liệu của bạn sẽ trông như thế nào và bạn sẽ phân tích nó như thế nào
  2. viết một hàm hoặc tập hợp các biểu thức sẽ mô phỏng dữ liệu cho một mối quan hệ và cỡ mẫu nhất định và thực hiện phân tích (một hàm thích hợp hơn là bạn có thể biến kích thước và tham số mẫu thành các đối số để dễ dàng thử các giá trị khác nhau). Hàm hoặc mã phải trả về giá trị p hoặc thống kê kiểm tra khác.
  3. sử dụng replicatechức năng để chạy mã từ trên một loạt lần (tôi thường bắt đầu khoảng 100 lần để có cảm giác mất bao lâu và để có được khu vực chung phù hợp, sau đó tăng lên 1.000 và đôi khi 10.000 hoặc 100.000 cho giá trị cuối cùng mà tôi sẽ sử dụng). Tỷ lệ số lần bạn từ chối giả thuyết khống là sức mạnh.
  4. làm lại ở trên cho một tập hợp các điều kiện.

Đây là một ví dụ đơn giản với hồi quy thứ tự:

library(rms)

tmpfun <- function(n, beta0, beta1, beta2) {
    x <- runif(n, 0, 10)
    eta1 <- beta0 + beta1*x
    eta2 <- eta1 + beta2
    p1 <- exp(eta1)/(1+exp(eta1))
    p2 <- exp(eta2)/(1+exp(eta2))
    tmp <- runif(n)
    y <- (tmp < p1) + (tmp < p2)
    fit <- lrm(y~x)
    fit$stats[5]
}

out <- replicate(1000, tmpfun(100, -1/2, 1/4, 1/4))
mean( out < 0.05 )

6
NNN

2
@gung: bình luận của bạn có ý nghĩa, bạn có phiền khi thêm mã của mình để những người ít kinh nghiệm hơn trong R cũng có thể hưởng lợi từ nó không? cảm ơn

1
Tôi đang xem xét lại điều này và tôi có một vài câu hỏi: 1) Tại sao x đồng phục vào 1:10? 2) Làm thế nào bạn có thể khái quát nó thành nhiều hơn một biến độc lập?
Peter Flom - Tái lập Monica

1
@PeterFlom, x phải là một cái gì đó, vì vậy tôi đã chọn (tùy ý) để có đồng nhất trong khoảng từ 0 đến 10, nó cũng có thể là bình thường, gamma, v.v. Tốt nhất là chọn một thứ tương tự như những gì chúng ta mong đợi x biến để trông như thế nào. Để sử dụng nhiều hơn 1 biến dự đoán, hãy tạo chúng một cách độc lập (hoặc từ một biến số thông thường, copula, v.v.), sau đó chỉ cần đưa tất cả chúng vào phần eta1, vd eta1 <- beta0 + beta1*x1 + beta2*x2 + beta3*x3.
Greg Snow

1
@ABC, không sao chép sẽ chỉ cung cấp cho bạn một quyết định duy nhất, bạn cần sao chép để xác định tần suất kiểm tra từ chối (định nghĩa về sức mạnh). replicatekhông có trong chức năng và không sửa đổi. Hàm trả về giá trị p (giá trị phù hợp với $ stats [5]) cho một lần lặp, sao chép chạy hàm 1.000 lần (hoặc bất kỳ số nào bạn chỉ định) và trả về 1.000 giá trị p, meansau đó hàm sẽ tính tỷ lệ các xét nghiệm sẽ từ chối null tạiα= =0,05.
Greg Snow

3

Tôi sẽ thêm một điều nữa vào câu trả lời của Snow (và điều này áp dụng cho bất kỳ phân tích sức mạnh nào thông qua mô phỏng) - chú ý xem bạn có đang tìm kiếm thử nghiệm 1 hoặc 2 đuôi hay không. Các chương trình phổ biến như G * Power mặc định cho kiểm tra 1 đuôi và nếu bạn đang cố gắng xem liệu mô phỏng của mình có khớp với chúng không (luôn luôn là một ý tưởng hay khi bạn học cách làm điều này), trước tiên bạn sẽ muốn kiểm tra xem.

Để làm cho Snow chạy thử nghiệm 1 đuôi, tôi sẽ thêm một tham số gọi là "đuôi" vào các đầu vào hàm và đặt một cái gì đó như thế này vào chính hàm:

 #two-tail test
  if (tail==2) fit$stats[5]

  #one-tail test
  if (tail==1){
    if (fit$coefficients[5]>0) {
          fit$stats[5]/2
    } else 1

Phiên bản 1 đuôi về cơ bản kiểm tra xem hệ số có dương không, và sau đó giảm giá trị p xuống một nửa.


2

Bên cạnh ví dụ tuyệt vời của Snow, tôi tin rằng bạn cũng có thể thực hiện mô phỏng sức mạnh bằng cách lấy mẫu lại từ bộ dữ liệu hiện có có tác dụng của bạn. Không hẳn là một bootstrap, vì bạn không lấy mẫu thay thế cùng n , nhưng cùng một ý tưởng.

Vì vậy, đây là một ví dụ: Tôi đã thực hiện một thử nghiệm bản thân nhỏ trong một ước tính điểm tích cực nhưng vì nó rất nhỏ, gần như không có ý nghĩa thống kê trong hồi quy logistic thông thường. Với ước tính điểm đó, tôi cần bao nhiêu n ? Đối với nhiều càng tốt n , tôi nhiều lần tạo ra một tập dữ liệu & chạy hồi quy logistic thứ tự & cưa nhỏ như thế nào p -giá trị là:

library(boot)
library(rms)
npt <- read.csv("http://www.gwern.net/docs/nootropics/2013-gwern-noopept.csv")
newNoopeptPower <- function(dt, indices) {
    d <- dt[sample(nrow(dt), n, replace=TRUE), ] # new dataset, possibly larger than the original
    lmodel <- lrm(MP ~ Noopept + Magtein, data = d)
    return(anova(lmodel)[7])
}
alpha <- 0.05
for (n in seq(from = 300, to = 600, by = 30)) {
   bs <- boot(data=npt, statistic=newNoopeptPower, R=10000, parallel="multicore", ncpus=4)
   print(c(n, sum(bs$t<=alpha)/length(bs$t)))
}

Với đầu ra (đối với tôi):

[1] 300.0000   0.1823
[1] 330.0000   0.1925
[1] 360.0000   0.2083
[1] 390.0000   0.2143
[1] 420.0000   0.2318
[1] 450.0000   0.2462
[1] 480.000   0.258
[1] 510.0000   0.2825
[1] 540.0000   0.2855
[1] 570.0000   0.3184
[1] 600.0000   0.3175

Trong trường hợp này, tại n = 600, công suất là 32%. Không đáng khích lệ lắm.

(Nếu cách tiếp cận mô phỏng của tôi là sai, xin vui lòng ai đó cho tôi biết. Tôi sẽ gửi một vài bài báo y tế thảo luận về mô phỏng sức mạnh để lập kế hoạch thử nghiệm lâm sàng, nhưng tôi không chắc chắn về việc thực hiện chính xác của mình.)


0

Đề cập đến mô phỏng đầu tiên (được đề xuất bởi Snow; /stats//a/22410/231675 ):

Tôi vẫn không chắc mô phỏng sẽ như thế nào với nhiều biến độc lập hơn (cụ thể là ba). Tôi hiểu rằng tôi nên 'bao gồm tất cả chúng trong phần eta1, ví dụ eta1 <- beta0 + beta1 * x1 + beta2 * x2 + beta3 * x3' '(như đã đề cập ở trên). Nhưng tôi không biết làm thế nào để điều chỉnh phần còn lại của các tham số trong hàm. Ai đó có thể giúp tôi với điều này?


1
Tôi nghĩ bạn sẽ nhận được phản hồi tốt hơn nếu bạn hỏi một câu hỏi mới với một liên kết quay lại câu hỏi này.
mdewey
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.