2011-11-24 263 views
6

我只是想知道是否有人有一些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) 
+1

第140页http://books.google.ca/books?id的= WpeZyTc6U94C给你一个部分答案。谷歌搜索“逻辑回归WinBUGS”也得到很多点击 - 没有看到他们都怀疑,但可能有代码存在。你可以发布你迄今为止尝试过的吗?另请参阅'glmmBUGS'包... –

+0

我正在寻找特别为R代码(包R2WinBUGS)与人造数据生成。 – cs0815

+0

嗨csetzkorn!你知道Marc Kery?从上一个问题看来,您使用的是Marc Kery的书中的代码:-)他在此有很多示例... – TMS

回答

5

你的脚本就是这样做的。这几乎是工作,它只是需要一个简单的改变,使其工作:

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) 
+1

由于您的示例不是典型的逻辑回归,因此我添加了有关这种典型回归的注释。请参阅编辑。 – TMS

+0

感谢Tomas T.这正是我所需要的。我已经有这本书:为生态学家介绍WinBUGS。这就是我从中取得一些代码的地方。我不得不承认,我还没有完全理解数据生成。通常我会在链接函数的输出中应用一个阈值(例如,如果概率> = 0.5,那么1个0代表true.presence)。二项分布是否引入了另一层随机性? – cs0815

+0

顺便说一句,最后我想调整这个存在唯一的情况下,这里讨论:在存在数据的贝叶斯建模数据增强(你可以访问它?)。我可以张贴这是另一个问题,并会非常感激,如果你可以帮助我这个......非常感谢! – cs0815