逻辑回归模型操纵


12

我想了解以下代码在做什么。编写代码的人不再在这里工作,并且几乎完全没有文档记录。有人认为“ 这是贝叶斯逻辑回归模型 ” ,有人要求我进行调查

bglm <- function(Y,X) {
    # Y is a vector of binary responses
    # X is a design matrix

    fit <- glm.fit(X,Y, family = binomial(link = logit))
    beta <- coef(fit)
    fs <- summary.glm(fit)
    M <- t(chol(fs$cov.unscaled))
    betastar <- beta + M %*% rnorm(ncol(M))
    p <- 1/(1 + exp(-(X %*% betastar)))
    return(runif(length(p)) <= p)
}

我可以看到它适合逻辑模型,对估计的协方差矩阵进行Cholseky分解,然后将其与的绘制向量相乘,然后添加到模型估计中。然后,将其与设计矩阵预乘,与从提取的矢量进行比较,并取其逆对数,并返回生成的二进制矢量。但是,从统计角度来看,这一切意味着什么?ñ01个ü01个


或许,这将有很大的帮助,以了解该领域中使用..
naught101

2
本质上,该函数从您的数据(频率)模型生成数据,并结合了有关实际参数的不确定性。它可能是贝叶斯MCMC例程的一部分,但也可以用于基于仿真的功率分析(nb,基于先验数据的功率分析通常是乐观的这些数据没有考虑不确定性)。
gung-恢复莫妮卡

不客气,@ PSellaz。由于没有人回应,因此我将其转变为“官方”答案。
gung-恢复莫妮卡

Answers:


7

函数的作用:
本质上,函数从您的数据模型生成新的伪随机响应(即)数据。使用的模型是标准的常客模型。按照惯例,假设您的 *数据是已知常数,则不会以任何方式对其进行采样。我认为此功能的重要特征是它并入了有关估计参数的不确定性。 ÿX

* 请注意,除非要抑制截距(通常不是一个好主意),否则在将输入到函数之前,必须手动添加一个向量作为矩阵的最左列。1个X

此功能的目的是什么:
我不诚实地知道。它可能是贝叶斯MCMC例程的一部分,但它只是其中一部分-您将需要在其他地方放置更多代码才能实际运行贝叶斯分析。对于贝叶斯方法,我没有足够的专家来对此做出明确的评论,但是该函数对我的感觉并不像通常使用的那样。

它也可能已用于基于仿真的功率分析中。(有关此问题的信息,请参见此处的答案:逻辑回归功效分析的模拟-设计的实验,以获取有关此类事物的信息。)值得注意的是,基于先验数据的功效分析通常没有考虑参数估计的不确定性。乐观的 (我在这里讨论这一点:所需效果大小与预期效果大小。)

如果要使用此功能:
如@whuber注释中所述,此功能将无效。如果要使用它进行(例如)功耗分析,我会将函数拆分为两个新函数。第一个将读取您的数据并输出参数和不确定性。第二个新函数将生成新的伪随机数据。以下是一个示例(尽管有可能进一步改进): ÿ

simulationParameters <- function(Y,X) {
                        # Y is a vector of binary responses
                        # X is a design matrix, you don't have to add a vector of 1's 
                        #   for the intercept

                        X    <- cbind(1, X)  # this adds the intercept for you
                        fit  <- glm.fit(X,Y, family = binomial(link = logit))
                        beta <- coef(fit)
                        fs   <- summary.glm(fit)
                        M    <- t(chol(fs$cov.unscaled))

                        return(list(betas=beta, uncertainties=M))
}

simulateY <- function(X, betas, uncertainties, ncolM, N){

             # X      <- cbind(1, X)  # it will be slightly faster if you input w/ 1's
             # ncolM  <- ncol(uncertainties) # faster if you input this
             betastar <- betas + uncertainties %*% rnorm(ncolM)
             p        <- 1/(1 + exp(-(X %*% betastar)))

             return(rbinom(N, size=1, prob=p))
}

4
+1。对我来说,奇怪的是,拟合和模拟预测都是在单个函数的主体内完成的。通常,通过首先计算拟合度(返回betaM),然后基于此拟合度创建大量 iid仿真,即可完成此类操作。(将它们放在相同的函数中将不必要地使拟合每次都重复,从而大大降低了计算速度。)从这些模拟中,人们可以(尤其是)恢复响应的非线性或非常复杂的组合的预测间隔。
ub

@whuber,我同意。我实际上是在考虑建议将该函数分成2个不同的函数,然后再用于仿真,但是似乎这并不是问题的一部分。
gung-恢复莫妮卡
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.