如何传递列表元素以在R中建模?

约克

我对使用列表非常陌生,因此如果这个问题听起来很愚蠢,我深表歉意。

我从最初的459,046位客户中创建了一个函数,该函数将基础拆分并存储在列表的多个元素中。

sampled_list <- baseSample(dataset = clv_df_cbs, sample.size = 10000, seed = 12345)

执行此功能(baseSample),您将获得一个新的对象列表,其中包含互斥的客户组(每个组将由10,000个客户组成-除了最后一个可能较小的客户,取决于初始数量)

> sampled_list <- baseSample(dataset = clv_df_cbs, sample.size = 10000, seed = 12345)
[1] "Seed: 12345"
[1] "Total groups created: 46"
[1] "Group size: 10000"

在这种情况下,输出是存储在名为sample_list的对象中的46个元素的列表

现在,我想将这46个元素中的每一个传递给BTYD模型,该模型将预测未来90天内的交易数量(根据输入的经验得出)。

我之所以无法将完整的数据集传递给BTYD模型,是因为该模型大量使用mcmc,因此计算时间过长,导致模型无法提供任何输出。因此,我决定多次运行同一模型(在足够大的样本上)来生成预测,直到我设法将所有基础都作为模型输入。

需要对每个元素执行的操作如下

# Estimate parameters for element1 of the list
pggg.draws1 <- pggg.mcmc.DrawParameters(element1, 
                                           mcmc = 1000, # number of MCMC steps
                                           burnin = 250, # number of initial MCMC steps which are discarded
                                           thin = 10, # only every thin-th MCMC step will be returned
                                           chains = 2, # number of MCMC chains to be run
                                           trace = 50) # print logging step every trace iteration

# generate draws for holdout period
pggg.xstar.draws1 <- mcmc.DrawFutureTransactions(element1, pggg.draws1)

# conditional expectations
element1$xstar.pggg <- apply(pggg.xstar.draws1, 2, mean)

# P(active)
element1$pactive.pggg <- mcmc.PActive(pggg.xstar.draws1)

# P(alive)
element1$palive.pggg <- mcmc.PAlive(pggg.draws1)

# show estimates for first few customers
head(element1[, c("x", "t.x", "x.star",
                            "xstar.pggg", "pactive.pggg", "palive.pggg")],50)

# report median cohort-level parameter estimates
round(apply(as.matrix(pggg.draws1$level_2), 2, median), 3)

# report mean over median individual-level parameter estimates
median.est1 <- sapply(pggg.draws1$level_1, function(draw) {
  apply(as.matrix(draw), 2, median)
})
round(apply(median.est1, 1, mean), 3)

理想情况下,应将输出直接存储到新的data.frame中-这样我就可以检索ID和预测(以及最初包含在数据集中的其他内容)。

在此之下,一些模拟数据可用于公开数据集。

library(BTYDplus)
library(tidyverse)
data("groceryElog")
dataset<-elog2cbs(groceryElog, T.cal = "2006-12-01") 


# FUNCTION baseSample ####
baseSample <- function(dataset, sample.size, seed=NULL) {
  seed.value <- if(is.null(seed)) {
    as.numeric(format(Sys.Date(),"%Y"))*10000+as.numeric(format(Sys.Date(),"%m"))*100+as.numeric(format(Sys.Date(),"%d"))
  } else {
    seed
  }

  set.seed(seed.value)

  # RE-ORDER DATA FRAME (SAME LENGTH)
  data <- with(dataset, dataset[order(sample(cust, nrow(dataset))),])

  # BUILD A LIST OF DFs 
  set.sample.size <- sample.size
  data$cycles_group <- paste0("sample_", ceiling(1:nrow(data)/set.sample.size))

  df_list <- split(data, data$cycles_group)

  print(paste0("Seed: ", seed.value))
  print(paste0("Total groups created: ", length(unique(data$cycles_group))))
  print(paste0("Group size: ", set.sample.size))
  return(df_list)
  #print(df_list)
}

# ** OUTPUT: Base split in lists ####
sampled_list <- baseSample(dataset = dataset, sample.size = 100, seed = 12345)

谢谢

乌尔费尔德

在基础R中,您可以用来lapply在列表的元素上迭代一个函数,并使用这些迭代的结果返回一个新列表。使用示例代码生成名为sampled_list...的列表后

