Làm thế nào để mô phỏng dữ liệu có ý nghĩa thống kê?


18

Tôi đang học lớp 10 và tôi đang tìm cách mô phỏng dữ liệu cho một dự án hội chợ khoa học máy học. Mô hình cuối cùng sẽ được sử dụng trên dữ liệu bệnh nhân và sẽ dự đoán mối tương quan giữa các thời điểm nhất định trong tuần và ảnh hưởng của việc này đối với việc tuân thủ thuốc trong dữ liệu của một bệnh nhân. Giá trị tuân thủ sẽ là nhị phân (0 có nghĩa là họ không dùng thuốc, 1 nghĩa là họ đã làm). Tôi đang tìm cách tạo ra một mô hình học máy có thể học hỏi từ mối quan hệ giữa thời gian trong tuần và đã tách tuần thành 21 khe thời gian, ba cho mỗi lần trong ngày (1 là sáng thứ Hai, 2 là chiều thứ hai, Vân vân.). Tôi đang tìm cách mô phỏng dữ liệu trị giá 1.000 bệnh nhân. Mỗi bệnh nhân sẽ có dữ liệu trị giá 30 tuần. Tôi muốn chèn một số xu hướng nhất định liên quan đến thời gian trong tuần và tuân thủ. Ví dụ, trong một bộ dữ liệu tôi có thể nói rằng khe thời gian 7 trong tuần có mối quan hệ có ý nghĩa thống kê với việc tuân thủ điều trị. Để tôi xác định liệu mối quan hệ có ý nghĩa thống kê hay không sẽ yêu cầu tôi thực hiện thử nghiệm hai mẫu so sánh một khe thời gian với từng khe khác và đảm bảo giá trị quan trọng nhỏ hơn 0,05.

Tuy nhiên, thay vì mô phỏng dữ liệu của riêng tôi và kiểm tra xem các xu hướng tôi chèn có đáng kể hay không, tôi thà làm việc ngược lại và có thể sử dụng một chương trình mà tôi có thể yêu cầu gán một khe thời gian nhất định theo xu hướng đáng chú ý và nó sẽ quay trở lại dữ liệu nhị phân chứa trong đó xu hướng tôi yêu cầu và dữ liệu nhị phân cho các khe thời gian khác có chứa một số nhiễu nhưng không tạo ra xu hướng có ý nghĩa thống kê.

Có chương trình nào có thể giúp tôi đạt được điều gì đó như thế này không? Hoặc có thể là một mô-đun python?

Bất kỳ trợ giúp nào (ngay cả nhận xét chung về dự án của tôi) sẽ được đánh giá cao !!


4
Đâ là một câu hỏi tuyệt vời. Và một cái gì đó như thế này là điều mà hầu hết các nhà khoa học nên làm trước khi nộp đơn xin tài trợ, trong giai đoạn thiết kế nghiên cứu. Tôi thấy quá thường xuyên rằng mọi người thu thập dữ liệu của họ trước và cố gắng tìm ra cách phân tích dữ liệu sau đó, với kết quả là nhà thống kê chỉ có thể biết thí nghiệm đã chết vì điều gì, theo lời của Ronald Fisher .
S. Kolassa - Tái lập Monica

@StephanKolassa Tuy nhiên, rất khó để lừa những dữ liệu sẽ có sẵn trong một số thí nghiệm với dữ liệu của con người, và trong bối cảnh một dữ liệu sử dụng khác mà có sẵn và không thể thu thập thêm ...
llrs

2
@llrs: Điều đó hoàn toàn chính xác. Và tất nhiên nó nên thông báo cho bài tập mô phỏng. Tốt hơn nên suy nghĩ trước về những dữ liệu có sẵn, thay vì tìm hiểu sau thí nghiệm mà dữ liệu quan trọng không thể có được.
S. Kolassa - Tái lập Monica

(+1) Tôi thấy việc bỏ phiếu để đóng câu hỏi này hơi khó chịu
Robert Long

@RobertLong, tại sao bạn nói vậy? Tôi hỏi đơn giản vì tôi muốn chắc chắn rằng tôi không bỏ sót điều gì trong câu trả lời khiến nó không đáng tin.
Neelasha Bhattacharjee

Câu trả lời:


14

