是否有一种通用的方法来模拟来自公式或分析的数据?

机器算法验证 r 实验设计 模拟
2022-01-22 03:41:35

来自实验设计数据框架的数据的从头模拟。
专注于 R(尽管其他语言解决方案会很棒)。

在设计实验或调查时,模拟数据并对这些模拟数据进行分析可以提供对设计优缺点的极好的洞察力。

这种方法对于理解和正确使用统计测试也是必不可少的。

然而,这个过程往往有些乏味,许多人会跳过实验或调查中的这一重要步骤。

统计模型和测试包含模拟数据所需的大部分信息(包括假设或分布的明确陈述)。

给定一个分析模型(及其相关假设,例如正态性和平衡)、一个因子的水平和一个显着性度量(例如 p 值),我想获得模拟数据(理想情况下具有类似于打印(),预测(),模拟())。

这样一个通用的仿真框架可能吗?

如果有,目前是否有这样的框架?

例如,我想要一个函数,例如:

 sim(aov(response~factor1+factor2*factor3),
          p.values=list(factor1=0.05,
                        factor2=0.05,
                        factor3=0.50,
                        factor2:factor3=0.05),
          levels=list(factor1=1:10,
                      factor2=c("A", "B", "C"),
                      factor3=c("A", "B", "C")))

即,通用版本:

sim.lm<-function(){
library(DoE.base)
design<-fac.design(nlevels=c(10,3,3),
                   factor.names=c("factor1", "factor2", "factor3"),
                   replications=3,
                   randomize=F)

response<-with(design, as.numeric(factor1)+
                      as.numeric(factor2)+
                      as.numeric(factor3)+
                      as.numeric(factor2)*as.numeric(factor3)+
                      rnorm(length(factor1)))

simulation<-data.frame(design, response)}

或者

sim(glm(response~factor1+factor2*factor3, family=poisson),
         p.values=list(factor1=0.05,
                       factor2=0.05,
                       factor3=0.50,
                       factor2:factor3=0.05),
         levels=list(factor1=1:10,
                     factor2=c("A", "B", "C"),
                     factor3=c("A", "B", "C")))

或者

  library(lme4)
  sim(lmer(response~factor1+factor2 + (factor2|factor3)),
           F_value=list(factor1=50,
                        factor2=50),
           levels=list(factor1=1:10,
                       factor2=c("A", "B", "C"),
                       factor3=c("A", "B", "C")))

这将创建一个完整的相应 data.frame

特定功能的潜在示例(请随意编辑)
- arima.sim

存在函数来创建因子水平的data.frame,没有建模响应:
例如。conf.design
http://cran.r-project.org/web/views/ExperimentalDesign.html

3个回答

实际上有一个 S3 泛型simulate,甚至可以返回您想要的数据框(或其他列表)。类型

?simulate  

它已经具有类 lm (也适用于 glm 或您的 aov 示例)和 glm.nb (在 MASS 中)的方法。您现在可以simulate为其他类的对象编写 S3 方法,例如来自 lme4 的对象。您可以通过键入检查哪些类有方法

getAnywhere("simulate.class"), getAnywhere("simulate")  

或者

getS3method("simulate","class"), methods(simulate) 

simfun在 R的包中调用了一个新函数TeachingDemos(目前仅在R-forge上的开发版本中,在 CRAN 上还需要一段时间)。它旨在帮助创建功能来进行模拟。

预期用途之一是教师将使用simfun函数来创建一个函数并将其分发给学生(可能在某些时候有一个 Web 界面作为替代方案)。然后,学生将创建一个代表实验设计的因素的数据框,将该数据框传递给创建的函数,并返回该数据框,其中包含根据教师设置的参数和误差分布模拟的附加列的响应,然后学生可以分析数据。这允许老师建立一个“真实”的关系,但允许学生尝试许多不同的实验设计来探索获得“真理”的方法,而这比做实际实验的时间要少得多,而且老师的工作量也比创建或找到一组代表不同可能设计的不同样本数据集。

simfun功能设计灵活,因此教师/创建者可以基于拟合回归模型、教师/创建者提供的参数或学生/用户提供的参数进行模拟。

创建的函数也可以很容易地用于模拟(使用replicate命令)来探索功率、样本大小、效果大小等。尽管生成的模拟可能比手工制作模拟过程要慢。

这看起来像您所描述的,除了它不采用 p 值来创建数据,但是可以结合使用power.函数或pwr.pwr包中创建基于指定功率和 alpha 而不是均值和差异的模拟。

这是帮助页面中的一个示例(还有几个示例),假设您正在测量嵌套在城市中的对象(男性和女性)的高度,这些城市嵌套在州中,对于具有 SD 的州存在随机效应1 和城市(州内)的随机效应,SD 为 0.5,则“误差”SD 为 3,女性的模拟平均值为 64 英寸,男性的平均值为 69 英寸(误差 SD 和平均值是现实的,随机效应有点做作)。simfun函数用于创建一个名为 的新函数simheight,然后创建一个包含州 ID、城市 ID 和受试者性别列(实验设计或抽样设计)的数据框,并将其传递给simheight并在一个新的数据框中生成一个带有模拟高度(除了其他变量)的结果,然后可以使用适当的工具对其进行分析。

# simulate a nested mixed effects model
simheight <- simfun({
  n.city <- length(unique(city))
  n.state <- length(unique(state))
  n <- length(city)
  height <- h[sex] + rnorm(n.state,0,sig.state)[state] + 
    rnorm(n.city,0,sig.city)[city] + rnorm(n,0,sig.e)
}, sig.state=1, sig.city=0.5, sig.e=3, h=c(64,69),
  drop=c('sig.state','sig.city','sig.e','h','n.city','n.state','n'))

tmpdat <- data.frame(state=gl(5,20), city=gl(10,10), 
  sex=gl(2,5,length=100, labels=c('F','M')))
heightdat <- simheight(tmpdat)

打字methods(simulate)getAnywhere("simulate")应该工作。前者给你一些方法,如果包 lme4 被加载:

[1] 模拟.lm* 模拟.merMod* 模拟.negbin* 模拟.polr*

lm 对象用于 lm 和 glm 模型。