통계적으로 유의미한 데이터를 시뮬레이션하는 방법은 무엇입니까?


18

저는 10 학년이며 기계 학습 과학 박람회 프로젝트의 데이터를 시뮬레이션하려고합니다. 최종 모델은 환자 데이터에 사용되며 주중 특정 시간과 이것이 단일 환자의 데이터 내에서 약물 준수에 미치는 영향을 예측합니다. 준수 값은 이진수입니다 (0은 약을 복용하지 않았 음을 의미하고 1은 복용 함을 의미 함). 요일 간의 관계를 통해 학습 할 수있는 기계 학습 모델을 만들려고합니다. 요일을 각 시간마다 3 개 (1은 월요일 아침, 2는 월요일 오후, 기타.). 1,000 명의 환자 데이터를 시뮬레이션하려고합니다. 각 환자에게는 30 주 분량의 데이터가 있습니다. 요일 및 준수와 관련된 특정 추세를 삽입하고 싶습니다. 예를 들어 하나의 데이터 세트에서 나는주의 시간 슬롯 7이 준수와 통계적으로 유의 한 관계를 가지고 있다고 말할 수 있습니다. 관계가 통계적으로 유의한지 여부를 확인하려면 한 타임 슬롯을 다른 타임 슬롯과 다른 타임 슬롯을 비교하는 두 개의 샘플 t- 검정을 수행하고 유의 값이 0.05 미만인지 확인해야합니다.

그러나 내 데이터를 시뮬레이션하고 삽입 한 트렌드가 중요한지 여부를 확인하는 대신 역순으로 작업하고 특정 타임 슬롯에 중요한 트렌드를 준수하도록 요청할 수있는 프로그램을 사용하고 반환 할 것입니다 그 안에 내가 요청한 트렌드를 포함하는 이진 데이터와 약간의 노이즈는 포함하지만 통계적으로 유의미한 트렌드를 생성하지 않는 다른 타임 슬롯에 대한 이진 데이터.

이와 같은 것을 달성하는 데 도움이되는 프로그램이 있습니까? 아니면 파이썬 모듈입니까?

어떤 도움이라도 (프로젝트에 대한 일반적인 의견조차도) 대단히 감사하겠습니다!


4
이것은 좋은 질문입니다. 그리고 이와 같은 것은 연구 설계 단계에서 보조금을 신청 하기 전에 대부분의 과학자들이해야 할 일 입니다. 나는 사람들이 데이터를 먼저 수집하고 나중에 분석하는 방법을 알아 내려고 너무 자주 본다. 그 결과 통계학자는 Ronald Fisher 의 말로 실험이 끝난 것을 말할 수있을 뿐이다 .
S. Kolassa-복권 모니카

@StephanKolassa 그러나 인간 데이터에 대한 일부 실험에서 어떤 데이터를 사용할 수 있는지 평가하는 것은 매우 어렵고 다른 설정에서는 사용 가능하고 더 많은 데이터를 수집 할 수없는 데이터를 사용합니다.
llrs

2
@llrs : 맞습니다. 그리고 물론 시뮬레이션 연습에 알려야합니다. 중요한 데이터를 얻을 수 없다는 것을 실험 후에 파악하기보다는 사용 가능한 데이터에 대해 미리 생각하는 것이 좋습니다 .
S. Kolassa-복원 모니카

(+1) 나는이 질문에 다소 반대 의견을 표명했다
Robert Long

@RobertLong, 왜 그렇게 말합니까? 나는 신뢰성이 떨어지는 응답에서 빠진 것이 있는지 확인하고 싶기 때문에 단순히 묻습니다.
Neelasha Bhattacharjee

답변:


14

일반적인 답변

  • "저는 10 학년이며 기계 학습 과학 박람회 프로젝트를위한 데이터를 시뮬레이션하려고합니다." 대박. 저는 10 학년 수학에 전혀 신경 쓰지 않았습니다. 나는 그 해에 대수 2와 같은 것을 가지고 있다고 생각합니다 ...? 몇 년 안에 당신이 나를 직장에서 나갈 때까지 기다릴 수 없습니다! 아래에 몇 가지 조언을 드리겠습니다.이 시뮬레이션에서 무엇을 배우려고합니까? 통계 및 머신 러닝에서 이미 무엇을 알고 있습니까? 이 사실을 알면 저와 다른 사람들이 좀 더 구체적인 도움을 줄 수 있습니다.

  • 파이썬은 매우 유용한 언어이지만 R이 데이터 시뮬레이션에 더 좋다는 의견입니다. 내가 데이터를 시뮬레이션하는 것에 관해 접한 대부분의 책 / 블로그 / 연구 / 강좌는 사람들이 "몬테 카를로 (Monte Carlo) 방법"을 공상이라고 부른다) R에있다. "대부분의 학자 - 멋진 기능의 자신의 방법 일 사용 R.을 많이 보여 시뮬레이션 연구에 의존는 기본 R 언어에있는 등, (필요한 추가 패키지 없다는 것을) rnorm정규 분포에 대한, runif유니폼에 대한 rbeta베타 배포를위한 배포 등 입니다. R에서 입력 ?Distributions하면 도움말 페이지가 표시됩니다. 그러나 mvtnorm또는 다른 멋진 패키지가 많이 있습니다.simstudy유용합니다. 파이썬 만 알고 있다면 R을 배우기 위해 DataCamp.com을 추천합니다. 나는 그들이 사물을 부드럽게 소개하는 데 좋다고 생각합니다.

  • 시간이 지남에 따라 (세로), 개체 내 (다중 수준 모델을 사용하는 경우도 있음) 데이터에 계절적 구성 요소가있는 데이터 (아마도 시계열 모델)가 필요합니다. 이분법적인 결과 (로지스틱 회귀와 같은 것). 시뮬레이션 연구로 시작한 많은 사람들이 (나 자신을 포함하여) 한 번에 많은 것들을 던지기를 원하지만 이것은 정말 어렵고 복잡 할 수 있습니다. 따라서 제가 추천하는 것은 데이터 생성을 위해 하나 또는 두 개의 함수를 만드는 간단한 것부터 시작하여 거기서 시작하는 것입니다.