# turn the code for the operations you want to perform on each list element into a function,
# with a couple of minor tweaks
thingy <- function(i) {

  # Estimate parameters for element1 of the list
  pggg.draws1 <- pggg.mcmc.DrawParameters(i, 
                                          mcmc = 1000, # number of MCMC steps
                                          burnin = 250, # number of initial MCMC steps which are discarded
                                          thin = 10, # only every thin-th MCMC step will be returned
                                          chains = 2, # number of MCMC chains to be run
                                          trace = 50) # print logging step every trace iteration

  # generate draws for holdout period
  pggg.xstar.draws1 <- mcmc.DrawFutureTransactions(i, pggg.draws1)

  # conditional expectations
  i$xstar.pggg <- apply(pggg.xstar.draws1, 2, mean)

  # P(active)
  i$pactive.pggg <- mcmc.PActive(pggg.xstar.draws1)

  # P(alive)
  i$palive.pggg <- mcmc.PAlive(pggg.draws1)

  # show estimates for first few customers [commenting out for this iterated version]
  # head(element1[, c("x", "t.x", "x.star", "xstar.pggg", "pactive.pggg", "palive.pggg")],50)

  # report median cohort-level parameter estimates
  round(apply(as.matrix(pggg.draws1$level_2), 2, median), 3)

  # report mean over median individual-level parameter estimates
  median.est1 <- sapply(pggg.draws1$level_1, function(draw) {
    apply(as.matrix(draw), 2, median)
  })

  # get the bits you want in a named vector
  z <- round(apply(median.est1, 1, mean), 3)

  # convert that named vector of results into a one-row data frame to make collapsing easier
  data.frame(as.list(z))

}

# now use lapply to iterate that function over the elements of your list
results <- lapply(sampled_list, thingy)

# now bind the results into a data frame
boundresults <- do.call(rbind, results)

结果(花了一段时间):

              k lambda    mu          tau    z
sample_1  4.200  0.174 0.091      102.835 0.27
sample_10 3.117  0.149 0.214      128.143 0.29
sample_11 4.093  0.154 0.115      130.802 0.30
sample_12 4.191  0.142 0.053      114.108 0.33
sample_13 2.605  0.155 0.071      160.743 0.35
sample_14 9.196  0.210 0.084      111.747 0.36
sample_15 2.005  0.145 0.091      298.872 0.40
sample_16 2.454  0.111 0.019 78731750.121 0.70
sample_2  2.808  0.138 0.059      812.278 0.40
sample_3  4.327  0.166 0.116      559.318 0.42
sample_4  9.266  0.166 0.038      146.283 0.40
sample_5  3.277  0.157 0.073      105.915 0.33
sample_6  9.584  0.184 0.086      118.299 0.31
sample_7  4.244  0.189 0.118       54.945 0.23
sample_8  4.388  0.147 0.085      325.054 0.36
sample_9  7.898  0.181 0.052       83.892 0.33

您还可以将最后两个步骤合并为的一行do.call(rbind, lapply(...))如果要将结果表中的行名称设置为一列,则可以boundresults$sample <- row.names(boundresults)在创建该表后执行。如果您不喜欢在环境中创建新对象,则可以将该函数放在对的调用中lapply,即,lapply(sampled_list, function(i) { [your code] }).

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何传递特定元素以在反应中起作用

如何解析列表中的两个元素以创建一个新元素

如何使节点列表中除目标元素以外的所有元素消失?

如何从列表列表中查找公共元素以保持出现顺序?

从矩阵中按列选择元素以在 R 中创建新矩阵列表

如何获取列表中字符串的第一个元素以及列表中的其余元素?

如何比较列表中的两个元素以找到最低价格?

如何使列表的最后一个元素以点结尾,其他元素以逗号结尾?

传递函数元素以在 js 中呈现

R查找列表元素以從pdf中提取表格

Elixir-如何获取除列表中的最后一个元素以外的所有元素?

通过引用传递图形(列表列表)作为参数,我想向每个列表中添加元素以仅在此函数内使用

动态添加列表元素以在ember中查看

在列表中追加元素以转换为JSON

在列表中顺序选择几个元素以进行循环调度

链接列表python中的相似元素以创建字典

如何识别DOM中的每个元素以及元素的顺序?

迭代元素以创建列表

按位置比较两个列表的元素以测试r中的通用字符串

(序言)我该如何递归地重新排列列表中的元素以给出答案的多个结果状态?

如何在C ++中基于第二个元素以降序对对列表进行排序

如何在二维列表中添加元素以再派生一个数组?

如何在React中为列表建模

更改列表列表中的元素以匹配 python 中的不同列表

如何加快处理R中的元素列表?

如何从R中的列表访问元素?

如何删除R中列表的元素?

如何訪問R中的列表元素?

我如何编写自己的元素以响应 DynamicResource 中的更改?