我正在尝试将矩阵数据输入到brm()
函数中以运行信号回归。brm
来自 brms 包,它提供了一个接口来使用 Stan 拟合贝叶斯模型。信号回归是指在更大的模型中使用另一个协变量对一个协变量进行建模,并且使用如下by
参数:model <- brm(response ~ s(matrix1, by = matrix2) + ..., 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 具有相似性质的答案或示例。
我能够在 mgcv 包中对 gam() 使用上述技术——您不必使用“数据”定义 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() 函数运行有任何建议吗?
非常感谢!