Verilerin istatistiksel olarak anlamlı olması nasıl simüle edilir?


18

10. sınıftayım ve makine öğrenimi science fair projesi için veri simülasyonu yapmak istiyorum. Son model hasta verileri üzerinde kullanılacak ve haftanın belirli zamanları arasındaki korelasyonu ve bunun tek bir hastanın verileri içindeki ilaç uyumu üzerindeki etkisini öngörecektir. Bağlılık değerleri ikili olacaktır (0 ilacı almadığı, 1 anlamına geldiği anlamına gelir). Haftanın zamanı arasındaki ilişkiden öğrenebilen ve haftayı her zaman için üç olmak üzere 21 zaman dilimine ayıran bir makine öğrenme modeli yaratmak istiyorum (1 Pazartesi sabahı, 2 Pazartesi öğleden sonra, vb.). 1.000 hasta değerinde veri simülasyonu yapmak istiyorum. Her hastanın 30 haftalık bir değeri olacaktır. Haftanın zamanı ve bağlılık ile ilgili belirli eğilimleri eklemek istiyorum. Örneğin, bir veri setinde haftanın 7 zaman aralığının yapışma ile istatistiksel olarak anlamlı bir ilişkisi olduğunu söyleyebilirim. İlişkinin istatistiksel olarak anlamlı olup olmadığını belirleyebilmem için, bir zaman aralığını diğerlerinin her biri ile karşılaştıran iki örnekli bir t-testi yapılmasını ve önem değerinin 0.05'ten küçük olduğundan emin olmamı gerektirecektir.

Bununla birlikte, kendi verilerimi simüle etmek ve eklediğim trendlerin önemli olup olmadığını kontrol etmek yerine, geriye doğru çalışmayı tercih edebilirim ve belki de belirli bir zaman dilimine bağlılık ile önemli bir eğilim atamak isteyebileceğim bir program kullanırım ve geri dönecekti içinde istediğim trendi içeren ikili veriler ve ayrıca biraz gürültü içeren ancak istatistiksel olarak anlamlı bir eğilim oluşturmayan diğer zaman dilimleri için ikili veriler.

Böyle bir şey elde etmeme yardımcı olabilecek herhangi bir program var mı? Ya da belki bir python modülü?

Herhangi bir yardım (projem hakkında genel yorumlar bile) son derece takdir edilecektir!


4
Bu harika bir soru. Ve böyle bir şey, çoğu bilim insanının çalışma tasarım aşamasında hibe başvurusu yapmadan önce yapması gereken şeydir . İnsanların önce verilerini topladığını ve daha sonra nasıl analiz edileceğini anlamaya çalıştıklarını çok sık görüyorum, bunun sonucu olarak istatistikçi Ronald Fisher'ın sözleriyle sadece deneyden ne öldüğünü anlayabiliyordu .
S.Kolassa - Monica'yı

@StephanKolassa Ancak, insan verileri ile bazı deneylerde hangi verilerin mevcut olacağını değerlendirmek çok zordur ve diğer ayarlarda mevcut olan ve daha fazla toplayamayan veriler kullanılır ...
llrs

2
@llrs: Bu tamamen doğru. Ve elbette simülasyon egzersizini bilgilendirmelidir. Deneyden sonra önemli verilerin elde edilemediğini bulmak yerine, hangi verilerin mevcut olduğunu önceden düşünmek daha iyidir .
S.Kolassa - Monica'yı

(+1) Bu soruyu kapatmak için oylamayı biraz sakıncalı buluyorum
Robert Long

@RobertLong, bunu neden söyledin? Basitçe soruyorum çünkü cevabın daha az güvenilir olmasını sağlayan hiçbir şey eksik olmadığımdan emin olmak istiyorum.
Neelasha Bhattacharjee

Yanıtlar:


14

