Як моделювати дані, щоб бути статистично значущими?


18

Я перебуваю в 10 класі і шукаю моделювати дані для проекту ярмарку машинного навчання. Кінцева модель буде використана на даних про пацієнтів і передбачає співвідношення між певним часом тижня та впливом, яке це має на прихильність ліків у межах даних про одного пацієнта. Значення прихильності будуть двійковими (0 означає, що вони не приймали ліки, 1 означає, що вони зробили). Я хочу створити модель машинного навчання, яка зможе дізнатися на зв'язку між часом тижня і розділила тиждень на 21 часовий проміжок, три на кожен час доби (1 - понеділок вранці, 2 - понеділок вдень, тощо). Я шукаю змоделювати дані на 1000 пацієнтів. Кожен пацієнт матиме дані на 30 тижнів. Я хочу вставити певні тенденції, пов’язані з часом тижня та прихильністю. Наприклад, в одному наборі даних я можу сказати, що часовий проміжок 7 тижня має статистично значимий зв’язок із прихильністю. Для того, щоб я міг визначити, чи є взаємозв'язок статистично значущим, чи не потрібно, я повинен виконати два зразки t-тесту, порівнюючи один часовий проміжок з кожним з інших та переконайтесь, що значення значущості менше 0,05.

Однак, замість того, щоб імітувати власні дані та перевіряти, чи є тенденції, які я вставив, значні чи ні, я б скоріше працював назад і, можливо, використовував програму, яку я міг би попросити призначити певний часовий проміжок суттєвою тенденцією з дотриманням, і вона повернеться бінарні дані, що містять в собі тенденцію, про яку я запитував, а також бінарні дані для інших часових проміжків, які містять деякий шум, але не викликають статистично значущої тенденції.

Чи є якась програма, яка може допомогти мені досягти чогось подібного? А може, модуль пітона?

Будь-яка допомога (навіть загальні коментарі до мого проекту) буде дуже вдячна !!


4
Це чудове питання. І щось подібне - це те, чим слід займатися більшість вчених перед тим, як подати заявку на грант, на стадії розробки дослідження. Я занадто часто бачу, що люди спочатку збирають свої дані і намагаються розібратися, як потім їх аналізувати, в результаті чого статистик може лише сказати, від чого помер експеримент, за словами Рональда Фішера .
С. Коласа - Відновіть Моніку

@StephanKolassa Однак дуже важко оцінити, які дані будуть доступні в деяких експериментах із людськими даними, а в інших налаштуваннях використовуються дані, які є доступними та не можуть збирати більше ...
llrs

2
@llrs: Це абсолютно правильно. І, звичайно, слід повідомити симуляцію. Краще заздалегідь подумати про те, які дані є, а не з'ясовувати після експерименту, що важливі дані неможливо отримати.
С. Коласа - Відновити Моніку

(+1) Я вважаю голосування за закриття цього питання дещо заперечним
Роберт Лонг

@RobertLong, чому ти це кажеш? Я прошу просто тому, що хочу переконатися, що я нічого не пропускаю у відповіді, що робить її менш достовірною.
Neelasha Bhattacharjee

Відповіді:


14

Загальні коментарі

  • "Я перебуваю в 10 класі і шукаю змоделювати дані для проекту ярмарку машинного навчання." Дивовижно. Я зовсім не переймався математикою у 10 класі; Я думаю, що я взяв щось на зразок Алгебри 2 того року ...? Я не можу дочекатися, поки ти не звільниш мене з роботи через кілька років! Я даю кілька порад нижче, але: Що ви намагаєтеся навчитися з цього моделювання? Що ви вже знайомі зі статистики та машинного навчання? Знаючи це, я б допомогла мені (та іншим) зібрати ще якусь конкретну допомогу.

  • Python - дуже корисна мова, але я вважаю, що R краще для моделювання даних. Більшість книг / блогів / досліджень / занять, які я натрапила на моделювання даних (також те, що люди називають "методами Монте-Карло", щоб бути фантазійними), є у Р. Мова R відома як "статистики, для статистиків, "та більшість науковців - які покладаються на симуляційні дослідження, щоб показати свої методи роботи - використовують R. Багато цікавих функцій є в базовій мові R (тобто додаткові пакети не потрібні), наприклад, rnormдля нормального розподілу runifдля уніформи розподіл, rbetaдля бета-розподілу тощо. У R введення ?Distributionsпоказує вам довідкову сторінку на них. Однак є багато інших крутих пакетів, таких як mvtnormабоsimstudyякі корисні. Я б рекомендував DataCamp.com для вивчення R, якщо ви знаєте лише Python; Я думаю, що вони гарні для того, щоб обережно познайомитися з речами

  • Схоже, у вас тут багато чого відбувається: ви хочете, щоб дані, які перебігли час (поздовжній), всередині тематики (можливо, використовуючи багаторівневу модель) і мали для них сезонний компонент (можливо, модель часових рядів), все прогнозуючи дихотомічний результат (щось на зразок логістичної регресії). Я думаю, що багато людей, починаючи з імітаційних досліджень (в тому числі і я), хочуть одразу кинути купу речей, але це може бути справді непростим і складним. Тож, що я рекомендував би зробити, це починати з чогось простого - можливо, створити функцію або дві для генерування даних, а потім створити звідти.

