普通的留言
“我正在读10年级,我正在为机器学习科学博览会项目模拟数据。” 太棒了 我根本不关心十年级的数学;我想那年我选了像代数2这样的东西...?我等不及要等你几年后辞职!我在下面提供一些建议,但是:您想从该模拟中学到什么?您已经在统计和机器学习领域熟悉什么?知道这一点将对我(和其他人)提供一些更具体的帮助。
Python是一种非常有用的语言,但我认为R更适合模拟数据。我在模拟数据时遇到的大多数书籍/博客/研究/课程(也有人称其为“蒙特卡洛方法”)是R。R语言被“统计学家”称为“统计学家,对于统计学家来说, ”,并且大多数依靠模拟研究来证明其方法有效的学者都使用R。许多很酷的功能都使用R语言(即不需要额外的软件包),例如rnorm
正态分布,runif
统一分布,rbeta
用于beta分布等等。在R中,键入?Distributions
将显示有关它们的帮助页面。但是,还有许多其他很酷的软件包,例如mvtnorm
或simstudy
这很有用。如果您只了解Python,我建议您使用DataCamp.com来学习R。我认为它们对于轻轻地介绍事物很有好处
看来您正在做很多事情:您想要的是随时间推移(纵向),主题内(也许使用多级模型)的数据,并具有季节性成分(也许是时间序列模型),所有这些数据都可以预测二分法的结果(类似于逻辑回归)。我认为很多开始进行模拟研究的人(包括我自己)都想一次投入很多东西,但这确实很艰巨和复杂。因此,我建议做的事情从简单的事情开始(也许要创建一两个函数来生成数据),然后从那里开始构建。
具体评论
看起来您的基本假设是:“一天中的时间可以预测某人是否坚持服药。” 你想要两张创建两个模拟数据集:一是那里是一个关系,一个地方有没有。
您还提到了模拟数据以代表同一个人的多个观察结果。这意味着每个人都有自己的依从概率以及一天中的时间与依附概率之间的关系的斜率。我建议针对这种类型的关系研究“多级”或“分层”回归模型,但我认为您可以比这更简单。
另外,您提到时间和遵守药物治疗方案的可能性之间的连续关系,这也使我认为时间序列建模(特别是关注季节性趋势)将对您有所帮助。这也是可以模拟的,但是我想我们可以更简单地开始。
假设我们有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 vs. 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
这表明时间之间没有显着差异,正如我们从时间跨度相同的可能性中所期望的那样。