微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将矩阵数据输入到 brms 公式中?

如何解决如何将矩阵数据输入到 brms 公式中?

我正在尝试将矩阵数据输入 select A.language_id,A.language,COALESCE(B.counter,0)counter FROM tableA A LEFT OUTER JOIN ( SELECT language_id,COUNT(1)counter FROM tableB where userid=1 group by language_id )B ON A.language_id = B.language_id 函数以运行信号回归。 brm() 来自 brms 包,它提供了一个使用 Stan 拟合贝叶斯模型的接口。信号回归是当您在更大的模型中使用另一个协变量对一个协变量进行建模时,您可以像这样使用 brm 参数:by。问题是,我无法使用 'data' 参数输入我的矩阵,因为它只允许输入一个 model <- brm(response ~ s(matrix1,by = matrix2) + ...,data = Data) 对象。

这是我的代码以及我在试图绕过该限制时获得的错误...

首先,我的可重现代码导致模型构建:

data.frame

如上所述,由于“数据”只允许输入一个 data.frame 对象,因此我尝试了其他输入矩阵数据的方法。这些方法包括

1) 在 brm() 函数中使用 as.matrix() 制作矩阵

library(brms)
#100 rows,4 columns. Each cell contains a number between 1 and 10
Data <- data.frame(runif(100,1,10),runif(100,10))
#Assign names to the columns
names(Data) <- c("d0_10","d0_100","d0_1000","d0_10000")
Data$Density <- as.matrix(Data)%*%c(-1,10,5,1)
#the coefficients we are modelling
d <- c(-1,1) 
#Made a matrix with 4 columns with values 10,100,1000,10000 which are evaluation points. Rows are repeats of the same column numbers
Bins <- 10^matrix(rep(1:4,times = dim(Data)[1]),ncol = 4,byrow =T)
Bins

2) 在公式外制作矩阵,将其存储在一个变量中,然后在 brm() 函数调用该变量

signalregression.brms <- brm(Density ~ s(Bins,by=as.matrix(Data[,c(c("d0_10","d0_10000"))])),data = Data)
#Error in is(sexpr,"try-error") : 
  argument "sexpr" is missing,with no default

3) 使用 'data2' 参数输入包含矩阵的列表

Donuts <- as.matrix(Data[,"d0_10000"))])
signalregression.brms <- brm(Density ~ s(Bins,by=Donuts),data = Data)
#Error: The following variables can neither be found in 'data' nor in 'data2':
'Bins','Donuts'

以上都没有奏效;每个人都有自己的错误,很难对它们进行故障排除,因为我无法在网上找到在 brms 上下文中具有相似性质的答案或示例。

我能够很好地将上述技术用于 gam(),在 mgcv 包中 - 您不必使用“data”定义 data.frame,您可以调用在 gam() 之外定义的变量) 公式,您可以在 gam() 函数本身内部创建矩阵。见下文:

signalregression.brms <- brm(Density ~ s(Bins,by=donuts),data = Data,data2=list(Bins = 10^matrix(rep(1:4,byrow =T),donuts=as.matrix(Data[,"d0_10000"))])))
#Error in names(dat) <- object$term : 
  'names' attribute [1] must be the same length as the vector [0]

似乎 brms 不太灵活... :(

我的问题:有人对如何运行我的 brm() 函数有任何建议吗?

非常感谢!

解决方法

我对信号回归的理解有限,我不相信这是正确的,但我认为这至少是朝着正确方向迈出的一步。问题似乎是 brm() 期望其公式中的所有内容都是 data 中的一列。因此,我们可以通过确保 data 中存在我们想要的所有内容来编译模型:

library(tidyverse)
signalregression.brms = brm(Density ~
                              s(cbind(d0_10_bin,d0_100_bin,d0_1000_bin,d0_10000_bin),by = cbind(d0_10,d0_100,d0_1000,d0_10000),k = 3),data = Data %>%
                              mutate(d0_10_bin = 10,d0_100_bin = 100,d0_1000_bin = 1000,d0_10000_bin = 10000))

手工写出每一列有点烦人;我相信还有更通用的解决方案。

作为参考,这里是我安装的软件包版本:

map_chr(unname(unlist(pacman::p_depends(brms)[c("Depends","Imports")])),~ paste(.,": ",pacman::p_version(.),sep = ""))
 [1] "Rcpp: 1.0.6"           "methods: 4.0.3"        "rstan: 2.21.2"         "ggplot2: 3.3.3"       
 [5] "loo: 2.4.1"            "Matrix: 1.2.18"        "mgcv: 1.8.33"          "rstantools: 2.1.1"    
 [9] "bayesplot: 1.8.0"      "shinystan: 2.5.0"      "projpred: 2.0.2"       "bridgesampling: 1.1.2"
[13] "glue: 1.4.2"           "future: 1.21.0"        "matrixStats: 0.58.0"   "nleqslv: 3.3.2"       
[17] "nlme: 3.1.149"         "coda: 0.19.4"          "abind: 1.4.5"          "stats: 4.0.3"         
[21] "utils: 4.0.3"          "parallel: 4.0.3"       "grDevices: 4.0.3"      "backports: 1.2.1"

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。