วิธีจำลองข้อมูลให้มีนัยสำคัญทางสถิติได้อย่างไร


18

ฉันอยู่เกรด 10 และฉันต้องการจำลองข้อมูลสำหรับโครงงานวิทยาศาสตร์การเรียนรู้ของเครื่อง ตัวแบบสุดท้ายจะใช้กับข้อมูลผู้ป่วยและจะทำนายความสัมพันธ์ระหว่างช่วงเวลาของสัปดาห์และผลกระทบที่มีต่อการรับประทานยาอย่างสม่ำเสมอภายในข้อมูลของผู้ป่วยรายเดียว ค่าการยึดมั่นจะเป็นเลขฐานสอง (0 หมายถึงพวกเขาไม่ได้ทานยา 1 หมายถึงพวกเขา) ฉันกำลังมองหาที่จะสร้างรูปแบบการเรียนรู้ของเครื่องซึ่งสามารถเรียนรู้จากความสัมพันธ์ระหว่างเวลาของสัปดาห์และแยกสัปดาห์ออกเป็นช่วงเวลา 21 ช่วงเวลาสามสัปดาห์ในแต่ละวัน (1 คือเช้าวันจันทร์ 2 วันจันทร์เป็นวันจันทร์ ฯลฯ ) ฉันต้องการจำลองข้อมูลผู้ป่วย 1,000 ราย ผู้ป่วยแต่ละรายจะมีข้อมูล 30 สัปดาห์ ฉันต้องการแทรกแนวโน้มบางอย่างที่เกี่ยวข้องกับช่วงเวลาหนึ่งสัปดาห์และยึดมั่น ตัวอย่างเช่น, ในชุดข้อมูลเดียวฉันอาจพูดได้ว่าช่วงเวลา 7 ของสัปดาห์มีความสัมพันธ์อย่างมีนัยสำคัญทางสถิติกับการยึดมั่น เพื่อให้ฉันตัดสินใจได้ว่าความสัมพันธ์นั้นมีนัยสำคัญทางสถิติหรือไม่ฉันต้องทำการทดสอบสองตัวอย่าง t-test เปรียบเทียบหนึ่งช่วงเวลากับแต่ละช่วงเวลาอื่น ๆ และให้แน่ใจว่าค่านัยสำคัญน้อยกว่า 0.05

อย่างไรก็ตามแทนที่จะเลียนแบบข้อมูลของฉันเองและตรวจสอบว่าแนวโน้มที่ฉันแทรกมีความสำคัญหรือไม่ฉันจะทำงานไปข้างหลังและอาจใช้โปรแกรมที่ฉันสามารถขอให้กำหนดช่วงเวลาหนึ่งให้กับแนวโน้มที่สำคัญด้วยการยึดมั่นและจะกลับมา ข้อมูลเลขฐานสองที่บรรจุอยู่ในแนวโน้มที่ฉันขอและยังเป็นข้อมูลไบนารีสำหรับช่วงเวลาอื่น ๆ ที่มีเสียงดังบ้าง แต่ไม่ได้สร้างแนวโน้มที่มีนัยสำคัญทางสถิติ

มีโปรแกรมใดบ้างที่สามารถช่วยให้ฉันประสบความสำเร็จเช่นนี้ หรือบางทีโมดูลหลาม?

ความช่วยเหลือใด ๆ (แม้ความคิดเห็นทั่วไปในโครงการของฉัน) จะได้รับการชื่นชมอย่างมาก !!


4
นี่เป็นคำถามที่ยอดเยี่ยม และสิ่งนี้เป็นสิ่งที่นักวิทยาศาสตร์ส่วนใหญ่ควรทำก่อนที่จะยื่นขอทุนในขั้นตอนการออกแบบการศึกษา ผมเห็นไกลบ่อยเกินไปที่คนเก็บรวบรวมข้อมูลแรกของพวกเขาและพยายามที่จะคิดออกว่าจะวิเคราะห์มันหลังจากนั้นมีผลที่สถิติเท่านั้นอาจจะสามารถบอกได้ว่าการทดลองเสียชีวิตในคำพูดของโรนัลด์ฟิชเชอร์
S. Kolassa - Reinstate Monica

