Как моделировать данные, чтобы они были статистически значимыми?

18

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

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

Есть ли какая-нибудь программа, которая может помочь мне достичь чего-то подобного? Или, может быть, модуль Python?

Буду очень признателен за любую помощь (даже общие комментарии к моему проекту) !!

Нилаша Бхаттачарджи
источник
4
Это большой вопрос. Примерно так и следует делать большинству ученых, прежде чем подавать заявку на грант на этапе разработки исследования. Я слишком часто вижу, что люди собирают свои данные в первую очередь и пытаются выяснить, как их потом анализировать, в результате чего статистик может только сказать, от чего умер эксперимент, по словам Рональда Фишера .
С. Коласса - Восстановить Монику
@StephanKolassa Тем не менее, очень трудно оценить, какие данные будут доступны в некоторых экспериментах с человеческими данными, а в других условиях используются данные, которые доступны и не могут собирать больше ...
11
2
@llrs: Это совершенно правильно. И это, конечно, должно сообщить имитационное упражнение. Лучше подумать заранее о том, какие данные доступны, а не выяснять после эксперимента, что важные данные не могут быть получены.
С. Коласса - Восстановить Монику
(+1) Я считаю, что голосование за закрытие этого вопроса несколько нежелательно
Роберт Лонг
@RobertLong, почему ты так говоришь? Я спрашиваю просто потому, что хочу убедиться, что в ответе не пропущено ничего, что делает его менее заслуживающим доверия.
Нилаша Бхаттачарджи

Ответы:

14

Общие комментарии

  • «Я учусь в 10-м классе и собираюсь смоделировать данные для проекта ярмарки машинного обучения». Потрясающие. Я не заботился о математике в 10 классе; Я думаю, что взял что-то вроде Алгебры 2 в этом году ...? Не могу дождаться, пока ты меня уволишь через несколько лет! Ниже я даю несколько советов, но: что вы пытаетесь извлечь из этого моделирования? С чем вы уже знакомы в области статистики и машинного обучения? Знание этого поможет мне (и другим) собрать более конкретную помощь.

  • Python - очень полезный язык, но я считаю, что R лучше для симуляции данных. Большинство книг / блогов / исследований / классов, с которыми я сталкивался по моделированию данных (также то, что люди называют «методами Монте-Карло» для фантазии), написаны на языке 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

The 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
Спасибо тебе большое за это! Я знал, что мне нужна модель логистической регрессии для аспекта машинного обучения моего проекта, но, похоже, есть приложение для моделирования данных. Однако у меня сложилось впечатление, что логистическая регрессия требует, чтобы порядок времен имел значение, но в данном случае это не так, поскольку каждый раз это отдельная категория, не имеющая отношения к другой. Я пришел к такому выводу после обсуждения с моим учителем математики, но мы оба вполне могли ошибаться. Не могли бы вы уточнить, почему именно логистическая регрессия может быть использована здесь?
Нилаша Бхаттачарджи
@NeelashaBhattacharjee Моделирование данных и подбор модели логистической регрессии - это два отдельных шага - мы могли бы смоделировать одни и те же данные и проанализировать их, используя таблицу сопряженности и статистику хи-квадрат, если бы захотели. Вы правы, что модель, которая мне подходит, не кодирует ни один порядок в те времена. Однако регрессионные модели делают предположения о том, как распределена зависимая переменная, а не независимые переменные. Мы могли бы заказать предикторы, непрерывные предикторы, предикторы подсчета и т. Д., И все они были бы хороши для логистической регрессии.
Марк Уайт
@NeelashaBhattacharjee Логистическая регрессия может использоваться здесь, так как мы моделируем дихотомическую зависимую переменную, то есть одну с двумя и только двумя возможными результатами. Что делает логистическая регрессия, так это использует «функцию логистической связи», чтобы все прогнозируемые значения для уравнения регрессии (например, b0 + b1 * x) соответствовали от 0 до 1. И мы называем эти числа вероятностью того, что кто-то имеет значение зависимой переменной 1.
Марк Уайт
Спасибо огромное! Однако мне было интересно, как вы смогли посмотреть на значения p между двумя смоделированными наборами данных и определить, имел ли один значительный тренд, а другой - нет. Для меня оба набора имеют значения p, которые достаточно различаются, чтобы быть значимыми.
Нилаша Бхаттачарджи,
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 наборов данных без изменения скорости, а затем выяснить распределение частот совпадения малых чисел. Сравните ваш реальный набор данных с ним. Если 1РМ является разреженным интервалом в реальных данных, но моделируемые наборы данных 50/1000 имеют одинаково разреженный интервал, то результат не является надежным.

chrishmorris
источник