Genel yorumlar

  • "10. sınıftayım ve bir makine öğrenimi science fair projesi için veri simülasyonu yapmak istiyorum." Muhteşem. 10. sınıfta matematikle hiç ilgilenmedim; Sanırım o yıl Cebir 2 gibi bir şey aldım ...? Birkaç yıl içinde beni işten çıkaracak kadar bekleyemem! Aşağıda bazı tavsiyelerde bulunuyorum, ancak: Bu simülasyondan ne öğrenmeye çalışıyorsunuz? İstatistik ve makine öğreniminde zaten neleri biliyorsunuz? Bunu bilmek bana (ve diğerlerine) daha özel yardımlar koymamda yardımcı olacaktır.

  • Python çok kullanışlı bir dildir, ancak R'nin veri simülasyonu için daha iyi olduğunu düşünüyorum. Verileri simüle etmek için karşılaştığım kitapların / blogların / çalışmaların / sınıfların çoğu (ayrıca insanların "Monte Carlo yöntemlerini" fantezi olarak adlandırdığı şey) de R'dir. R dili, istatistikçiler tarafından, istatistikçiler için " "ve yöntemlerinin işe yaradığını göstermek için simülasyon çalışmalarına dayanan çoğu akademisyen R'yi kullanır. üniforma için rnormnormal bir dağıtım gibi, temel R dilinde (yani ek paket gerekmez) birçok harika işlev vardır. runifdağıtım, rbetabeta dağıtım vb. R yazdığınızda ?Distributions, üzerlerinde bir yardım sayfası gösterilir. Ancak, mvtnormveya gibi birçok harika paket varsimstudyfaydalıdır. Sadece Python biliyorsanız, R öğrenmek için DataCamp.com tavsiye ederim; Bence bir şeyleri nazikçe tanıtmak

  • Burada çok şey oluyor gibi görünüyor: Zaman içinde (boyuna), öznenin içinde (belki de çok düzeyli bir model kullanıyor) ve bunlara ilişkin mevsimsel bir bileşene (belki de bir zaman serisi modeli) sahip olan verilerin olmasını istiyorsunuz. ikilik bir sonuç (lojistik regresyon gibi bir şey). Bence simülasyon çalışmaları ile başlayan birçok insan (ben dahil) aynı anda bir sürü şey atmak istiyor, ancak bu gerçekten göz korkutucu ve karmaşık olabilir. Yapmayı tavsiye ettiğim şey basit bir şeyle başlamak - belki de veri üretmek için bir iki işlev yapmak - ve oradan oluşturmak.

Özel Yorumlar

Temel hipoteziniz şu şekildedir: "Günün zamanı, birisinin ilaçlarını almaya bağlı olup olmadığını tahmin eder." Ve iki iki simüle veri kümeleri oluşturmak istiyorum: Orada biri olan bir ilişki ve bir olduğu yerde değil .

Aynı kişiden gelen birden fazla gözlemi temsil etmek için veri simülasyonundan da bahsediyorsunuz. Bu, her bireyin kendi bağlılık olasılığının yanı sıra belki de günün saati ile yapışma olasılığı arasındaki ilişki için kendi eğimine sahip olacağı anlamına gelir. Bu tür bir ilişki için "çok düzeyli" veya "hiyerarşik" regresyon modellerine bakmanızı öneririm, ancak bence bundan daha basit başlayabilirsiniz.

Ayrıca, zaman ve ilaç rejimine uyma olasılığı arasında sürekli bir ilişkiden bahsediyorsunuz, bu da bana zaman serisi modellemesinin - özellikle mevsimsel eğilimlere bakmak - sizin için yararlı olacağını düşündürüyor. Bu da simüle edilebilir, ancak yine daha basit başlayabiliriz.

Diyelim ki 1000 kişimiz var ve ilaçlarını sadece bir kez alıp almadıklarını ölçüyoruz. Ayrıca sabah, öğleden sonra veya akşam almak üzere görevlendirildiklerini de biliyoruz. Diyelim ki ilacı almak 1, onu almamak 0. rbinomBinom dağılımından çekilişler kullanarak iki boyutlu verileri simüle edebiliriz . Her bir kişiyi belirli bir olasılıkla 1 gözlem yapmaya ayarlayabiliriz. Diyelim ki insanlar sabahları% 80, öğleden sonra% 50 ve geceleri% 65. Aşağıdaki kodu, sonra bazı yorumlar ile yapıştırın #:

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)

Bu özet kısmen göstermektedir:

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Öğleden temsil eder ve biz akşam ve sabah hem kalarak önemli ölçüde daha yüksek olasılık olduğunu görebilirsiniz. Bu yazıda açıklayamadığım lojistik regresyon hakkında birçok ayrıntı var, ancak t- testleri, koşullu olarak normal olarak dağıtılmış bağımlı bir değişkeniniz olduğunu varsayar. Bunun gibi iki (0 - 1) sonuç elde ettiğinizde lojistik regresyon modelleri daha uygundur. Çoğu giriş istatistik kitabı t- testi hakkında konuşacak ve birçok giriş makinesi öğrenme kitabı lojistik regresyon hakkında konuşacaktır. Bence R Uygulamaları: İstatistiksel Öğrenmeye Giriş harika ve yazarlar çevrimiçi şeyi yayınladı:https://www-bcf.usc.edu/~gareth/ISL/ISLR%20First%20Printing.pdf