@StephanKolassa อย่างไรก็ตามเป็นเรื่องยากมากที่จะประเมินว่าข้อมูลใดบ้างที่จะมีในการทดลองกับข้อมูลของมนุษย์และในการตั้งค่าอื่นจะใช้ข้อมูลที่มีอยู่และไม่สามารถรวบรวมได้มากขึ้น ...
llrs

2
@llrs: ถูกต้องสมบูรณ์ และแน่นอนควรแจ้งการฝึกจำลอง ดีกว่าที่จะคิดล่วงหน้าเกี่ยวกับข้อมูลที่มีอยู่แทนที่จะค้นหาหลังจากการทดสอบว่าไม่สามารถรับข้อมูลที่สำคัญได้
S. Kolassa - Reinstate Monica

(+1) ฉันพบว่าการโหวตเพื่อปิดคำถามนี้ค่อนข้างน่ารังเกียจ
Robert Long

@ RobertLong ทำไมคุณพูดอย่างนั้นล่ะ ฉันถามเพียงเพราะฉันต้องการให้แน่ใจว่าฉันจะไม่พลาดอะไรเลยในการตอบสนองที่ทำให้มีความน่าเชื่อถือน้อยลง
Neelasha Bhattacharjee

คำตอบ:


14

ข้อคิดเห็นทั่วไป

  • "ฉันอยู่เกรด 10 และฉันต้องการจำลองข้อมูลสำหรับโครงงานวิทยาศาสตร์การเรียนรู้ของเครื่อง" น่ากลัว ฉันไม่สนใจเลยเรื่องคณิตศาสตร์ในเกรด 10; ฉันคิดว่าฉันชอบพีชคณิต 2 ในปีนั้น ... ฉันไม่สามารถรอจนกว่าคุณจะเลิกงานในอีกไม่กี่ปีข้างหน้า! ฉันให้คำแนะนำด้านล่าง แต่: คุณพยายามเรียนรู้อะไรจากการจำลองนี้? คุณคุ้นเคยกับเรื่องอะไรบ้างเกี่ยวกับสถิติและการเรียนรู้ของเครื่อง? การรู้สิ่งนี้จะช่วยฉัน (และคนอื่น ๆ ) รวบรวมความช่วยเหลือที่เฉพาะเจาะจงมากขึ้น

  • Python เป็นภาษาที่มีประโยชน์มาก แต่ฉันคิดว่า R นั้นดีกว่าสำหรับการจำลองข้อมูล หนังสือ / บล็อก / การศึกษา / ชั้นเรียนส่วนใหญ่ที่ฉันเคยเจอในการจำลองข้อมูล (รวมถึงสิ่งที่ผู้คนเรียกว่า "วิธีการมอนติคาร์โล" เพื่อความสวยงาม) อยู่ในอาร์อาร์ภาษา R เป็นที่รู้จักกันในชื่อ "และนักวิชาการส่วนใหญ่ - ที่อาศัยการศึกษาแบบจำลองเพื่อแสดงวิธีการทำงาน - ใช้อาร์ฟังก์ชั่นสุดเจ๋งมากมายอยู่ในภาษา R ฐาน (นั่นคือไม่จำเป็นต้องมีแพ็คเกจเพิ่มเติม) เช่นrnormการแจกแจงแบบปกติrunifสำหรับเครื่องแบบ การแจกจ่ายrbetaสำหรับการเผยแพร่เบต้าและอื่น ๆ ใน R การพิมพ์?Distributionsจะแสดงหน้าช่วยเหลือให้คุณ อย่างไรก็ตามมีแพ็คเกจสุดเจ๋งอื่น ๆ เช่นmvtnormหรือsimstudyที่มีประโยชน์ ฉันจะแนะนำ DataCamp.com สำหรับการเรียนรู้ R หากคุณรู้จัก Python ฉันคิดว่ามันดีสำหรับการแนะนำสิ่งต่าง ๆ เบา ๆ

  • ดูเหมือนว่าคุณจะมีอะไรมากมายเกิดขึ้นที่นี่: คุณต้องการข้อมูลที่มีอยู่ตลอดเวลา (ยาว) ภายในหัวเรื่อง (อาจใช้โมเดลหลายระดับ) และมีองค์ประกอบตามฤดูกาล (อาจเป็นแบบอนุกรมเวลา) ทำนายทั้งหมด ผลลัพธ์สองขั้ว (คล้ายการถดถอยโลจิสติก) ฉันคิดว่าผู้คนจำนวนมากเริ่มต้นด้วยการศึกษาแบบจำลอง (รวมถึงตัวเอง) ต้องการที่จะโยนสิ่งต่าง ๆ ลงในคราวเดียว แต่มันอาจเป็นเรื่องที่ยุ่งยากและซับซ้อน ดังนั้นสิ่งที่ฉันขอแนะนำให้ทำคือเริ่มจากสิ่งที่ง่าย - อาจจะสร้างฟังก์ชั่นหนึ่งหรือสองเพื่อสร้างข้อมูล - จากนั้นสร้างขึ้นจากที่นั่น

