R:在 glm() 中的逻辑回归中预测 (0,1)

2024-06-28

我正在尝试在二进制 Logit 模型中模拟“假设”情况。我正在估计通过测试的概率,考虑到测试的难度级别(1=最简单,5=最难),并以性别为控制。 (数据是here http://dl.dropbox.com/u/1791181/bayesglm.csv)。学生接受的测试通常很艰难(数据中为“高”)。由此我们可以估计测试难度对通过可能性的影响:

model = glm(PASS ~ as.factor(SEX) + as.factor(HIGH), family=binomial(link="logit"), data=df)
summary(model)

我们还可以通过以下方式获得预测的通过概率:

predict.high = predict(model, type="response")

问题是,如果改为“低”测试会怎样?为了获得新的概率,我们可以这样做:

newdata = rename.vars(subset(df, select=c(-HIGH)), 'LOW','HIGH')
predict.low = predict(model, newdata=newdata, type="response")

但我怎么知道在这种情况下还有多少学生会通过呢?是否有明显的切换glm()我没看见?


我还没有尝试挖掘我根据 Gelman 和 Hill (2006) 编写的预测代码,我似乎记得他们使用了模拟。我仍然打算这样做。在我有限的经验中,你的问题的一个方面似乎很独特,那就是我习惯于预测单个观察结果(在本例中是单个学生参加单个测试)。然而,您似乎想要预测两组预测之间的差异。换句话说,您想要预测如果进行一组 5 项简单考试而不是一组 5 项困难考试,将会有多少学生通过。

我不确定 Gelman 和 Hill (2006) 是否涵盖了这一点。您似乎也想用频率主义方法来做到这一点。

我认为,如果您可以预测单个观察结果,以便每个观察结果都有一个置信区间,那么也许您可以估计每个组内通过的加权平均概率并减去两个加权平均值。 Delta 方法可用于估计加权平均值及其差异的置信区间。

为了实施该方法,预测观测值之间的协方差可能必须假设为 0。

如果假设协方差为 0 不能令人满意,那么贝叶斯方法也许会更好。同样,我只熟悉预测单个观察结果。使用贝叶斯方法,我通过包含自变量(但不包含因变量)来预测单个观测值,以便预测观测值。我想你可以预测同一贝叶斯运行中的每个观察结果(预测每个学生的高和低)。每组通过测试的加权平均值和加权平均值的差异是派生参数,我怀疑可以直接包含在贝叶斯逻辑回归的代码中。然后,您将获得通过每组测试的概率以及通过每组测试的概率差异的点估计和方差估计。如果您想要通过每组测试的学生人数差异,也许也可以将其作为派生参数包含在贝叶斯代码中。

我意识到到目前为止,这个答案比预期的更具对话性。我只是制定了要尝试的策略,而还没有时间尝试实施这些策略。提供所有 R 和 WinBUGS 代码来实现这两个提议的策略可能需要我几天的时间。 (可以从 R 内部调用 WinBUGS 或 OpenBUGS。)我将在继续过程中将代码附加到这个答案中。如果有人认为我提出的策略和/或即将发布的代码不正确,我希望他们能够随意指出我的错误并提供更正。

EDIT

下面的代码生成虚假数据并使用频率论和贝叶斯方法分析该数据。我还没有添加代码来实现上述预测想法。我将尝试在接下来的 1-2 天内添加贝叶斯预测代码。我只使用了三个测试而不是五个。按照下面编写代码的方式,您可以将学生人数 n 更改为任何可以分成 6 个相等整数的非零数字。

# Bayesian_logistic_regression_June2012.r
# June 24, 2012

library(R2WinBUGS)
library(arm)
library(BRugs)

set.seed(3234)


# create fake data for n students and three tests

n <- 1200

# create factors for n/6 students in each of 6 categories

gender <- c(rep(0, (n/2)), rep(1, (n/2)))
test2  <- c(rep(0, (n/6)), rep(1, (n/6)), rep(0, (n/6)),
            rep(0, (n/6)), rep(1, (n/6)), rep(0, (n/6)))
test3  <- c(rep(0, (n/6)), rep(0, (n/6)), rep(1, (n/6)),
            rep(0, (n/6)), rep(0, (n/6)), rep(1, (n/6)))

# assign slopes to factors

B0      <-  0.4
Bgender <- -0.2
Btest2  <-  0.6
Btest3  <-  1.2

# estimate probability of passing test

p.pass <- (     exp(B0 + Bgender * gender + 
                         Btest2  * test2  + 
                         Btest3  * test3) /
           (1 + exp(B0 + Bgender * gender +
                         Btest2  * test2  + 
                         Btest3  * test3)))

# identify which students passed their test, 0 = fail, 1 = pass

passed   <- rep(0, n)
r.passed <- runif(n,0,1)
passed[r.passed <= p.pass] = 1

# use frequentist approach in R to estimate probability
# of passing test

m.freq <- glm(passed ~ as.factor(gender) +
                       as.factor(test2)  +
                       as.factor(test3)  , 
                       family = binomial)
summary(m.freq)

# predict(m.freq, type = "response")


# use OpenBUGS to analyze same data set

# Define model

sink("Bayesian.logistic.regression.txt")
cat("
model {

# Priors

 alpha ~ dnorm(0,0.01)
 bgender ~ dnorm(0,0.01)
 btest2 ~ dnorm(0,0.01)
 btest3 ~ dnorm(0,0.01)

# Likelihood

 for (i in 1:n) {
    passed[i] ~ dbin(p[i], 1)
    logit(p[i]) <- (alpha + bgender * gender[i] +
                            btest2  * test2[i]  +
                            btest3  * test3[i])
 }

# Derived parameters

 p.g.t1 <- exp(alpha) / (1 + exp(alpha))
 p.b.t1 <- exp(alpha + bgender) / (1 + exp(alpha + bgender))

 p.g.t2 <- (    exp(alpha +           btest2) / 
           (1 + exp(alpha +           btest2)))
 p.b.t2 <- (    exp(alpha + bgender + btest2) / 
           (1 + exp(alpha + bgender + btest2)))

 p.g.t3 <- (    exp(alpha +           btest3) / 
           (1 + exp(alpha +           btest3)))
 p.b.t3 <- (    exp(alpha + bgender + btest3) / 
           (1 + exp(alpha + bgender + btest3)))

}

", fill = TRUE)
sink()

my.data <- list(passed = passed, 
                gender = gender,
                test2  = test2,
                test3  = test3, 
                n      = length(passed))

# Inits function

inits <- function(){ list(alpha   = rlnorm(1), 
                          bgender = rlnorm(1),
                          btest2  = rlnorm(1),
                          btest3  = rlnorm(1)) }

# Parameters to estimate

params <- c("alpha", "bgender", "btest2", "btest3", 
            "p.g.t1", "p.b.t1", "p.g.t2", "p.b.t2",
            "p.g.t3", "p.b.t3")

# MCMC settings

nc <- 3
ni <- 2000
nb <- 500
nt <- 2

# Start Gibbs sampling

out <- bugs(data = my.data, inits = inits,
parameters.to.save = params, 
"c:/users/Mark W Miller/documents/Bayesian.logistic.regression.txt",
program = 'OpenBUGS', 
n.thin = nt, n.chains = nc, 
n.burnin = nb, n.iter = ni, debug = TRUE)

print(out, dig = 5)

在尝试实施加权平均方法进行预测之前,我想说服自己它可能有效。所以我编写了以下代码,这似乎表明它可能是:

# specify number of girls taking each test and
# number of boys taking each test

g.t1 <- rep(0,400)
b.t1 <- rep(0,120)
g.t2 <- rep(0,1200)
b.t2 <- rep(0,50)
g.t3 <- rep(0,1000)
b.t3 <- rep(0,2000)

# specify probability of individuals in each of the
# 6 groups passing their test

p.g1.t1 <- 0.40
p.b1.t1 <- 0.30
p.g1.t2 <- 0.60
p.b1.t2 <- 0.50
p.g1.t3 <- 0.80
p.b1.t3 <- 0.70

# identify which individuals in each group passed their test

g.t1[1:(p.g1.t1 * length(g.t1))] = 1
sum(g.t1)

b.t1[1:(p.b1.t1 * length(b.t1))] = 1
sum(b.t1)

g.t2[1:(p.g1.t2 * length(g.t2))] = 1
sum(g.t2)

b.t2[1:(p.b1.t2 * length(b.t2))] = 1
sum(b.t2)

g.t3[1:(p.g1.t3 * length(g.t3))] = 1
sum(g.t3)

b.t3[1:(p.b1.t3 * length(b.t3))] = 1
sum(b.t3)

# determine the weighted average probability of passing
# on test day for all individuals as a class

wt.ave.p <- ((p.g1.t1 * length(g.t1) + p.b1.t1 * length(b.t1) +
 p.g1.t2 * length(g.t2) + p.b1.t2 * length(b.t2) +
 p.g1.t3 * length(g.t3) + p.b1.t3 * length(b.t3) ) / 

 (length(g.t1) + length(b.t1) + length(g.t2) + 
  length(b.t2) + length(g.t3) + length(b.t3)))

wt.ave.p

# determine the expected number of individuals passing
# their test in the class as a whole

exp.num.pass <- wt.ave.p *  (length(g.t1) + length(b.t1) +
                             length(g.t2) + length(b.t2) +
                             length(g.t3) + length(b.t3))
exp.num.pass

# determine the number of individuals passing

num.passing <- (sum(g.t1) + sum(b.t1) + 
                sum(g.t2) + sum(b.t2) + 
                sum(g.t3) + sum(b.t3) )
num.passing

# the expected number of students passing, exp.num.pass,
# should equal the observed number of students passing,
# num.passing regardless of the number of students in each
# group and regardless of the probability of passing a 
# given test, within rounding error

identical(round(exp.num.pass), round(num.passing)) 

希望在接下来的几天里我可以尝试将预测代码添加到上面的贝叶斯代码中。

编辑 - 2012 年 6 月 27 日

我没有忘记这一点。相反,我遇到了几个问题:

  1. 通过逻辑回归,可以预测:a) 给定组中的学生通过测试的概率 p,b) 给定学生参加测试的结果(0 或 1)。然后对所有 0 和 1 进行平均。我不确定该使用其中的哪一个。预测 p 的点估计和 SD 与已知测试结果的估计 p 相同。预测的 0 和 1 的平均值的点估计略有不同,并且平均 0 和 1 的 SD 更大。我相信我想要 b,预测的 0 和 1 的平均值。然而,我正在尝试检查各种网站和书籍以确定。 Collett (1991) 有一个不使用计算机代码的有效示例,但该有效示例包含六个变量,其中包括 2 个交互作用,并且我在让我的贝叶斯估计与她的频率估计相匹配时遇到了一些麻烦。

  2. 由于有大量派生参数,程序需要很长时间才能运行。

  3. 我相信,即使没有预测代码,OpenBUGS 显然也经常崩溃。我不确定这是因为我做错了什么,还是因为最新版本的 R 的更改或最新版本的 R 软件包的更改,或者可能是因为我尝试使用 64 位 R 运行代码或其他原因别的。