Simülasyon çalışmaları için iyi kitaplar konusunda emin değilim; Sadece etrafta dolaşmaktan, diğer insanların ne yaptığını okumaktan ve lisansüstü bir dersten istatistiksel hesaplama üzerine öğrendim (profesörün materyalleri burada: http://pj.freefaculty.org/guides/ ).

Son olarak, her zaman aynı olasılığa sahip olacak şekilde ayarlayarak herhangi bir etkisinin olmadığını simüle edebilirsiniz:

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

Hangi döndürür:

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

Bu, olasılıklar arasında aynı olmasını beklediğimizden, zamanlar arasında önemli bir fark göstermemektedir.


Kitap tavsiyesi için çok teşekkür ederim! Sadece tatil okumak için gerekli ne!
MD-Tech

Bunun için çok teşekkürler! Projemin makine öğrenimi yönü için lojistik regresyon modeline ihtiyacım olduğunu biliyordum, ancak verilerin simülasyonunda da bir uygulama var gibi görünüyor. Bununla birlikte, lojistik regresyonun zamanın önemli olması için gerektirdiği izlenimindeydim, ancak bu durumda, her zaman diğeriyle ilişkisi olmayan farklı bir kategori olduğu için durum böyle değil. Bu sonuca matematik öğretmenimle görüştükten sonra geldim, ama ikimiz de yanlış olabiliriz. Burada tam olarak lojistik regresyonun neden kullanılabileceğini açıklar mısınız?
Neelasha Bhattacharjee

@NeelashaBhattacharjee Verileri simüle etmek ve lojistik regresyon modelini yerleştirmek iki ayrı adımdır - aynı verileri simüle edebilir ve istersek bir beklenmedik durum tablosu ve ki-kare istatistiği kullanarak analiz edebilirdik. Uygun olduğum modelin zaman içinde herhangi bir düzeni kodlamadığını doğru söylüyorsunuz. Bununla birlikte, regresyon modelleri bağımsız değişkenlerin değil, bağımlı değişkenin nasıl dağıtıldığı konusunda varsayımlar yapar . Tahminciler, sürekli öngörücüler, sayım öngörücüler, vb. Sipariş edebilirdik ve hepsi lojistik regresyon için iyi olurdu.
Mark White

@NeelashaBhattacharjee Çift yönlü bağımlı bir değişkeni, yani iki ve sadece iki olası sonucu olan bir modelleme yaptığımız için lojistik regresyon burada kullanılabilir. Lojistik regresyonun yaptığı, regresyon denklemi için öngörülen tüm değerlerin (örneğin, b0 + b1 * x) 0 ile 1 arasında olmasını sağlamak için "lojistik bağlantı fonksiyonu" nu kullanmaktır. bağımlı değişken değeri 1
Mark White

Çok teşekkür ederim! Ancak, iki simüle edilmiş veri seti arasındaki p değerlerine nasıl bakabileceğinizi ve birinin önemli bir trend ve diğeri olup olmadığını nasıl belirleyebileceğinizi merak ediyordum. Bana göre, her iki setin de anlamlı olacak kadar değişen p değerleri vardır.
Neelasha Bhattacharjee

4

Zaten bir Python biliyorsanız, o zaman numpyve / veya birlikte temel Python kullanarak ihtiyacınız olanı elde edebileceksiniz pandas. Mark White'ın da belirttiği gibi, simülasyon ve istatistiklerle ilgili birçok şey R'ye dönüştürülür, bu yüzden kesinlikle bir göz atmaya değer.

Aşağıda bir Python sınıfı kullanarak buna nasıl yaklaşabileceğinize dair temel bir çerçeve bulunmaktadır. Biraz gürültü eklemek için her konuyu np.random.normalayarlamak için kullanabilirsiniz baseline_adherence. Bu, belirli günlerde hedeflenen azaltılmış yapışmayı ekleyebileceğiniz sahte rastgele bir yapışma sağlar.

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

Bu harika bir proje. Bunun gibi projeler için bir zorluk var ve simüle edilmiş verileri kullanma yönteminiz bunu değerlendirmenin harika bir yoludur.

Önceden bir hipoteziniz var mı, örneğin "insanlar akşamları daha unutulur" mu? Bu durumda, akşamları unutma sıklığını sabaha göre karşılaştıran istatistiksel bir test bunu test edecektir. Önceki yanıtlayıcıların söylediği gibi, bu bir Bernoulli dağılımıdır.

Diğer yaklaşım, hangi zaman diliminin en yüksek başarısızlık oranına sahip olduğunu bulmak için verilerinizi trol etmektir. Bir tane olması gerekiyor, bu yüzden soru "bu sadece bir şans sonucu mu?" Bu durumda önem eşiği daha yüksektir. Bu konuyla ilgili bilgi edinmek istiyorsanız, "yanlış keşif oranı" için arama yapın.

Sizin durumunuzda sistem, eşiği biraz düşünerek hesaplayabileceğiniz kadar basittir. Ancak genel yöntem de kullanılabilir: hız değişimi olmadan 1000 veri kümesini simleyin, ardından tesadüfi düşük sayıların frekans dağılımını bulun. Gerçek veri kümenizi onunla karşılaştırın. 1pm gerçek verilerdeki seyrek yuvaysa, ancak 50/1000 simüle edilmiş veri kümelerinde eşit derecede seyrek bir yuva varsa, sonuç sağlam değildir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.