我正在运行一些不同的蒙特卡罗模拟,所有模拟都涉及生成一些数据,拟合模型,以及从模型的拟合中捕获几个输出变量。通常生成数据以使得若干特征变化(例如,项目数量,样本大小),并且模型拟合以使得若干其他特征变化(例如,估计方法,模型错误指定)。我对生成数据或如何实际适合模型没有任何疑问。但是,我知道我填充结果数据框的方法效率非常低,我希望能帮助你改进它。我通常的方法如下:
1)创建具有与我必须适合的模型一样多的行的数据框(例如,迭代次数*不同的项目长度*不同的样本大小长度*不同的估计方法*不同类型的模型错误指定),以及尽可能多的列我需要包含识别变量(样本大小,项目数等)并捕获所有输出。
2)使用for循环识别条件的特定组合和所述组合的特定迭代,拟合模型,并填充数据框的相应行。
所以我可以从看起来像这样的东西开始:
> head(df)
fit.model n.sample n.item distr.cond estim iteration df.chisq obt.chisq
1 1 100 3 1 ML 1 NA NA
1.1 1 100 3 1 ML 2 NA NA
1.2 1 100 3 1 ML 3 NA NA
1.3 1 100 3 1 ML 4 NA NA
1.4 1 100 3 1 ML 5 NA NA
1.5 1 100 3 1 ML 6 NA NA
其中最后两列捕获结果并需要填写,前六列是唯一标识每一行所必需的。然后我使用for循环逐行,选择该迭代的识别特征(这允许我找到适当的数据文件并读入它,以及指定如何拟合模型),进行模型拟合,然后将NA
列写入所需的输出。然后,我只使用获得的值填充剩余的NA
,例如使用df$obt.chisq[i] <- fitMeasures(fit,"chisq")
,其中函数fitMeasures
从结果拟合模型fit
中提取特定值。
可以对此进行矢量化吗?我忘记了术语,但我认识到在这种情况下,每次迭代完全独立于彼此的迭代,因此特定的顺序并不重要。现在是改变方法的时候了!任何帮助将不胜感激。