ความคิดเห็นเฉพาะ

ดูเหมือนว่าสมมติฐานพื้นฐานของคุณคือ: "เวลาของวันทำนายว่ามีใครปฏิบัติตามการใช้ยาของพวกเขาหรือไม่" และคุณต้องการสองสร้างสองจำลองข้อมูลชุดหนึ่งที่มีคือความสัมพันธ์และเป็นหนึ่งที่มีไม่ได้

คุณยังกล่าวถึงการจำลองข้อมูลเพื่อแสดงการสังเกตหลาย ๆ อย่างจากบุคคลเดียวกัน ซึ่งหมายความว่าแต่ละคนจะมีความน่าจะเป็นของการยึดมั่นเช่นเดียวกับความลาดชันของพวกเขาสำหรับความสัมพันธ์ระหว่างเวลาของวันและความน่าจะเป็นของการยึดมั่น ฉันขอแนะนำให้ดูที่โมเดลการถดถอยแบบ "หลายระดับ" หรือ "ลำดับชั้น" สำหรับความสัมพันธ์ประเภทนี้ แต่ฉันคิดว่าคุณสามารถเริ่มง่ายกว่านี้

นอกจากนี้คุณพูดถึงความสัมพันธ์อย่างต่อเนื่องระหว่างเวลาและความน่าจะเป็นที่จะยึดมั่นในระบบการใช้ยาซึ่งทำให้ฉันคิดว่าการสร้างแบบจำลองอนุกรมเวลา - โดยเฉพาะการดูแนวโน้มตามฤดูกาล - จะเป็นประโยชน์สำหรับคุณ นี่เป็นแบบจำลองที่สามารถทำได้ แต่อีกครั้งฉันคิดว่าเราสามารถเริ่มง่ายขึ้น

สมมติว่าเรามี 1,000 คนและเราวัดว่าพวกเขาทานยาเพียงครั้งเดียวหรือไม่ นอกจากนี้เรายังทราบว่าพวกเขาได้รับมอบหมายให้นำมันในตอนเช้าบ่ายหรือเย็น สมมุติว่าการทานยาคือ 1 ไม่ได้ใช้มันคือ 0 เราสามารถจำลองข้อมูลไดโคโตrbinomเมียที่ใช้สำหรับดึงจากการแจกแจงทวินาม เราสามารถตั้งให้แต่ละคนมี 1 การสังเกตด้วยความน่าจะเป็นที่ระบุ สมมติว่าผู้คนมีโอกาส 80% ที่จะรับมันในตอนเช้า 50% ในตอนบ่ายและ 65% ในตอนกลางคืน ฉันวางรหัสด้านล่างโดยมีความคิดเห็นหลังจาก#:

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)

สรุปนี้แสดงให้เห็นในส่วน:

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