특정 의견

기본 가설은 다음과 같습니다. "시간은 누군가가 약물 복용을 고수할지 여부를 예측합니다." 그리고 당신은 두 개의 시뮬레이션 데이터 세트를 만들고 싶습니다이 하나 관계와 하나가있는 곳에 없습니다 .

또한 동일한 사람의 여러 관측치를 나타내는 데이터 시뮬레이션에 대해서도 언급합니다. 이것은 각 사람이 시간과 접착 확률 사이의 관계에 대한 자신의 기울기뿐만 아니라 자신의 준수 확률을 가질 것임을 의미합니다. 이 유형의 관계에 대해 "다단계"또는 "계층"회귀 모델을 살펴 보는 것이 좋습니다. 그러나 이보다 더 간단하게 시작할 수 있다고 생각합니다.

또한, 시간과 약물 요법을 고수 할 확률 사이의 지속적인 관계를 언급하면 ​​시계열 모델링 (특히 계절 추세를 살펴 보는 것)이 도움이 될 것입니다. 이것은 또한 시뮬레이트 가능하지만, 우리는 더 간단하게 시작할 수 있다고 생각합니다.

1000 명이 있고 약을 한 번만 복용했는지 여부를 측정한다고 가정 해 봅시다. 또한 아침, 오후 또는 저녁에 복용하도록 지명되었는지도 알고 있습니다. 약을 복용하는 것이 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오후를 나타내며, 우리는 저녁과 아침 모두 준수의 상당히 높은 확률 것을 볼 수 있습니다. 이 게시물에서 설명 할 수없는 로지스틱 회귀에 대한 많은 세부 사항이 있지만 t -tests는 조건부 정규 분포 종속 변수가 있다고 가정합니다. 로지스틱 회귀 모형은 이분법 (0 대 1) 결과가있을 때 더 적합합니다. 대부분의 입문 통계 서적은 t- 검정 에 대해 이야기 하고 많은 입문 기계 학습 서적은 로지스틱 회귀에 대해 이야기합니다. 내 생각 R은에서 응용 프로그램과 : 통계 학습에 소개 큰이며, 저자는 온라인 전체를 게시 :https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

나는 시뮬레이션 연구를위한 좋은 책에 대해 확신하지 못한다. 나는 엉망으로, 다른 사람들이 한 일을 읽고, 통계 계산에 관한 대학원 과정에서 배웠습니다 (교수의 자료는 여기에 있습니다 : 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입니다.
Mark White

정말 고맙습니다! 그러나 두 시뮬레이션 데이터 세트 사이의 p 값을보고 하나의 트렌드가 중요한지 다른 하나를 판단 할 수 있는지 궁금했습니다. 나에게 두 세트 모두 p 값이 중요합니다.
Neelasha Bhattacharjee

4

이미 파이썬을 알고 있다면 기본 파이썬과 함께 numpy/ 및 / 또는를 사용하여 필요한 것을 얻을 수 있습니다 pandas. Mark White가 제안한 것처럼 많은 시뮬레이션 및 통계 관련 항목이 R에 구워 져 있으므로 살펴볼 가치가 있습니다.

아래는 파이썬 클래스를 사용하여 어떻게 접근 할 수 있는지에 대한 기본 프레임 워크입니다. 노이즈를 삽입하기 위해 각 피사체의 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 배포판입니다.

다른 방법은 데이터를 트롤링하여 가장 높은 실패율을 갖는 시간 슬롯을 찾는 것입니다. 하나있을 수밖에 없기 때문에 질문은 "이것은 단지 우연한 결과 일까?"입니다. 이 경우 유의성 임계 값이 더 높습니다. 이에 대해 읽으려면 "false discovery rate"을 검색하십시오.

귀하의 경우 시스템은 약간의 생각으로 임계 값을 계산할 수있을 정도로 간단합니다. 그러나 일반적인 방법을 사용할 수도 있습니다. 속도 변화없이 1000 개의 데이터 세트를 시뮬레이션 한 다음 우연히 낮은 숫자의 빈도 분포를 알아냅니다. 실제 데이터 세트와 비교하십시오. 1pm이 실제 데이터의 희소 슬롯이지만 50/1000 시뮬레이션 된 데이터 세트의 스파 스 슬롯이 같으면 결과가 강력하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.