R 使用data.table迭代创建一组(可能多个)后验分布

R 使用data.table迭代创建一组(可能多个)后验分布,r,data.table,bayesian,R,Data.table,Bayesian,基本问题是:如何使用现有data.table的一列中的值作为列名创建新的空data.table?因此: set.seed(1) DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x") > DT x y 1: a 0.2655087 2: b 0.3721239 3: c 0.5728534 4: d 0.9082078

基本问题是:如何使用现有data.table的一列中的值作为列名创建新的空data.table?因此:

    set.seed(1)
    DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x")
    > DT 
       x         y
    1: a 0.2655087
    2: b 0.3721239
    3: c 0.5728534
    4: d 0.9082078
    5: e 0.2016819
    6: f 0.8983897
我想自动创建如下所示的data.table(带数字列):

将问题放在标题的上下文中:DT[,x]中的字符代表个人;DT[,y]中的值是当前迭代的后验参数估计值。我这样组织它是因为它似乎可以快速而直接地运行每行的计算(计算可能性、接受/拒绝更新值等等)

但是,我希望将y中的值作为新行存储在另一个表中(个人(x)作为列,每个迭代的值(y)存储在一行中)。这有助于下游,例如,直接创建mcmc对象

主要的问题是,我不知道如何自动创建一个空的data.table来保存后验分布,将DT[,x]中的值作为列名。在第一次迭代之前,我希望它看起来像这样:

    POST<-data.table(a=numeric(0),b=numeric(0),c=numeric(0),
    d=numeric(0),e=numeric(0),f=numeric(0))
    > POST
    Empty data.table (0 rows) of 6 cols: a,b,c,d,e,f
#Create a list outside the loop
POST<- list()

#For loop
#First iteration:
    POST$1<-data.table(t(DT[,y]));setattr(
    POST$1, 'names', DT[,x])
#Second iteration:
    POST$2<-data.table(t(DT[,y]));setattr(
    POST$2, 'names', DT[,x])

#End of loop
> rbindlist(POST, use.names=TRUE)
           a         b         c         d         e         f
1: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
2: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
POST
空数据表(0行),共6列:a、b、c、d、e、f
但我可能有很多人,我想自动将DT中的x列转换为POST的列名。有什么建议吗

要在每次迭代后附加新的DT[,y]值,这似乎是可行的:

    setkey(DT,x)
    POST<-rbind(POST,data.table(t(DT[,.(y)])),use.names=FALSE)
setkey(DT,x)

POST目标是在每次贝叶斯分析迭代的后验分布中存储一组可接受的参数值,从而创建一个包含潜在大量独立参数的完整后验分布的对象。可能性计算和验收/拒收按行进行,以提高效率(有几个步骤,此处未指定),然后将结果存储在列中:

#x contains individual reference numbers, y contains the parameter estimate.
#Initial values:
set.seed(1)
DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x")
> DT 
  x         y
1: a 0.7581031
2: b 0.7244989
3: c 0.9437248
4: d 0.5476466
5: e 0.7117439
6: f 0.3889051

#Create a list object to store the posterior
POST<-list()

#For loop
for(k in 1:10){
#After various calculations, DT has a new set of accepted posterior values.
#Just as a fake example:
DT[,y:=runif(6)]
#Add these to POST.
setkey(DT,x)
POST[[k]]<-data.table(t(DT[,y]));setattr(POST[[k]], 'names', DT[,x])
}#End of loop

#Create a mcmc object from the set of posterior distributions.
require(coda)
POST<-mcmc(rbindlist(POST, use.names=TRUE))
> POST
Markov Chain Monte Carlo (MCMC) output:
Start = 1 
End = 10 
Thinning interval = 1 
               a          b         c         d          e          f
 [1,] 0.51116978 0.20754511 0.2286581 0.5957120 0.57487220 0.07706438
 [2,] 0.03554058 0.64279549 0.9286152 0.5980924 0.56090075 0.52602772
 [3,] 0.98509522 0.50764182 0.6827881 0.6015412 0.23886868 0.25816593
 [4,] 0.72930962 0.45257083 0.1751268 0.7466983 0.10498764 0.86454495
 [5,] 0.61464497 0.55715954 0.3287773 0.4531314 0.50044097 0.18086636
 [6,] 0.52963060 0.07527575 0.2777559 0.2126995 0.28479048 0.89509410
 [7,] 0.44623532 0.77998489 0.8806190 0.4131242 0.06380848 0.33548749
 [8,] 0.72372595 0.33761533 0.6304141 0.8406146 0.85613166 0.39135928
 [9,] 0.38049389 0.89544543 0.6443158 0.7410786 0.60530345 0.90308161
 [10,] 0.29373016 0.19126011 0.8864509 0.5033395 0.87705754 0.18919362