Interceptหมายถึงช่วงบ่ายและเราจะเห็นได้ว่าทั้งเย็นและเวลาเช้ามีความน่าจะเป็นสูงขึ้นอย่างมีนัยสำคัญจากการยึดมั่น มีรายละเอียดมากมายเกี่ยวกับการถดถอยแบบลอจิสติกที่ฉันไม่สามารถอธิบายได้ในโพสต์นี้ แต่การทดสอบทีสันนิษฐานว่าคุณมีตัวแปรตามการกระจายตามปกติ แบบจำลองการถดถอยแบบลอจิสติกมีความเหมาะสมมากกว่าเมื่อคุณมีผลลัพธ์แบบแบ่งขั้ว (0 เทียบกับ 1) เช่นนี้ ส่วนใหญ่หนังสือสถิติเบื้องต้นจะพูดคุยเกี่ยวกับT -test และหนังสือจำนวนมากเรียนรู้เครื่องเบื้องต้นจะพูดคุยเกี่ยวกับการถดถอยโลจิสติก ฉันคิดว่ารู้เบื้องต้นเกี่ยวกับการเรียนรู้ทางสถิติ: ด้วยแอปพลิเคชันใน Rนั้นยอดเยี่ยมมากและผู้เขียนโพสต์ทุกสิ่งออนไลน์:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

ฉันไม่แน่ใจเกี่ยวกับหนังสือที่ดีสำหรับการศึกษาสถานการณ์จำลอง ผมได้เรียนรู้มาจาก messing รอบอ่านสิ่งที่คนอื่นได้และจากบัณฑิตแน่นอนผมเอาในคอมพิวเตอร์สถิติ (วัสดุของอาจารย์อยู่ที่นี่: http://pj.freefaculty.org/guides/ )

สุดท้ายคุณสามารถจำลองแบบไม่มีผลด้วยการตั้งค่าเวลาทั้งหมดให้มีความน่าจะเป็นแบบเดียวกัน:

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))

ผลตอบแทนใด:

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

สิ่งนี้แสดงให้เห็นว่าไม่มีความแตกต่างอย่างมีนัยสำคัญระหว่างเวลาดังที่เราคาดหวังจากความน่าจะเป็นที่เท่ากันตลอดเวลา


ขอบคุณมากสำหรับคำแนะนำหนังสือ! สิ่งที่ฉันต้องการสำหรับการอ่านในวันหยุด!
MD-Tech

ขอบคุณมากสำหรับเรื่องนี้! ฉันรู้ว่าฉันต้องการรูปแบบการถดถอยโลจิสติกสำหรับด้านการเรียนรู้ของเครื่องในโครงการของฉัน แต่ดูเหมือนว่าจะมีแอปพลิเคชันในการจำลองข้อมูลเช่นกัน อย่างไรก็ตามฉันอยู่ภายใต้การแสดงผลที่การถดถอยโลจิสติกส์ต้องการลำดับของเวลาในเรื่องนี้ แต่ในกรณีนี้ไม่ใช่กรณีเนื่องจากแต่ละครั้งเป็นหมวดหมู่ที่แตกต่างกันโดยไม่มีความสัมพันธ์อื่น ฉันมาถึงข้อสรุปนี้หลังจากพูดคุยกับครูคณิตศาสตร์ของฉัน แต่เราทั้งคู่อาจผิดพลาดได้ คุณช่วยอธิบายได้ไหมว่าเหตุใดการถดถอยโลจิสติกจึงสามารถใช้ที่นี่ได้
Neelasha Bhattacharjee

@NeelashaBhattacharjee การจำลองข้อมูลและการปรับรูปแบบการถดถอยโลจิสติกเป็นสองขั้นตอนแยกกัน - เราสามารถจำลองข้อมูลเดียวกันและวิเคราะห์โดยใช้ตารางฉุกเฉินและสถิติไคสแควร์ถ้าเราต้องการ คุณถูกต้องว่ารูปแบบที่ฉันพอดีไม่ได้เข้ารหัสลำดับใด ๆ ในเวลา อย่างไรก็ตามรูปแบบการถดถอยทำให้สมมติฐานเกี่ยวกับวิธีขึ้นอยู่กับตัวแปรที่มีการกระจายไม่ตัวแปรอิสระ เราสามารถสั่งให้ผู้ทำนายผู้ทำนายต่อเนื่องนับผู้ทำนาย ฯลฯ และพวกเขาทุกคนคงจะดีสำหรับการถดถอยโลจิสติก
ทำเครื่องหมายสีขาว