Nhận xét chung

  • "Tôi đang học lớp 10 và tôi đang tìm cách mô phỏng dữ liệu cho một dự án hội chợ khoa học máy học." Tuyệt vời. Tôi hoàn toàn không quan tâm đến môn toán ở lớp 10; Tôi nghĩ rằng tôi đã lấy một cái gì đó như Đại số 2 năm đó ...? Tôi không thể đợi cho đến khi bạn đưa tôi ra khỏi một công việc trong một vài năm! Tôi đưa ra một số lời khuyên dưới đây, nhưng: Bạn đang cố gắng học được gì từ mô phỏng này? Bạn đã quen thuộc với những gì trong thống kê và học máy? Biết điều này sẽ giúp tôi (và những người khác) tập hợp một số trợ giúp cụ thể hơn.

  • Python là một ngôn ngữ rất hữu ích, nhưng tôi cho rằng R tốt hơn cho việc mô phỏng dữ liệu. Hầu hết các cuốn sách / blog / nghiên cứu / lớp học mà tôi đã bắt gặp về việc mô phỏng dữ liệu (cũng là thứ mà mọi người gọi là "phương pháp Monte Carlo" là lạ mắt) ở R. Ngôn ngữ R được các nhà thống kê gọi là "bởi các nhà thống kê, đối với các nhà thống kê, "và hầu hết các học giả giáo dục, dựa vào các nghiên cứu mô phỏng để chỉ ra các phương pháp của họ, sử dụng R. Rất nhiều chức năng tuyệt vời có trong ngôn ngữ R cơ bản (nghĩa là không có gói bổ sung nào cần thiết), như rnormcho phân phối bình thường, runifcho đồng phục phân phối, rbetacho bản phân phối beta, v.v. Trong R, nhập vào ?Distributionssẽ hiển thị cho bạn một trang trợ giúp về họ. Tuy nhiên, có nhiều gói thú vị khác như mvtnormhoặcsimstudyđó là hữu ích. Tôi muốn giới thiệu DataCamp.com cho việc học R, nếu bạn chỉ biết Python; Tôi nghĩ rằng chúng là tốt để được giới thiệu nhẹ nhàng cho mọi thứ

  • Có vẻ như bạn có nhiều thứ đang diễn ra ở đây: Bạn muốn dữ liệu theo thời gian (theo chiều dọc), bên trong chủ đề (có thể sử dụng mô hình đa cấp) và có một thành phần theo mùa cho chúng (có thể là mô hình chuỗi thời gian), tất cả đều dự đoán một kết quả phân đôi (một cái gì đó giống như hồi quy logistic). Tôi nghĩ rằng rất nhiều người bắt đầu với các nghiên cứu mô phỏng (bao gồm cả bản thân tôi) muốn ném một loạt các thứ vào cùng một lúc, nhưng điều này có thể thực sự nan giải và phức tạp. Vì vậy, những gì tôi khuyên bạn nên làm là bắt đầu với một cái gì đó đơn giản có thể tạo ra một hoặc hai chức năng để tạo dữ liệu và sau đó xây dựng từ đó.

Nhận xét cụ thể

Có vẻ như giả thuyết cơ bản của bạn là: "Thời gian trong ngày dự đoán liệu có ai đó tuân thủ việc dùng thuốc của họ hay không". Và bạn muốn hai tạo ra hai mô phỏng bộ dữ liệu: Một nơi có một mối quan hệ và một trong những nơi có không .

Bạn cũng đề cập đến dữ liệu mô phỏng để thể hiện nhiều quan sát từ cùng một người. Điều này có nghĩa là mỗi người sẽ có xác suất tuân thủ riêng cũng như, có lẽ, độ dốc của chính họ cho mối quan hệ giữa thời gian trong ngày và xác suất tuân thủ. Tôi sẽ đề nghị xem xét các mô hình hồi quy "đa cấp" hoặc "phân cấp" cho loại mối quan hệ này, nhưng tôi nghĩ bạn có thể bắt đầu đơn giản hơn thế này.

Ngoài ra, bạn đề cập đến một mối quan hệ liên tục giữa thời gian và xác suất tuân thủ chế độ dùng thuốc, điều này cũng khiến tôi nghĩ rằng mô hình chuỗi thời gian đặc biệt nhìn vào xu hướng theo mùa có thể hữu ích cho bạn. Điều này cũng có thể mô phỏng, nhưng một lần nữa, tôi nghĩ chúng ta có thể bắt đầu đơn giản hơn.

Giả sử chúng ta có 1000 người, và chúng ta đo xem họ có uống thuốc chỉ một lần hay không. Chúng tôi cũng biết nếu họ được chỉ định dùng nó vào buổi sáng, buổi chiều hoặc buổi tối. Giả sử dùng thuốc là 1, không dùng là 0. Chúng ta có thể mô phỏng dữ liệu nhị phân bằng cách sử dụng rbinomđể rút ra từ phân phối nhị thức. Chúng ta có thể đặt mỗi người có 1 quan sát với xác suất nhất định. Giả sử mọi người có khả năng dùng 80% vào buổi sáng, 50% vào buổi chiều và 65% vào ban đêm. Tôi dán mã bên dưới, với một số ý kiến ​​sau #:

set.seed(1839) # this makes sure the results are replicable when you do it
n <- 1000 # sample size is 1000
times <- c("morning", "afternoon", "evening") # create a vector of times
time <- sample(times, n, TRUE) # create our time variable

# make adherence probabilities based on time
adhere_prob <- ifelse(
  time == "morning", .80, 
  ifelse(
    time == "afternoon", .50, .65
  )
)

# simulate observations from binomial distribution with those probabilities
adhere <- rbinom(n, 1, adhere_prob)

# run a logistic regression, predicting adherence from time
model <- glm(adhere ~ time, family = binomial)
summary(model)

Tóm tắt này cho thấy, một phần:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.02882    0.10738   0.268  0.78839    
timeevening  0.45350    0.15779   2.874  0.00405 ** 
timemorning  1.39891    0.17494   7.996 1.28e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Đại Interceptdiện cho buổi chiều, và chúng ta có thể thấy rằng cả buổi tối và buổi sáng có xác suất tuân thủ cao hơn đáng kể. Có rất nhiều chi tiết về hồi quy logistic mà tôi không thể giải thích trong bài viết này, nhưng t- tests cho rằng bạn có một biến phụ thuộc phân phối bình thường có điều kiện. Các mô hình hồi quy logistic thích hợp hơn khi bạn có kết quả phân đôi (0 so với 1) như thế này. Hầu hết các sách thống kê giới thiệu sẽ nói về t- test, và rất nhiều sách học máy giới thiệu sẽ nói về hồi quy logistic. Tôi nghĩ Giới thiệu về Học thống kê: Với các ứng dụng trong R là tuyệt vời và các tác giả đã đăng toàn bộ nội dung trực tuyến:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Tôi không chắc chắn về những cuốn sách hay cho nghiên cứu mô phỏng; Tôi vừa học được từ việc loay hoay, đọc những gì người khác đã làm, và từ một khóa học sau đại học tôi đã học về máy tính thống kê (tài liệu của giáo sư ở đây: http : //pj.freefacemony.org/guides/ ).

Cuối cùng, bạn cũng có thể mô phỏng không có hiệu lực bằng cách đặt tất cả các lần có cùng xác suất:

set.seed(1839)
n <- 1000
times <- c("morning", "afternoon", "evening")
time <- sample(times, n, TRUE)
adhere <- rbinom(n, 1, .6) # same for all times
summary(glm(adhere ~ time, binomial))

Trả về:

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  0.40306    0.10955   3.679 0.000234 ***
timeevening -0.06551    0.15806  -0.414 0.678535    
timemorning  0.18472    0.15800   1.169 0.242360    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1   1

Điều này cho thấy không có sự khác biệt đáng kể giữa các thời điểm, như chúng ta mong đợi từ xác suất giống nhau qua các thời điểm.


Cảm ơn bạn rất nhiều vì lời giới thiệu cuốn sách! Chỉ cần những gì tôi cần cho kỳ nghỉ đọc!
MD-Tech

Cám ơn bạn rất nhiều về điều này. Tôi biết rằng tôi cần một mô hình hồi quy logistic cho khía cạnh học máy trong dự án của tôi, nhưng dường như nó cũng có một ứng dụng mô phỏng dữ liệu. Tuy nhiên, tôi có ấn tượng rằng hồi quy logistic đòi hỏi thứ tự của thời đại là quan trọng, nhưng trong trường hợp này không phải là trường hợp vì mỗi lần là một phạm trù khác nhau không liên quan đến nhau. Tôi đã đi đến kết luận này sau khi thảo luận với giáo viên toán của mình, nhưng cả hai chúng tôi rất có thể sai. Bạn có thể vui lòng làm rõ tại sao chính xác hồi quy logistic có thể được sử dụng ở đây?
Neelasha Bhattacharjee

@NeelashaBhattacharjee Mô phỏng dữ liệu và điều chỉnh mô hình hồi quy logistic là hai bước riêng biệt, chúng ta có thể mô phỏng cùng một dữ liệu và phân tích nó bằng bảng dự phòng và thống kê chi bình phương nếu chúng ta muốn. Bạn đúng rằng mô hình tôi phù hợp không mã hóa bất kỳ thứ tự nào trong thời gian. Tuy nhiên, các mô hình hồi quy đưa ra các giả định về cách phân phối biến phụ thuộc , không phải các biến độc lập. Chúng ta có thể đã ra lệnh cho các yếu tố dự đoán, dự đoán liên tục, dự đoán đếm, v.v., và tất cả chúng sẽ ổn cho hồi quy logistic.
Đánh dấu

@NeelashaBhattacharjee Hồi quy logistic có thể được sử dụng ở đây vì chúng ta đang mô hình hóa một biến phụ thuộc nhị phân, đó là, một với hai và chỉ hai kết quả có thể xảy ra. Điều mà một hồi quy logistic thực hiện là sử dụng "hàm liên kết logistic" để làm cho tất cả các giá trị dự đoán cho phương trình hồi quy (ví dụ: b0 + b1 * x) khớp giữa 0 và 1. Và chúng tôi gọi các số này là xác suất mà ai đó có giá trị biến phụ thuộc của 1.
Mark White

Cảm ơn bạn rất nhiều! Tuy nhiên, tôi đã tự hỏi làm thế nào bạn có thể xem xét các giá trị p giữa hai tập dữ liệu mô phỏng và xác định xem một cái có xu hướng đáng kể hay cái kia không. Đối với tôi, cả hai bộ có giá trị p khác nhau đủ để có ý nghĩa.
Neelasha Bhattacharjee

4

Nếu bạn đã biết một số Python, thì bạn chắc chắn sẽ có thể đạt được những gì bạn cần bằng cách sử dụng Python cơ bản cùng với numpyvà / hoặc pandas. Như Mark White gợi ý, rất nhiều thứ mô phỏng và liên quan đến thống kê được đưa vào R, vì vậy chắc chắn đáng xem.

Dưới đây là khung cơ bản về cách bạn có thể tiếp cận điều này bằng cách sử dụng lớp Python. Bạn có thể sử dụng np.random.normalđể điều chỉnh baseline_adherencetừng đối tượng để chèn một số nhiễu. Điều này cung cấp cho bạn một tuân thủ giả ngẫu nhiên, mà bạn có thể thêm tuân thủ giảm mục tiêu vào những ngày cụ thể.

import pandas as pd
import numpy as np

from itertools import product

class Patient:

    def __init__(self, number, baseline_adherence=0.95):
        self.number = number
        self.baseline_adherence = baseline_adherence
        self.schedule = self.create_schedule()

    def __repr__(self):
        return "I am patient number {}".format(self.number)

    def create_schedule(self):

        time_slots = []
        for (day, time) in product(range(1, 8), range(1, 4)):
            time_slots.append("Day {}; Slot {}".format(day, time))
        week_labels = ["Week {}".format(x) for x in range(1, 31)]
        df = pd.DataFrame(np.random.choice([0, 1],
                                           size=(30, 21),#1 row per week, 1 column per time slot
                                           p=(1-self.baseline_adherence, self.baseline_adherence)),
                          index=week_labels,
                          columns=time_slots
                         )
        return df

    def targeted_adherence(self, timeslot, adherence=0.8):

        if timeslot in self.schedule.columns:
            ad = np.random.choice([0, 1],
                                  size=self.schedule[timeslot].shape,
                                  p=(1-adherence, adherence)
                                 )
            self.schedule[timeslot] = ad


sim_patients = [Patient(x) for x in range(10)]
p = sim_patients[0]
p.targeted_adherence("Day 1; Slot 3")

1

Đây là một dự án tuyệt vời. Có một thách thức đối với các dự án như thế này và phương pháp sử dụng dữ liệu mô phỏng của bạn là một cách tuyệt vời để đánh giá nó.

Bạn có một giả thuyết tiên nghiệm, ví dụ "mọi người dễ quên hơn vào buổi tối"? Trong trường hợp đó, một bài kiểm tra thống kê so sánh tần suất quên vào buổi tối so với buổi sáng sẽ kiểm tra nó. Đây là một bản phân phối Bernoulli, như những người trả lời trước đã nói.

Cách tiếp cận khác là truy tìm dữ liệu của bạn để tìm ra khe thời gian nào có tỷ lệ thất bại cao nhất. Chắc chắn có một, vì vậy câu hỏi là "đây có phải là kết quả cơ hội không?". Ngưỡng cho ý nghĩa cao hơn trong trường hợp này. Nếu bạn muốn đọc về điều này, hãy tìm kiếm "tỷ lệ phát hiện sai".

Trong trường hợp của bạn, hệ thống đủ đơn giản để bạn có thể tính ngưỡng với một chút suy nghĩ. Nhưng phương pháp chung cũng có thể được sử dụng: mô phỏng 1000 bộ dữ liệu không có biến thiên tỷ lệ, sau đó tìm ra phân phối tần số của các số thấp trùng hợp. So sánh dữ liệu thực của bạn với nó. Nếu 1pm là vị trí thưa thớt trong dữ liệu thực, nhưng bộ dữ liệu mô phỏng 50/1000 có một vị trí thưa thớt như nhau, thì kết quả không mạnh mẽ.

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.