#x包含单个参考号,y包含参数估计值。
#初始值:
种子(1)
DT=数据表(x=c(“a”、“b”、“c”、“d”、“e”、“f”),y=runif(6),key=“x”)
>DT
xy
1:a 0.7581031
2:b 0.7244989
3:c 0.9437248
4:d 0.5476466
5:e 0.7117439
6:f 0.3889051
#创建一个列表对象来存储数据

Post您在循环中应用的函数是什么?@Beauvel上校感谢您的回答,它帮助我产生了一些有用的东西(尽管毫无疑问,语法仍然可以改进),我已经详细介绍了这些答案。我不知道约定是什么,但我不想给出函数的具体细节。这是一个多步骤的过程,最初涉及一个较大的(长格式)data.table,每个人有许多行(每个人只估计一个参数,但它基于大量变量的值)。
#Create a list outside the loop
POST<- list()

#For loop
#First iteration:
    POST$1<-data.table(t(DT[,y]));setattr(
    POST$1, 'names', DT[,x])
#Second iteration:
    POST$2<-data.table(t(DT[,y]));setattr(
    POST$2, 'names', DT[,x])

#End of loop
> rbindlist(POST, use.names=TRUE)
           a         b         c         d         e         f
1: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
2: 0.2655087 0.3721239 0.5728534 0.9082078 0.2016819 0.8983897
#x contains individual reference numbers, y contains the parameter estimate.
#Initial values:
set.seed(1)
DT = data.table(x=c("a","b","c","d","e","f"), y=runif(6),key="x")
> DT 
  x         y
1: a 0.7581031
2: b 0.7244989
3: c 0.9437248
4: d 0.5476466
5: e 0.7117439
6: f 0.3889051

#Create a list object to store the posterior
POST<-list()

#For loop
for(k in 1:10){
#After various calculations, DT has a new set of accepted posterior values.
#Just as a fake example:
DT[,y:=runif(6)]
#Add these to POST.
setkey(DT,x)
POST[[k]]<-data.table(t(DT[,y]));setattr(POST[[k]], 'names', DT[,x])
}#End of loop

#Create a mcmc object from the set of posterior distributions.
require(coda)
POST<-mcmc(rbindlist(POST, use.names=TRUE))
> POST
Markov Chain Monte Carlo (MCMC) output:
Start = 1 
End = 10 
Thinning interval = 1 
               a          b         c         d          e          f
 [1,] 0.51116978 0.20754511 0.2286581 0.5957120 0.57487220 0.07706438
 [2,] 0.03554058 0.64279549 0.9286152 0.5980924 0.56090075 0.52602772
 [3,] 0.98509522 0.50764182 0.6827881 0.6015412 0.23886868 0.25816593
 [4,] 0.72930962 0.45257083 0.1751268 0.7466983 0.10498764 0.86454495
 [5,] 0.61464497 0.55715954 0.3287773 0.4531314 0.50044097 0.18086636
 [6,] 0.52963060 0.07527575 0.2777559 0.2126995 0.28479048 0.89509410
 [7,] 0.44623532 0.77998489 0.8806190 0.4131242 0.06380848 0.33548749
 [8,] 0.72372595 0.33761533 0.6304141 0.8406146 0.85613166 0.39135928
 [9,] 0.38049389 0.89544543 0.6443158 0.7410786 0.60530345 0.90308161
 [10,] 0.29373016 0.19126011 0.8864509 0.5033395 0.87705754 0.18919362