我试图将矩阵数据输入到brm()函数中,以运行信号回归。brm来自brms包,它提供了一个接口来适应使用Stan的贝叶斯模型。信号回归是指在较大的模型中使用另一个协变量对一个协变量进行建模,并使用如下所示的by参数:model <- brm(response ~ s(matrix1, by = matrix2) + ..., data = Data)。问题是,我不能使用'data‘参数输入矩阵,因为它只允许输入一个data.frame对象。
以下是我的代码和我试图绕过这个约束时所得到的错误.
首先,我的可复制代码导致了模型的建立:
library(brms)
#100 rows, 4 columns. Each cell contains a number between 1 and 10
Data <- data.frame(runif(100,1,10),runif(100,1,10),runif(100,1,10),runif(100,1,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,10,5,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如上所述,由于“数据”只允许输入一个data.frame对象,所以我尝试了其他输入矩阵数据的方法。这些方法包括:
1)使用as.matrix()在brm()函数中生成矩阵
signalregression.brms <- brm(Density ~ s(Bins,by=as.matrix(Data[,c(c("d0_10","d0_100","d0_1000","d0_10000"))])),data = Data)
#Error in is(sexpr, "try-error") :
argument "sexpr" is missing, with no default( 2)在公式外生成矩阵,将其存储在变量中,然后在brm()函数中调用该变量
Donuts <- as.matrix(Data[,c(c("d0_10","d0_100","d0_1000","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'3)使用“data2”参数输入包含矩阵的列表
signalregression.brms <- brm(Density ~ s(Bins,by=donuts),data = Data,data2=list(Bins = 10^matrix(rep(1:4,times = dim(Data)[1]),ncol = 4,byrow =T),donuts=as.matrix(Data[,c(c("d0_10","d0_100","d0_1000","d0_10000"))])))
#Error in names(dat) <- object$term :
'names' attribute [1] must be the same length as the vector [0]上述任何一个都不起作用;每个人都有自己的错误,而且很难排除它们,因为我无法在网上找到在brms上下文中具有类似性质的答案或示例。
对于gam(),在mgcv包中,我能够很好地使用上述技术--您不必使用'data‘定义一个data.frame,您可以调用gam()公式之外定义的变量,并且可以在gam()函数本身内创建矩阵。见下文:
library(mgcv)
signalregression2 <- gam(Data$Density ~ s(Bins,by = as.matrix(Data[,c("d0_10","d0_100","d0_1000","d0_10000")]),k=3))
#Works!似乎brms不那么灵活..。:(
我的问题:有谁对如何运行我的brm()函数有任何建议吗?
非常感谢!
发布于 2021-06-25 21:32:48
我对信号回归的理解是有限的,我不相信这是正确的,但我认为这至少是朝着正确的方向迈出了一步。问题似乎是,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"https://stackoverflow.com/questions/68077237
复制相似问题