【发布时间】:2017-03-12 15:15:58
【问题描述】:
我正在尝试在 R 中模拟大量分布,因为我正在为不同的分布参数生成分位数。我想创建一个包含大量这些参数组合的数据集。例如(使用正态分布):
df<-data.frame(matrix(ncol=104,nrow=2))
colnames(df)<-c(as.character(seq(0,1,0.01),"type","mean","sd"))
这给了我一个数据框,其中包含 0.01 步中从 0 到 1 的分位数的 101 列以及“type”、“mean”和“sd”的三个附加列(这是使用正态分布时的唯一参数)。
现在让我们为正态分布族中的两个成员生成分位数:
qnorm.0.1<-qnorm(seq(0,1,0.01),0,1) #normal distribution / mean=0 /sd=1
qnorm.0.2<-qnorm(seq(0,1,0.01),0,2) #normal distribution / mean=0 /sd=2
现在我可以用两个向量填充我的数据框了:
df[1,]<-c(qnorm.0.1,"normal","0","1")
df[2,]<-c(qnorm.0.2,"normal","0","2")
这为我提供了我需要的格式。 但是,当我试图创建具有许多参数组合的大型数据集(例如,平均值从 1 到 10000 和 sd 从 1 到 10000 的每个组合)时,我将不得不想出一种自动化这个过程的方法。任何帮助表示赞赏。
谢谢!
【问题讨论】:
-
你为什么不发布你的代码来展示你想用少量的参数组合做什么。
-
您在寻找
?expand.grid吗? -
好吧,对于我的示例,您可以使用 for 循环,例如:
for (i in 1:2) { df[i,]<-c(qnorm(seq(0,1,0.01),0,i),"normal","0",i) }但是,我想使用超过 1 层的 for 循环和大量数字会使代码非常慢,很遗憾。 -
@Ben Bolker:谢谢你,这已经很有帮助了。 expand.grid 允许我将 for 循环保留在一层:
comb<-expand.grid(c(0:1),c(1:2)) for (i in 1:4){ df[i,]<-c(qnorm(seq(0,1,0.01),comb$Var1[i],comb$Var2[i]),"normal",comb$Var1[i],comb$Var2[i]) }但是,有没有办法更有效地做到这一点(即没有 for 循环)? -
我在想,你需要的是参数组合还是排列?因为组合会导致例如 1 mean, 2 sd,但不是相反,我认为你需要排列,不是吗?
标签: r