有可用的通用方法来模拟公式或分析中的数据吗?


16

从实验设计数据框中对数据进行从头模拟。
着重于R(尽管其他语言解决方案会很棒)。

在设计实验或调查时,模拟数据并对该模拟数据进行分析可以提供对设计优点和缺点的深刻了解。

这种方法对于理解和正确使用统计检验也可能至关重要。

但是,此过程往往有些繁琐,并且导致许多人跳过了实验或调查中的这一重要步骤。

统计模型和检验包含模拟数据所需的大多数信息(包括假设或分布的明确表述)。

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

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

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

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

 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


要记住的一件事是您需要指定错误分布。另外,我不会完全遵循您的“ p.values”或“ F_value”列表;F&p的抽样分布是否以所列数字为中心?
gung-恢复莫妮卡

@gung,在测试中假设分布(在这里都假设正常,否则我将不得不使用glm之类的东西)。
EtienneLow-Décarie2012年

测试当然确实假定了特定的分布,但这并不意味着数据实际上是以这种方式生成的。您可以出于各种目的从任意数量的分布生成数据(例如,仿真算例,鲁棒性等)。
gung-恢复莫妮卡

@gung,我试图编辑我的问题,以明确我想创建一个与测试/模型的期望相对应的数据集。我不是在寻找用于模拟研究或用于鲁棒性研究的东西,而是提供实验设计的试运行。
EtienneLow-Décarie2012年

Answers:


10

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

?simulate  

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

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

要么

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

如果不需要“本身代表拟合模型的对象”本身就已经需要数据或模拟数据,那么模拟将非常棒。
EtienneLow-Décarie2012年

>getAnywhere("simulate.class") no object named ‘simulate.class’ was found >getS3method("simulate","class") Error in getS3method("simulate", "class") : S3 method 'simulate.class' not found
EtienneLow-Décarie2012年

2
可以总是构造一个初始拟合对象,例如所有响应值都为0,然后用所需的参数值替换拟合系数。然后可以使用“模拟”获得模拟响应。
NRH 2012年

那是真实的。[实验设计任务](cran.r-project.org/web/views/ExperimentalDesign.html)视图中的软件包具有许多用于创建虚拟变量设置的软件包。集成模拟和实验设计功能会很棒!
EtienneLow-Décarie2012年

某些模拟功能不仅仅创建拟合数据:stats.stackexchange.com/questions/11233/…– EtienneLow
-Décarie

6

R simfunTeachingDemos软件包中有一个新函数(目前仅在R-forge的开发版本中,要在CRAN上尚需时日)。它旨在帮助创建进行仿真的功能。

预期用途之一是老师会使用 simfun函数来创建函数并将其分发给学生(可以选择在某个时候使用网络界面)。然后,学生将创建一个代表实验设计的因素的数据框,将该数据框传递给创建的函数,并根据老师设置的参数和错误分布将响应的附加列返回该数据框。 ,然后学生可以分析数据。这允许教师建立“真实”关系,但允许学生尝试许多不同的实验设计,以探索比实际实验少得多的时间,并且比对教师的工作量更少的探寻“真实”的方法。创建或找到一堆代表不同可能设计的不同样本数据集。

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)

我似乎在R-Forge上找不到新的TeachingDemos?
EtienneLow-Décarie2012年

1
install.packages(“ TeachingDemos”,repos =“ R-Forge.R-project.org”
-Décarie

尝试install.packages("TeachingDemos", repos="http://R-Forge.R-project.org")。开头需要“ http://”,而无需“;”。
格雷格·斯诺

3

打字methods(simulate)还是getAnywhere("simulate")应该的。如果加载了lme4包,则前者提供了一些方法:

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

lm对象用于lm和glm模型。


2
谢谢,但这似乎是@Momo的答案。
EtienneLow-Décarie2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.