Làm thế nào để so sánh dữ liệu thử nghiệm lâm sàng với kiểm soát lịch sử tự nhiên


8

Bối cảnh: Tôi muốn tìm hiểu cách phân tích dữ liệu từ các thử nghiệm lâm sàng với kiểm soát lịch sử tự nhiên, nghĩa là một thử nghiệm lâm sàng trong đó một nhóm người (giả sử, những người có nguy cơ di truyền bệnh) được tuyển dụng, tất cả đều được điều trị một loại thuốc, và sự sống sót của họ (giả sử, tuổi khởi phát bệnh hoặc tử vong do bệnh này) được so sánh với sự sống sót của các biện pháp kiểm soát lịch sử không được điều trị với cùng nguy cơ di truyền.

Trước khi bắt đầu, tôi chỉ muốn thừa nhận rằng tôi đã đọc các tài liệu Hướng dẫn của FDA (ví dụ: Bệnh hiếm gặp: Các vấn đề phổ biến trong phát triển thuốc ) liên quan đến chủ đề này và tôi biết rằng có nhiều loại sai lệch có thể tự nhiên so sánh lịch sử và rằng, vì lý do này, FDA chỉ hiếm khi chấp nhận các thử nghiệm như bằng chứng về hiệu quả của thuốc, thay vào đó thường coi các thử nghiệm ngẫu nhiên là bằng chứng mạnh mẽ hơn nhiều. Câu hỏi làm thế nào để xác định liệu một đoàn hệ lịch sử tự nhiên có thể được so sánh một cách công bằng với một đoàn hệ tương lai được điều trị bằng thuốc hay không là một câu hỏi quan trọng và phức tạp. Nhưng đó không phải là chủ đề của câu hỏi của tôi ngày hôm nay. Thay vào đó, tôi thấy rằng tôi đang bối rối về một câu hỏi đơn giản hơn nhiều, đó là câu hỏi nếumột đoàn hệ lịch sử tự nhiên được coi là có thể so sánh và không thiên vị, v.v., vậy thì, theo cách thống kê, người ta sẽ làm gì để so sánh?

Vì vậy, đây là một kịch bản.

  • Để đơn giản, giả sử bệnh của tôi có một nguyên nhân di truyền, được biết đến và những người có kiểu gen này hoàn toàn khỏe mạnh cho đến một độ tuổi nào đó, và sau đó họ đột nhiên bị bệnh nặng. Độ tuổi khởi phát bệnh rất khác nhau và nguy cơ thay đổi theo chức năng của tuổi. Mọi người trong mọi tập dữ liệu được mô tả dưới đây đều có kiểu gen gây bệnh này.
  • Trong tập dữ liệu A, tôi có dữ liệu về những người trong một thử nghiệm lâm sàng giả định. Họ đăng ký ở một độ tuổi ( starting_age), được điều trị bằng thuốc và được theo dõi một khoảng thời gian khác nhau cho đến khi ở tuổi thứ hai ( last_age) khi họ bị bệnh ( event == 1) hoặc rút khỏi thử nghiệm ( event == 0).
  • Trong một kịch bản "lý tưởng lý tưởng", có lẽ đoàn hệ lịch sử tự nhiên sẽ là một số lượng lớn người có kiểu gen này, theo dõi từ khi sinh ra cho đến khi họ chết vì căn bệnh này hoặc vì một nguyên nhân không liên quan. Đó là loại dữ liệu không tồn tại. Thay vào đó, hãy xem xét hai lựa chọn khả thi cho đoàn hệ lịch sử tự nhiên có thể là gì (B và C) ...
  • Trong tập dữ liệu B, tôi có dữ liệu về những người đăng ký vào nghiên cứu tiền cứu ở một độ tuổi ngẫu nhiên ( starting_age), không được điều trị bằng bất kỳ loại thuốc nào và chỉ được theo dõi trong một khoảng thời gian khác nhau cho đến khi họ ở tuổi thứ hai ( last_age) bị bệnh ( event == 1) hoặc rút khỏi nghiên cứu ( event == 0). Phân phối độ tuổi bắt đầu và số năm theo dõi không thể được giả định để tuân theo các phân phối giống như trong tập dữ liệu A.
  • Trong tập dữ liệu C, tôi có dữ liệu hồi cứu hoàn toàn; ở đây không có theo dõi trong tương lai. Chúng tôi chỉ đơn giản là quan sát mỗi người một lần. Một số người được quan sát thấy bị bệnh ở một độ tuổi cụ thể ( ageevent == 1) trong khi những người khác được nhìn thấy vẫn khỏe mạnh ở một độ tuổi cụ thể ( ageevent == 0).