@NeelashaBhattacharjee การถดถอยแบบลอจิสติกสามารถใช้ได้ที่นี่เนื่องจากเรากำลังสร้างแบบจำลองตัวแปรตามแบบแยกขั้วคู่นั่นคือผลลัพธ์ที่มีสองหรือสองผลลัพธ์เท่านั้นที่เป็นไปได้ สิ่งที่การถดถอยแบบลอจิสติกใช้ฟังก์ชัน "ฟังก์ชันการเชื่อมโยงโลจิสติก" เพื่อทำให้ค่าที่ทำนายไว้ทั้งหมดสำหรับสมการการถดถอย (เช่น b0 + b1 * x) มีค่าระหว่าง 0 ถึง 1 และเราเรียกตัวเลขเหล่านี้ว่า ค่าตัวแปรที่ขึ้นต่อกันของ 1
ทำเครื่องหมายสีขาว

ขอบคุณมาก! อย่างไรก็ตามฉันสงสัยว่าคุณสามารถดูค่า p ระหว่างชุดข้อมูลจำลองทั้งสองได้อย่างไรและพิจารณาว่าชุดหนึ่งมีแนวโน้มที่สำคัญและชุดอื่น ๆ หรือไม่ สำหรับฉันทั้งสองชุดมีค่า p ซึ่งแตกต่างกันพอที่จะมีนัยสำคัญ
Neelasha Bhattacharjee

4

ถ้าคุณรู้อยู่แล้วว่าบางหลามแล้วคุณแน่นอนจะสามารถที่จะบรรลุสิ่งที่คุณจำเป็นต้องใช้ฐานงูใหญ่พร้อมกับและnumpy / หรือ pandasตามที่ Mark White แนะนำแม้ว่าการจำลองและสิ่งต่าง ๆ ที่เกี่ยวข้องกับสถิติจะถูกนำเข้าสู่ R ดังนั้นควรดูให้ดี

ด้านล่างเป็นกรอบพื้นฐานสำหรับวิธีที่คุณจะใช้วิธีนี้โดยใช้คลาส Python คุณสามารถใช้np.random.normalเพื่อปรับbaseline_adherenceของแต่ละเรื่องเพื่อแทรกเสียงรบกวน สิ่งนี้จะให้ความร่วมมือในการสุ่มหลอกซึ่งคุณสามารถเพิ่มการยึดมั่นที่ลดลงตามเป้าหมายในบางวัน

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

นี่เป็นโครงการที่ยอดเยี่ยม มีความท้าทายสำหรับโครงการเช่นนี้และวิธีการใช้ข้อมูลจำลองของคุณเป็นวิธีที่ดีในการประเมิน

คุณมีสมมุติฐานเบื้องต้นเช่น "คนหลงลืมมากขึ้นในตอนเย็น" หรือไม่? ในกรณีนั้นการทดสอบทางสถิติที่เปรียบเทียบความถี่ของการลืมในตอนเย็นเมื่อเทียบกับตอนเช้าจะทดสอบ นี่คือการกระจาย Bernoulli ตามที่ผู้ตอบก่อนหน้ากล่าว

วิธีอื่นคือการสืบค้นข้อมูลของคุณเพื่อค้นหาว่าช่วงเวลาใดที่มีอัตราความล้มเหลวสูงสุด มีข้อผูกพันที่จะเป็นหนึ่งดังนั้นคำถามคือ "นี่เป็นเพียงผลโอกาส?" เกณฑ์สำหรับความสำคัญสูงกว่าในกรณีนี้ หากคุณต้องการอ่านเกี่ยวกับเรื่องนี้ให้ค้นหา "อัตราการค้นพบที่ผิด"

ในกรณีของคุณระบบง่ายพอที่คุณสามารถคำนวณเกณฑ์ด้วยความคิดเล็กน้อย แต่วิธีการทั่วไปยังสามารถใช้ได้: จำลองชุดข้อมูล 1,000 ชุดที่ไม่มีอัตราความแปรปรวนจากนั้นหาการแจกแจงความถี่ของตัวเลขที่มีค่าน้อยโดยบังเอิญ เปรียบเทียบชุดข้อมูลจริงของคุณกับมัน ถ้า 1:00 เป็นสล็อตหร็อมแหร็มในข้อมูลจริง แต่ชุดข้อมูลจำลอง 50/1000 ชุดมีช่องว่างกระจัดกระจายเท่า ๆ กันผลลัพธ์จะไม่แข็งแกร่ง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.