Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/457.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有没有办法降低McMcClogit使用的MCMC算法的接受率?_R_Mcmc - Fatal编程技术网

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