Nếu tôi hiểu thuật ngữ chính xác, dữ liệu trong A và B sẽ được coi là cắt ngắn và kiểm duyệt phải; dữ liệu trong C sẽ chỉ được coi là kiểm duyệt đúng. Theo các thuật ngữ được sử dụng trong Cain 2011 , tôi tin rằng tập dữ liệu B là một "đoàn hệ phổ biến" trong khi tập dữ liệu C là một "đoàn hệ sự cố".

Câu hỏi của tôi là:

  1. Làm thế nào (nếu có thể) người ta có thể xây dựng một hàm sống sót (hoặc một hàm nguy hiểm, v.v.) cho tập dữ liệu A hoặc B, với điều kiện là dữ liệu bị cắt ngắn ở các độ tuổi khác nhau cho mỗi cá nhân?
  2. Thử nghiệm thống kê nào (hoặc phương pháp bootstrapping) sẽ được sử dụng để kiểm tra xem những người trong bộ dữ liệu A có tồn tại lâu hơn đáng kể hay có nguy cơ thấp hơn đáng kể so với những người trong B hoặc C không?
  3. Nếu tất cả những gì bạn có là tập dữ liệu B hoặc C và bạn muốn ước tính sức mạnh thống kê của một thử nghiệm lâm sàng nhất định với N cá nhân cho một tỷ lệ nguy hiểm nhất định, bạn sẽ làm thế nào về nó?
  4. (Câu hỏi thưởng) nếu mọi người cũng có các đột biến gen khác nhau liên quan đến các mối nguy hiểm khác nhau theo chức năng của tuổi tác, bạn sẽ kết hợp biến đó vào các câu trả lời ở trên như thế nào?

Một số điều tôi đã thử cho đến nay:

  • Tôi đã xem xét thống kê Z của Flora [ Flora 1978 ] mà một số người đã áp dụng trong các tình huống tương tự, nhưng tôi lo ngại rằng nó không tính đến phương sai lấy mẫu trong đoàn hệ lịch sử tự nhiên được sử dụng làm tài liệu tham khảo.
  • Tôi đã tìm ra một vài cách kết hợp khác nhau như phân tích tỷ lệ sống sót với các lần cắt ngắn khác nhau và tìm thấy một số trang thảo luận về các vấn đề tương tự, chẳng hạn như Phân tích sống sót: Dữ liệu bị cắt ngắn , Sống sót cắt ngắn bằng PROC PHREG , nhưng những điều này không giải thích được cơ bản toán của giải pháp của họ.
  • Cuối cùng tôi đã đến Cain 2011 để thảo luận chi tiết về vấn đề này và, một cách hữu ích, có mã R để xử lý cắt ngắn bên trái trong phần bổ sung . Họ đã thực hiện chức năng riêng của mình cho một MLE kết hợp cắt ngắn bên trái, nhưng yêu cầu là cắt ngắn bên trái có thể được xử lý trong mô hình mối nguy theo tỷ lệ Cox bằng cách sử dụng chức năng được tích hợp trong survivalthư viện R , coxph(Surv(time=agestart,time2=x,event=cx,type='counting')~bmi). Ở đây, một Survđối tượng được tạo ra bằng cách sử dụng timeđộ tuổi bắt đầu và time2độ tuổi eventđã hoặc không xảy ra. Điều đó nghe có vẻ hợp lý, mặc dù tệp trợ giúp Survkhông giải thích những gì nó thực sự đang làm ở đây - ví dụ như nó không giải thích những gì countingmô hình đòi hỏi. Tôi chuyển sang survivalhướng dẫnvà, như một tài liệu tham khảo cho counting, đã chỉ ra Andersen & Gill 1982 , điều này lần lượt qua đầu tôi một chút và dường như không thảo luận về việc cắt ngắn bên trái, hoặc ít nhất là không phải bằng tên đó. Một điểm đặc biệt là mô hình "đếm" dường như được xây dựng để phù hợp với các trường hợp trong đó một cá nhân có thể có nhiều sự kiện trong đời, đó không phải là trường hợp trong ví dụ của tôi, nhưng có lẽ điều đó không thành vấn đề.
  • Dựa trên những điều trên, có vẻ như mô hình "đếm" Cox có thể là cách phù hợp để so sánh tập dữ liệu A với B và tôi đã có thể thực hiện so sánh như vậy trong R (xem mã bên dưới) mặc dù tôi vẫn đang cố gắng để hiểu liệu Tôi đang làm điều đúng đắn ở đây, và tôi không chắc làm thế nào (nếu có) cách tiếp cận như vậy có thể được áp dụng để so sánh tập dữ liệu A với C.
  • Cuối cùng, tôi đã tìm kiếm Xác thực chéo để rút ngắn thời gian sống sót và tìm thấy một số lượng lớn các trường hợp mà mọi người đã hỏi những câu hỏi tương tự như tôi đang hỏi ( 1 , 2 , 3 , 4 , 4 , 5 , 6 , 7 ) nhưng hầu hết đều không được trả lời; một cái chỉ vào tài liệu tham khảo của Cain ở trên và một cái khác chỉ vào Klein & Moeschberger 2003 điều này rất hữu ích (xem ví dụ 123 và trang 312) và dường như ủng hộ quan điểm rằng A và B có thể được so sánh bằng cách sử dụng phương pháp Cox khá đơn giản, mặc dù nó không giải quyết được sự so sánh giữa A với C, cũng như câu hỏi tính toán công suất (mặc dù, nếu câu hỏi kiểm tra thống kê được trả lời, có lẽ tôi có thể có được sức mạnh với một số bootstrapping).