Конкретні коментарі

Схоже, ваша основна гіпотеза така: "Пора дня прогнозує, чи дотримується хтось приймати свої ліки чи ні". І вам хотілося б, щоб два створили два модельовані набори даних: один там, де є взаємозв'язок, і один, де є НЕ .

Ви також згадуєте моделювання даних для представлення кількох спостережень від однієї людини. Це означає, що кожна людина матиме власну ймовірність прихильності, а також, можливо, власний нахил для залежності між часом доби та ймовірністю дотримання. Я б запропонував розглянути "багаторівневі" чи "ієрархічні" регресійні моделі для такого типу відносин, але я думаю, ви могли б почати простіше, ніж це.

Крім того, ви згадуєте про постійну взаємозв'язок між часом та ймовірністю дотримання схеми прийому ліків, що також змушує мене думати, що моделювання часових рядів - зокрема, дивлячись на сезонні тенденції - було б корисним для вас. Це також може імітувати, але, знову ж таки, я думаю, що ми можемо почати простіше.

Скажімо, у нас 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 -тести припускають, що у вас є умовно нормально розподілена залежна змінна. Логістичні регресійні моделі є більш доцільними, коли у вас є дихотомічні (0 проти 1) результати подібні. Більшість вступних книг зі статистикою будуть говорити про t -test, а багато вступних книг машинного навчання розповідатимуть про логістичну регресію. Я думаю, що вступ до статистичного навчання: із додатками в R чудово, і автори розмістили все це в мережі:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Я не так впевнений у хороших книгах для симуляційних досліджень; Я навчився просто безладно, читати, що робили інші люди, і після аспірантури я взяв на себе статистичні обчислення (матеріали професора тут: http://pj.freefacturing.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, які досить різняться, щоб бути значущими.
Neelasha Bhattacharjee

4

Якщо ви вже знаєте деякий Python, то ви обов'язково зможете досягти того, що вам потрібно, використовуючи базовий Python разом із numpyта / або pandas. Як пропонує Марк Уайт, в 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

Це чудовий проект. Для таких проектів є виклик, і ваш метод використання імітованих даних - це чудовий спосіб його оцінити.

Чи є у вас апріорна гіпотеза, наприклад, "люди ввечері більш забувають"? У такому випадку статистичний тест, який порівнює частоту забуття ввечері порівняно з ранком, перевірить його. Це поширення Бернуллі, як говорили попередні респонденти.

Інший підхід полягає в пошуку трафіку ваших даних, щоб з’ясувати, який часовий проміжок має найвищий рівень відмов. Це обов'язково має бути одне, тож питання: "це просто шанс результату?". Поріг значущості в цьому випадку вище. Якщо ви хочете прочитати про це, знайдіть "швидкість виявлення помилок".

У вашому випадку система досить проста, що ви можете трохи подумати обчислити поріг. Але також може бути використаний загальний метод: моделюйте 1000 наборів даних без зміни швидкості, а потім з’ясуйте частотний розподіл за збігом низьких чисел. Порівняйте ваш реальний набір даних із ним. Якщо 1pm - це розріджений проріз у реальних даних, але 50/1000 модельованих наборів даних мають однаково рідкий слот, то результат не є надійним.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.