I’m trying to account for logN measurement error in a predictor variable of a logistic regression, but can’t figure out the correct way to do so.
Basically, we have i observations, each consisting of 2 samples from different binomial distributions (categories j) with a true predictor v_{i} and observed predictor x_{i} = v_i \times \varepsilon with \varepsilon ~ \text{logN}(0, s_{\varepsilon}) and
\lambda_{i,c} = a_j + b_j x_i
with c \sim (1,2) and x_i \sim \text{LogN}(1, s_x)
p_{j,i} = \Pr(\text{Success in category } j \text{ of observation }i)
p_{j,i} = \exp(\lambda_{j,i})/(1 + \exp(\lambda_{j,i}))
When the error was normally distributed, I am able to use w_{i} = v_i + \varepsilon,
formula = bf(y|trials(n) ~ 0 + i + i:me(w, s_e, gr = id))
But I don’t understand how to craft the formula
and/or priors
for logN error.
Can someone help me directly or point me to a useful resource?
For clarity, below is some sample code,
i <- 100 # of genes
id <- paste0("id_", ((1:i) - 1))
a <- 2 # amino acids
l1 <- 30 #rate for category 1
l2 <- 20 # rate for category 2
s_e <- 0.1
set.seed(1234)
# # of observations for each category
n1 <- rpois(i, l1)
n2 <- rpois(i, l2)
## Predictor w/error
v <- rlnorm(i, 0, 2)
## Normal Error
e <- rnorm(i, 0, s_e)
w <- v + e
## LogN Error
e <- rlnorm(i, 0, s_e)
x <- v * e
## Create predictors
### Response Parameters
a1 <- -0.1
a2 <- 0.1
b1 <- 1.0
b2 <- -1.0
### Create dataframe
pred1 <- tibble(id, i = 1, n = n1, v, w, x, a = a1, b = b1)
pred2 <- tibble(id, i = 2, n = n2, v, w, x, a = a2, b = b2)
pred <- bind_rows(pred1, pred2)
## Generate data
data <- pred |> rowwise() |>
mutate(p = exp(a + b * v)/(1 + exp(a + b * v)),
y = rbinom(1, size = n, prob = p)) |>
arrange(id)
## Fit Binomials
### data w/ Normal error
fit_ne <- brm(
formula = bf(y|trials(n) ~ 0 + i + i:me(w, s_e, gr = id)),
data = data,
data2 = list(s_e = s_e),
family = binomial(link = "logit")
)
### data w/ LogN error but assumed to be normally distributed
### So it doesn't work very well
fit_lne <- brm(
formula = bf(y|trials(n) ~ 0 + i + i:me(x, s_e, gr = id)),
data = data,
data2 = list(s_e = s_e),
family = binomial(link = "logit")
)
- Operating System: Ubuntu 22.04
- brms Version: 2.21.0