Dưới đây là một số dữ liệu giả thuyết trong R minh họa kịch bản này. Tôi đã bao gồm 20 hàng cho mỗi tập dữ liệu, mặc dù trong trường hợp có vấn đề, trong kịch bản đời thực tôi đang tưởng tượng, bộ dữ liệu A và B có thể theo thứ tự 50 hoặc 100 bệnh nhân và tập dữ liệu C có thể theo thứ tự 500 hoặc 1.000 bệnh nhân.

# A) hypothetical data from clinical trial
data_a = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
1|33|42|0
2|45|49|0
3|47|52|1
4|30|34|0
5|37|44|0
6|34|37|0
7|29|34|0
8|58|66|0
9|58|60|0
10|66|75|0
11|37|41|0
12|37|46|0
13|58|62|0
14|44|48|1
15|45|50|0
16|56|65|0
17|54|63|0
18|36|41|0
19|47|55|1
20|45|55|0
"))

# B) hypothetical data from a prospective natural history study
data_b = read.table(sep='|',header=T,textConnection("
indiv_id|starting_age|last_age|event
101|19|28|0
102|39|52|0
103|38|41|1
104|18|27|0
105|20|24|0
106|16|20|0
107|39|41|0
108|48|50|0
109|40|50|0
110|38|41|1
111|40|43|1
112|26|29|0
113|37|39|0
114|21|30|0
115|36|41|1
116|46|48|0
117|27|32|0
118|26|29|0
119|29|38|0
120|47|58|0
"))


# C) hypothetical data from a retrospective natural history study
data_c = read.table(sep='|',header=T,textConnection("
indiv_id|age|event
201|43|1
202|53|1
203|64|1
204|45|1
205|88|1
206|70|1
207|66|1
208|55|1
209|51|1
210|48|1
211|63|1
212|36|0
213|61|0
214|63|1
215|63|1
216|57|1
217|74|0
218|63|1
219|59|1
220|57|1
"))


# one possible approach to compare A and B using Cox counting model
data_a$drug = TRUE
data_b$drug = FALSE
nh_compare = rbind(data_a, data_b)
m = survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)
summary(m)
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

Lưu ý cuối cùng: vì danh tiếng 10 là bắt buộc để đăng> 2 liên kết trên Xác thực chéo, tôi đã xóa tất cả (nhiều) siêu liên kết nên xuất hiện trên. Một phiên bản của bài đăng này với các liên kết có sẵn trên blog của tôi và tôi sẽ cập nhật bài đăng này để bao gồm các liên kết nếu hoặc khi tôi được phép làm như vậy. Cập nhật: cảm ơn mọi người đã ủng hộ! Bây giờ tôi có danh tiếng> 10 và đã cập nhật bài đăng này để bao gồm các liên kết.


Khi bạn nói "rút khỏi thử nghiệm" trong câu hỏi của mình, việc rút tiền chỉ đơn giản là đại diện cho việc kết thúc thu thập dữ liệu cho thử nghiệm hay là do tác dụng phụ không được chấp nhận, v.v. Ngoài ra, trong Bộ dữ liệu A của bạn, có bao nhiêu có sự kiện nào không?
EdM

@EdM Tôi nghĩ tất cả những điều trên. Rút tiền có thể bao gồm kết thúc thử nghiệm, rút ​​tiền sự kiện bất lợi, tử vong do các nguyên nhân không liên quan và những người mất quyền lợi vì bất kỳ lý do nào (bao gồm cả không xác định / mất để theo dõi). Để đơn giản mặc dù tôi nghĩ rằng chúng ta có thể giả định một cách hợp lý rằng việc rút tiền không phụ thuộc vào kết quả của sự quan tâm (nghĩa là việc rút tiền không được kích hoạt bởi sự khởi phát của bệnh). Đối với tập dữ liệu A, tôi đoán nó phụ thuộc vào tỷ lệ nguy hiểm. Nếu thuốc rất hiệu quả, có thể không có sự kiện. Nếu câu hỏi của bạn là có bao nhiêu sự kiện cho mỗi người, thì câu trả lời là mỗi người có thể có nhiều nhất một sự kiện.
ericminikel

đó là một câu hỏi dài bạn có chắc là nó không thể được chia thành các câu hỏi nhỏ hơn không? theo cách đó, những người không theo ngành dịch tễ học có thể kêu vang
Aksakal

Câu trả lời:


3

Nhiều năm sau, tôi đã đi đến một câu trả lời thỏa đáng. Điều này thực sự hóa ra là sử dụng mô hình đếm rủi ro theo tỷ lệ Cox , cho phép bạn tính đến các thời gian cắt ngắn khác nhau (độ tuổi mà bạn bắt đầu theo dõi các cá nhân) ngoài các thời gian kiểm duyệt phải khác nhau. Như đã lưu ý trong câu hỏi, điều này được thực hiện trong R trong hàm survivalgói coxph, timethời gian cắt ngắn ở đâu,time2 là thời gian kiểm duyệt phải, eventlà những gì đã xảy ra ở thời điểm bên phải và bạn sử dụng type='counting'để chỉ định mô hình đếm Cox .

Các câu trả lời cho các câu hỏi cụ thể được nêu trong bài viết của tôi là:

1. Sự sống còn thực sự có thể được tính toán với survfit - mô hình tính toán làm thế nào số lượng cá nhân có nguy cơ có thể tăng trưởng và co lại theo thời gian khi mọi người đi vào và thoát khỏi độ tuổi mà họ được theo dõi. Một ví dụ cho bộ dữ liệu đồ chơi được đăng ở trên sẽ làplot(survfit(Surv(time=starting_age,time2=last_age,event=event,type='counting')~1, data=data_a))

2. Mô hình có thể so sánh dữ liệu triển vọng cắt ngắn bên trái và dữ liệu hồi cứu không cắt ngắn, nếu bạn chỉ đơn giản cho rằng dữ liệu hồi cứu tương đương với những người theo dõi từ khi sinh ra. Giả định này có thể không hoàn hảo nhưng đây là một hạn chế cố hữu của bộ dữ liệu mà không có mô hình nào có được xung quanh. Mã ví dụ cho bộ dữ liệu đồ chơi ở trên sẽ là:

data_c$starting_age = 0
data_c$last_age = data_c$age
data_c$drug = FALSE
nh_compare = rbind(data_a, data_c[,c('indiv_id','starting_age','last_age','event','drug')])
coxph(Surv(time=starting_age,time2=last_age,event=event,type='counting')~drug, data=nh_compare)

3. Dường như không có tính toán công suất dạng đóng, thay vào đó chúng tôi đã thực hiện điều này bằng cách bootstrapping. Mã của chúng tôi để làm điều này cho bộ dữ liệu cụ thể của chúng tôi xuất hiện ở đây .

4. coxphcho phép đồng biến, vì vậy, ví dụ trong mã của chúng tôi, chúng tôi đã sử dụng coxph(Surv(time=ascertainment_age,time2=surv_age,event=surv_status,type='counting')~asc+family_mutation,data=prore)ở đâufamily_mutation là một covariate.

Chúng tôi đã xuất bản một bài báo sử dụng phương pháp này để tính toán sức mạnh cho các thử nghiệm lâm sàng dự phòng trong bệnh prion di truyền. Bạn có thể đọc chi tiết về bioRxiv và mã R của chúng tôi hoàn toàn nằm trong một repo GitHub công khai:

https://github.com/ericminikel/prnp_onset/

Trích dẫn:

Minikel EV, Vallabh SM, MC Orseth, Brandel JP, Haïk S, Laplanche JL, Zerr I, Parchi P, Capellari S, Safar J, Kenny J, Fong JC, Takada LT, Ponto C, Hermann P, Knipper T, Stehmann , Kitamoto T, Ae R, Hamaguchi T, Sanjo N, Tsukamoto T, Mizusawa H, Collins SJ, Chiesa R, Roiter I, de Pedro-Cuesta J, Calero M, Geschwind MD, Yamada M, Nakamura Y, Mead S. Age khởi phát trong bệnh prion di truyền và thiết kế các thử nghiệm lâm sàng dự phòng . Thần kinh . 2019 ngày 6 tháng 6. pii: 10.1212 / WNL.0000000000007745. doi: 10.1212 / WNL.0000000000007745. PubMed PMID: 31171647.


1

Eric, nói rộng ra, vấn đề của bạn nghe có vẻ nghiêm trọng đến mức việc tìm kiếm các giải pháp ngoài luồng có vẻ sai lầm. Thay vào đó, bạn gần như chắc chắn cần phải nhờ đến mô hình bespoke để khai thác kiến ​​thức miền đặc biệt của bạn về sinh lý bệnh của bệnh. Trừ khi bạn sử dụng phương pháp mô hình hóa cho phép bạn mang theo kiến ​​thức như vậy, bạn sẽ không có cơ hội chống lại "đối thủ" đáng gờm mà bạn đang đối mặt!

Bước đầu tiên tốt nhất của bạn có thể là tìm ra "kiến thức tên miền đặc biệt" mà bạn thực sự sở hữu. Bạn có thể mô phỏng các quá trình đó tạo ra dữ liệu của bạn (ví dụ, các quá trình dữ liệu tạo hoặc DGP ), bao gồm (trái cắt ngắn) quá trình quản lý việc nhập của các cá nhân vào tập hợp dữ liệu của bạn? Khi bạn có thể mô phỏng DGP, các phương thức Bayes sẽ cho phép bạn 'thách thức' mô hình mô phỏng của bạn với dữ liệu, ví dụ, để ước tính các tham số của mô hình. Mặc dù có Odd Aalen của vây de siècle hoài nghi về phương pháp Bayesian để phân tích tồn tại [1], tôi lưu ý rằng bây giờ có ít nhất một văn bản trên cách tiếp cận như vậy [2].

Nếu tôi phải đối mặt với một vấn đề như vậy, trước tiên tôi sẽ có xu hướng khám phá nó thông qua mô phỏng và suy luận Bayes. Có lẽ tôi sẽ học đủ trong quy trình đó để hình thành các mô hình quy trình đơn giản hơn có thể mang lại các phương pháp ước lượng thường xuyên truyền thống hơn. Sự tương tác giữa các mô hình đơn giản hơn và mô phỏng phong phú hơn thực sự có thể mang lại các hình thức hiểu biết và hiểu biết có giá trị của riêng nó.

Tôi hy vọng bạn cuối cùng sẽ cập nhật tất cả chúng tôi ở đây về cách tiếp cận cuối cùng bạn áp dụng, và cách nó hoạt động!

  1. Aalen OO. Thống kê y tế - không có thời gian cho sự tự mãn. Phương pháp thống kê Med Res. 2000; 9 (1): 31-40. doi: 10.1177 / 096228020000900105 .

  2. Phân tích sinh tồn của Ibrahim JG, Chen MH, Sinha D. Bayesian. New York: Mùa xuân; 2010.

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.