我会尝试尽快发布预测代码,但是上述所有问题都减慢了我的速度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R:在 glm() 中的逻辑回归中预测 (0,1) 的相关文章

  • 如何为 R 中接下来的 2 个单元格复制相同的列值[重复]

    这个问题在这里已经有答案了 我正在尝试使用 R 为列中接下来的 2 个单元格复制相同的列值 我有以下形式的数据框 Time World Cate Data 1994 Africa A 12 1994 B 17 1994 C 22 1994
  • 为什么 NaN^0 == 1

    受到早期高尔夫代码的提示 为什么会 gt NaN 0 1 1 这非常有道理NA 0为 1 因为NA缺少数据 并且any数字提高到 0 将得到 1 包括 Inf and Inf 然而NaN应该代表非数字 那么为什么会这样呢 当帮助页面出现时
  • 数据框中的动物园滞后差异

    我想将滞后差异的结果放回到我的数据框中 这意味着我将拥有针对不同滞后的领先 NA 我在用 new df lag1 lt diff new df Close lag 1 differences 1 arithmetic TRUE na pad
  • R 在列中按分隔符分割字符串

    我有一个包含几行的文件 例如 A B C awer ttp net Code 554 abcd ttp net Code 747 asdf ttp net Part 554 xyz ttp net Part 747 我想使用 R 仅拆分表的
  • Shiny:合并 DT::datatable 中的单元格

    我想以闪亮的方式合并 DT datatable 列中的几行 可以这样做吗 目前我能够输出如下所示 但理想情况下 我想合并行并希望输出如下所示的内容 是否可以在 DT datatable 中合并这样的行 在以下人员的帮助下这是可能的数据表行组
  • 如何从 R 中的列表列表中提取元素?

    我有一堆列表 其中包含列表 广义线性模型输出 我想编写一个函数 该函数将从每个列表中提取多个元素 然后将结果组合到数据框中 我想提取modelset 1 likelihood modelset 1 fixef modelset 2 like
  • 将嵌套 for 循环转换为 R 中的并行循环

    下面您可以在 R 中找到一段代码 我想将其转换为使用多个 CPU 作为并行进程运行 我尝试使用foreach包 但并没有走得太远 考虑到我有 3 级嵌套循环 我找不到一个很好的例子如何让它工作 我们将非常感谢您的帮助 下面的代码示例 我做了
  • multidplyr :将函数分配给集群

    参见下面的工作解决方案 我想使用 multidplyr 并行化函数 calculs R f lt function x return x 1 main R library dplyr library multidplyr source ca
  • 如何在 R 中计算带有变量的表达式?

    我希望这段代码能够设置plt等于 10 gt var plt gt eval paste0 var lt 10 1 plt lt 10 但相反 它返回一个字符串 I tried eval as expression paste0 var l
  • 使用清单修改 Latex 文档中 R 代码的字体颜色

    我试图在 Latex 文档中突出显示 R 代码 但我似乎无法更改代码框中的字体颜色 举个例子 我认为commentstyle color red 应该给我红色字体的评论 但评论显示为蓝色或黑色 不太清楚 另外 我认为backgroundco
  • R - 数据框列中唯一值的数量

    对于数据框df 我需要找到的唯一值some col 尝试了以下方法 length unique df some col 但这并没有给出预期的结果 然而length unique some vector 对向量进行处理并给出预期结果 创建 d
  • 使用 R 的 qdap 包估计文档极性,无需使用 sendSplit

    我想申请qdap s polarity函数对文档向量进行处理 每个文档可以包含多个句子 并获得每个文档相应的极性 例如 library qdap polarity DATA state all polarity Results 1 0 81
  • 读取时 R 中的内存错误.xlsx

    我正在使用以下 R 代码 也利用 Java 参数来增加内存 library xlsx options java parameters Xmx1g library XLConnect NiVe lt read xlsx version1 xl
  • 带有预先计算值的 geom_boxplot

    过去 我已经能够使用 ggplot2 创建箱线图 方法是提供下须线 下分位数 中位数 上分位数和上须线以及 x 轴标签 例如 DF lt data frame x c A B min c 1 2 low c 2 3 mid c 3 4 to
  • R 中的 shapefile 到神经网络

    我需要转换道路类型的 shapefile ESRI SpatialLinesDataFrame在 R 的神经网络中 我不知道如何删除形状的节点或顶点 确定节点之间每条边的长度 通过这些参数 我可以使用数据包 网络 创建网络 摘要 R 中 i
  • RStudio/ R 上的 Tensorflow 设置 |中央操作系统

    在过去的 5 天里 我试图让 Keras Tensorflow 包在 R 中工作 我使用 RStudio 进行安装并使用conda miniconda virtualenv但最后每次都会崩溃 安装库不应该是一场噩梦 尤其是当我们谈论 R 时
  • TabsetPanel 未在 Shiny 中填充整个页面

    我正在尝试创建一个使用 tabsetPanel 的闪亮应用程序 但是当我创建选项卡时 应用程序中的内容不再填充窗口的整个空间 并在输出的右侧和下方留下大的白色间隙 下面是一个非常基本的例子 如果没有选项卡 应用程序可以完美地作为一个流畅的页
  • 将函数参数传递给公式

    我试图理解为什么 foo function d y x fit with d lm y x foo myData Y X 不起作用 例如 myData data frame Y rnorm 50 X runif 50 对我来说似乎棘手的一点
  • R 中数据帧的稀疏矩阵

    我有一个稀疏矩阵 Formal class dgCMatrix package Matrix with 6 slots i int 1 37674 1836 2297 108 472 1735 1899 2129 2131 5 67 p i
  • ggplot2 每个美学的多个尺度/图例,重新审视[重复]

    这个问题在这里已经有答案了 我有一个例子 我想使用 ggplot 突出显示序列比对的几个属性 我正在使用 geom tile 并希望为两个分数属性提供两组不同颜色的图块 我只能想象一个 我意识到每种审美的一个尺度的限制 以及其背后的逻辑 h

