R2WinBUGS - 逻辑回归与模拟数据
我只是想知道是否有人有一些R代码使用包R2WinBUGS来运行逻辑回归 - 理想情况下用模拟数据来生成“真值”和两个连续的协变量。R2WinBUGS - 逻辑回归与模拟数据
谢谢。
基督教
PS:
潜在的代码来生成通过r2winbugs人工数据(一维的情况下),然后运行WinBUGS软件(它不工作还没有)。
library(MASS)
library(R2WinBUGS)
setwd("d:/BayesianLogisticRegression")
n.site <- 150
X1<- sort(runif(n = n.site, min = -1, max =1))
xb <- 0.0 + 3.0*X1
occ.prob <- 1/(1+exp(-xb))
plot(X1, occ.prob,xlab="X1",ylab="occ.prob")
true.presence <- rbinom(n = n.site, size = 1, prob = occ.prob)
plot(X1, true.presence,xlab="X1",ylab="true.presence")
# combine data as data frame and save
data <- data.frame(X1, true.presence)
write.matrix(data, file = "data.txt", sep = "\t")
sink("model.txt")
cat("
model {
# Priors
alpha ~ dnorm(0,0.01)
beta ~ dnorm(0,0.01)
# Likelihood
for (i in 1:n) {
C[i] ~ dbin(p[i], N) # Note p before N
logit(p[i]) <- alpha + beta *X1[i]
}
}
",fill=TRUE)
sink()
# Bundle data
win.data <- list(mass = X1, n = length(X1))
# Inits function
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1))}
# Parameters to estimate
params <- c("alpha", "beta")
# MCMC settings
nc <- 3 #Number of Chains
ni <- 1200 #Number of draws from posterior
nb <- 200 #Number of draws to discard as burn-in
nt <- 2 Thinning rate
# Start Gibbs sampling
out <- bugs(data=win.data, inits=inits, parameters.to.save=params,
model.file="model.txt", n.thin=nt, n.chains=nc, n.burnin=nb,
n.iter=ni, debug = TRUE)
你的脚本就是这样做的。这几乎是工作,它只是需要一个简单的改变,使其工作:
win.data <- list(X1 = X1, n = length(X1), C = true.presence, N = 1)
其中定义的数据去WinBUGS软件。变量C必须填写true.presence,根据您生成的数据,N必须为1 - 请注意,这是N = 1的二项分布的特例,称为Bernoulli - 一个简单的“硬币翻转”。
这里是输出:
> print(out, dig = 3)
Inference for Bugs model at "model.txt", fit using WinBUGS,
3 chains, each with 1200 iterations (first 200 discarded), n.thin = 2
n.sims = 1500 iterations saved
mean sd 2.5% 25% 50% 75% 97.5% Rhat n.eff
alpha -0.040 0.221 -0.465 -0.187 -0.037 0.114 0.390 1.001 1500
beta 3.177 0.478 2.302 2.845 3.159 3.481 4.165 1.000 1500
deviance 136.438 2.059 134.500 135.000 135.800 137.200 141.852 1.001 1500
你看,所述参数对应于用于生成所述数据的参数。另外,如果您与频率主义者解决方案进行比较,您会发现它相对应。
EDIT:但典型物流(〜二项式)回归将测量与某些上限值N [1]一些计数,它会允许不同的N [1]对于每个观测。例如说少年对全体人口的比例(N)。这就要求只是指数模型中加入N:
C[i] ~ dbin(p[i], N[i])
数据生成看起来是这样的:
N = rpois(n = n.site, lambda = 50)
juveniles <- rbinom(n = n.site, size = N, prob = occ.prob)
win.data <- list(X1 = X1, n = length(X1), C = juveniles, N = N)
(编辑结束)
对于来自更多的例子人口生态学见books of Marc Kéry(生态学家介绍WinBUGS,特别是使用WinBUGS的贝叶斯种群分析:层次分析法,这是一本很棒的书)。
完整的剧本我用 - 你的修正后的脚本是列在这里(末尾与频率论的解决方案比较):
#library(MASS)
library(R2WinBUGS)
#setwd("d:/BayesianLogisticRegression")
n.site <- 150
X1<- sort(runif(n = n.site, min = -1, max =1))
xb <- 0.0 + 3.0*X1
occ.prob <- 1/(1+exp(-xb)) # inverse logit
plot(X1, occ.prob,xlab="X1",ylab="occ.prob")
true.presence <- rbinom(n = n.site, size = 1, prob = occ.prob)
plot(X1, true.presence,xlab="X1",ylab="true.presence")
# combine data as data frame and save
data <- data.frame(X1, true.presence)
write.matrix(data, file = "data.txt", sep = "\t")
sink("tmp_bugs/model.txt")
cat("
model {
# Priors
alpha ~ dnorm(0,0.01)
beta ~ dnorm(0,0.01)
# Likelihood
for (i in 1:n) {
C[i] ~ dbin(p[i], N) # Note p before N
logit(p[i]) <- alpha + beta *X1[i]
}
}
",fill=TRUE)
sink()
# Bundle data
win.data <- list(X1 = X1, n = length(X1), C = true.presence, N = 1)
# Inits function
inits <- function(){ list(alpha=rlnorm(1), beta=rlnorm(1))}
# Parameters to estimate
params <- c("alpha", "beta")
# MCMC settings
nc <- 3 #Number of Chains
ni <- 1200 #Number of draws from posterior
nb <- 200 #Number of draws to discard as burn-in
nt <- 2 #Thinning rate
# Start Gibbs sampling
out <- bugs(data=win.data, inits=inits, parameters.to.save=params,
model.file="model.txt", n.thin=nt, n.chains=nc, n.burnin=nb,
n.iter=ni,
working.directory = paste(getwd(), "/tmp_bugs/", sep = ""),
debug = TRUE)
print(out, dig = 3)
# Frequentist approach for comparison
m1 = glm(true.presence ~ X1, family = binomial)
summary(m1)
# normally, you should do it this way, but the above also works:
#m2 = glm(cbind(true.presence, 1 - true.presence) ~ X1, family = binomial)
由于您的示例不是典型的逻辑回归,因此我添加了有关这种典型回归的注释。请参阅编辑。 – TMS
感谢Tomas T.这正是我所需要的。我已经有这本书:为生态学家介绍WinBUGS。这就是我从中取得一些代码的地方。我不得不承认,我还没有完全理解数据生成。通常我会在链接函数的输出中应用一个阈值(例如,如果概率> = 0.5,那么1个0代表true.presence)。二项分布是否引入了另一层随机性? – cs0815
顺便说一句,最后我想调整这个存在唯一的情况下,这里讨论:在存在数据的贝叶斯建模数据增强(你可以访问它?)。我可以张贴这是另一个问题,并会非常感激,如果你可以帮助我这个......非常感谢! – cs0815
第140页http://books.google.ca/books?id的= WpeZyTc6U94C给你一个部分答案。谷歌搜索“逻辑回归WinBUGS”也得到很多点击 - 没有看到他们都怀疑,但可能有代码存在。你可以发布你迄今为止尝试过的吗?另请参阅'glmmBUGS'包... –
我正在寻找特别为R代码(包R2WinBUGS)与人造数据生成。 – cs0815
嗨csetzkorn!你知道Marc Kery?从上一个问题看来,您使用的是Marc Kery的书中的代码:-)他在此有很多示例... – TMS