R 有没有办法降低McMcClogit使用的MCMC算法的接受率?
R 有没有办法降低McMcClogit使用的MCMC算法的接受率?,r,mcmc,R,Mcmc,R包MCMCpack通过mcmclclogit提供贝叶斯逻辑回归。如果verbose=TRUE,此函数将打印MCMC(Metropolis Hastings)算法的接受率,但它似乎不会在MCMC对象中返回它。是否有方法访问对象中的此信息 要测试使用: library(MCMCpack) set.seed(12345) n = 1000 x = rnorm(n) y = rbinom(n,1,1/(1+exp(-(1 + x)))) m = M
R
包MCMCpack
通过mcmclclogit
提供贝叶斯逻辑回归。如果verbose=TRUE
,此函数将打印MCMC(Metropolis Hastings)算法的接受率,但它似乎不会在MCMC
对象中返回它。是否有方法访问对象中的此信息
要测试使用:
library(MCMCpack)
set.seed(12345)
n = 1000
x = rnorm(n)
y = rbinom(n,1,1/(1+exp(-(1 + x))))
m = MCMClogit(y ~ x, burnin = 5000, mcmc = 1000,
tune = 1.3, B0 = 0, verbose = TRUE)
它打印的接受率为0.45533
,但我在返回的names(m)
返回NULL
或names(attributes(m))
中找不到此信息
[1] "dim" "mcpar" "class" "dimnames" "title" "y" "call"
帮助文件表明,
coda
包允许汇总来自mcmc
对象的信息(请参阅),但在pdf中搜索“接受”不会产生任何结果 这是一种黑客行为……但仍然是一种解决方案:
output = capture.output(MCMClogit(y ~ x, burnin = 5000, mcmc = 1000,
tune = 1.3, B0 = 0, verbose = TRUE))
library(stringr)
library(dplyr)
output %>%
paste0(collapse = "") %>%
str_extract("\\d+[.]\\d+(?=[@])") %>%
as.numeric()
# [1] "0.45533"
这使用capture.output
将控制台中从mcmcmclogit
打印的内容作为字符串存储在变量中,然后使用regex提取接受率。使正则表达式相对容易的是,接受率被@
所包围
OP提出了一个很好的观点,即通过使用此方法,
mcmclclogit
必须运行两次,如果模型需要很长时间才能运行,这是不可取的。可以做的一件事是使用如果您不喜欢capture.output
的行为,您可以使用sink
,它仍然返回结果,但将控制台输出重定向到文件中
sink(file="test.txt")
m <- MCMClogit(y ~ x, burnin = 5000, mcmc = 1000,
tune = 1.3, B0 = 0, verbose = TRUE)
sink()
out <- readLines("test.txt")
grep( "acceptance rate for beta was", out, value=T)
# [1] "The Metropolis acceptance rate for beta was 0.45533"
class(m)
# [1] "mcmc"
谢谢-如果我没记错的话,mcmc
对象在这里丢失了?代码需要运行两次。@tomka很好。查看我的编辑。我真希望有人能想出一个更好的方法,因为我经常犹豫使用你能说明它有什么危险吗?@tomka在这种情况下你应该没事,但在其他一些情况下,如果您不想或最终不想引用函数中的全局变量,而实际上希望引用作为参数传入的变量,则可能会意外更改全局变量。如果我理解正确,这不会将接受率的值保存到向量中,对吗?
output = capture.output(assign("m", MCMClogit(y ~ x, burnin = 5000, mcmc = 1000,
tune = 1.3, B0 = 0, verbose = TRUE),
envir = globalenv()))
sink(file="test.txt")
m <- MCMClogit(y ~ x, burnin = 5000, mcmc = 1000,
tune = 1.3, B0 = 0, verbose = TRUE)
sink()
out <- readLines("test.txt")
grep( "acceptance rate for beta was", out, value=T)
# [1] "The Metropolis acceptance rate for beta was 0.45533"
class(m)
# [1] "mcmc"
ar <- grep( "acceptance rate for beta was", out, value=T)
ar <- as.numeric( gsub("^.* was (.*)", "\\1", ar) )
ar
# [1] 0.45533