随机推荐

  • 如何在 Windows 上设置 Node.js 的工作目录?

    我刚刚安装了 Windows 版的 Node js 运行它真的是轻而易举 我想将它用作构建过程的一部分 将多个文件组合在一起 如下所示 settings var FILE ENCODING utf 8 EOL n DIST FILE PAT
  • 删除高图表上的导出和打印按钮插件

    我正在使用 MVC 目前正在使用 highchart 我正在使用 Exporting js 以便用户可以打印或导出 highchart 图表 我的视图中有两个图表 我想禁用其中一个图表的打印和导出 我怎样才能做到这一点 Exporting
  • 生成的 Protobuf 代码导致应用程序崩溃

    我正在尝试使用 Google 的 Protocol Buffers 来实现应用程序的保存文件 准备 已创建一个简单的测试 proto 文件来测试功能 message LessonFile optional string creator 1
  • 如何在 Firefox 中动态单击 href 链接?预期方法仅适用于 IE

    http jsfiddle net HVGre 1 http jsfiddle net HVGre 1 测试链接 我的页面上有一个 html 链接 我需要能够动态单击该链接 这在 IE 中与 click 函数配合良好 但在 Firefox
  • 在 Python 中使用 LaTeX 表示法格式化数字

    在Python中使用格式字符串我可以轻松地以 科学记数法 打印数字 例如 gt gt print g 1e9 1e 09 将数字格式化为 LaTeX 格式 即 1 times10 09 的最简单方法是什么 The siunitx http
  • 按受欢迎程度列出 PyPI 包 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否可以获得按受欢迎程度 总下载数 排序的 PyPI 软件包列表 我无法找到在 PyPI 上执行此操作
  • UWP:找不到组件(HRESULT 异常:0x88982F50)

    当我尝试在 uwp 应用程序中拍照时 有时会出现错误 此错误很难重现 并且是几分钟前在桌面平台上发生的 我使用悬停摄像机来检索图像缓冲区 public async Task
  • 没有调试适配器,无法发送“变量 VSCODE”

    在调试控制台中写道 调试器侦听 ws 127 0 0 1 55624 c4f74411 66ec 44b2 9cf6 15efb60f8611 如需帮助 请参阅 https nodejs org en docs inspector http
  • 运行 EventSources 对服务器的影响

    我目前正在构建一个聊天只是为了好玩 我以前从未这样做过 我一般都是为了尝试一下EventSource API Server Sent Events http www html5rocks com en tutorials eventsour
  • puma 初始化程序不适用于 Rails 4.2

    我之前安装过很多次puma 从来没有出现过这个问题 我逐字遵循heroku 的指示 我创建了一个Procfile里面有这个 web bundle exec puma C config puma rb 这是配置文件 puma rb worke
  • IIS 中的 URL 重写得到 404

  • 如何计算CPU核心频率

    我正在尝试使用 RDTSC 但似乎我的方法获取核心速度可能是错误的 include stdafx h include
  • NestedScrollView 的 smoothScrollTo() 行为很奇怪

    我想要实现的是滚动到scroll position 1 when tab1 等等 被点击像this https material io design components tabs html image https 3A 2F 2Fstor
  • Paypal 沙盒“待定”多币种

    我目前使用 PayPal Rest api 执行付款时 它返回为 待处理 其说明的原因是 多货币 这背后的原因是因为默认的 协助者 帐户设置为美国 我需要它全部位于英国 问题是我可以登录 电子邮件受保护 cdn cgi l email pr
  • 是什么阻止用户应用程序“劫持”到内核模式?

    据我了解 内核模式是一种硬件功能 前任 它可以通过寄存器设置 value1 gt 内核模式 value2 gt 用户模式 当内核加载并运行用户应用程序时 用户应用程序应通过系统调用与内核通信以执行特权操作 在此期间将发生中断 执行将切换到内
  • jquery getJSON 跨域问题

    使用 JQuerys getJSON 从另一个域拉入 JSON 文件时 我似乎无法使该文件正常工作 我已经将回调部分放在了 url 的末尾 但仍然没有任何乐趣 Firebug 告诉我这是一个跨域问题 这似乎是有道理的 就好像我将 json
  • 如何在 javascript 中用正则表达式替换特殊字符?

    我需要替换字符串中的特殊字符 如下所示 this value this value replace n g 除了正则表达式部分之外 我需要它来查找opposite所有这些 0 9 查找 0 到 9 中的任意数字 A Z 查找从大写 A 到大
  • OpenAI GPT-4 API:为什么 gpt-4-0613 会幻觉(弥补)函数参数?

    我正在使用gpt 4 0613模型 功能单一 还有系统提示中的一些自定义数据 如果该函数在聊天中很早就被触发 在前两个请求内 它的功能就很好 并且 API 会要求用户提供调用该函数所需的信息 但是 如果稍后在对话中调用该函数 例如问题 5
  • 批处理文件和脚本中的腻子?

    我有一个批处理文件 可以很好地打开腻子 c putty exe 电子邮件受保护 cdn cgi l email protection pw boyhowdy 但为了让这项工作对我有用 我需要了解如何包含命令脚本 以便它可以在 putty 工
  • R:在 glm() 中的逻辑回归中预测 (0,1)

    我正在尝试在二进制 Logit 模型中模拟 假设 情况 我正在估计通过测试的概率 考虑到测试的难度级别 1 最简单 5 最难 并以性别为控制 数据是here http dl dropbox com u 1791181 bayesglm cs