【问题标题】:Can I vectorise/vectorize this simple cohort retention model in R?我可以在 R 中对这个简单的队列保留模型进行矢量化/矢量化吗?
【发布时间】:2014-05-28 09:50:37
【问题描述】:

我正在创建一个简单的基于同类群组的用户留存模型,该模型基于每天出现的新用户数量,以及用户在第 0 天 (100%)、第 1 天、第 2 天等再次出现的可能性。我想知道每天活跃的用户数量。我正在尝试对此进行矢量化并陷入困境。这是一个玩具模型。

rvec <- c(1, .8, .4);   #retention for day 0, 1,2 (day 0 = 100%, and so forth)
newvec <- c(10, 10, 10); #new joiners for day 0, 1, 2  (might be different)
playernumbers <- matrix(0, nrow = 3, ncol = 3);

# I want to fill matrix playernumbers  such that sum of each row gives 
# the total playernumbers on day rownumber-1
# here is a brute force method  (could be simplified via a loop or two)
# but what I am puzzled about is whether there is a way to fully vectorise it    
playernumbers[1,1] <- rvec[1] * newvec[1];
playernumbers[2,1] <- rvec[2] * newvec[1];
playernumbers[3,1] <- rvec[3] * newvec[1];
playernumbers[2,2] <- rvec[1] * newvec[2];
playernumbers[3,2] <- rvec[2] * newvec[2];
playernumbers[3,3] <- rvec[1] * newvec[3];
playernumbers

我无法弄清楚如何完全矢量化它。我可以看到我可以如何按列进行操作,依次使用每个列号来指示(a)要更新哪些行(列号:nrows),以及(b)要乘以哪个 newvec 索引值。但我不确定这是否值得做,因为对我来说循环更清晰。但是我错过了一个完全矢量化的形式吗?谢谢!

【问题讨论】:

  • 我不确定我的理解是否正确,所以我只是发表评论,但也许这会有所帮助:apply(diag(newvec), 2, cummax) * matrix(c(rvec, 0), length(rvec), length(newvec))
  • 感谢亚历克西斯!另一个我的“我理解它的图表”集合;-)

标签: r vectorization retention


【解决方案1】:

如果你不坚持你奇怪的索引逻辑,你可以简单地计算外积:

outer(rvec, newvec)
#     [,1] [,2] [,3]
#[1,]   10   10   10
#[2,]    8    8    8
#[3,]    4    4    4

在外积中,向量 1 的第二个元素和向量 2 的第二个元素的乘积位于 [2,2] 处。你把它放在[3,2]。为什么?

你的结果:

playernumbers
#     [,1] [,2] [,3]
#[1,]   10    0    0
#[2,]    8   10    0
#[3,]    4    8   10

编辑:

这应该和你的循环一样:

rvec <- c(1, .8, .4)   
newvec <- c(10, 20, 30)

tmp <- outer(rvec, newvec)
tmp <- tmp[, ncol(tmp):1]
tmp[lower.tri(tmp)] <- 0
tmp <- tmp[, ncol(tmp):1]
res <- tmp*0
res[lower.tri(res, diag=TRUE)] <- tmp[tmp!=0]
#     [,1] [,2] [,3]
#[1,]   10    0    0
#[2,]    8   20    0
#[3,]    4   16   30

rowSums(res)
#[1] 10 28 50

【讨论】:

  • 除了排序混乱,你可以通过调用lower.tri(playernumbers,diag=TRUE)得到他的三角结果
  • 这种情况的语义是每天都有新用户加入,而他们重新访问的速度每天都在下降。所以我的第 1 行显示访问的人,他们都出生在第 1 天。第 2 行显示第 1 天出生的人重新访问 p = rvec[2],加上新的加入者,总用户数为 18。等等。 Roland 和 Carl 所说的“奇怪的索引逻辑”和“排序混乱”实际上正确地反映了这种情况的语义。我正在寻找的是一种更加 R 向量化的方式来表达这一点。我看不到外部产品如何计算我需要的东西。
  • n.b.如果您的意思是我将第 0 天用作奇怪的索引,这在文献中是传统的,但如果它具有误导性,我们可以忘记它
  • 谢谢罗兰! (我需要研究它并用图表完成它,然后才能完全理解它,但它看起来不错!)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
相关资源
最近更新 更多