利用该数据集和逻辑回归模型:

dat1 <- data.frame(time=rep(seq(1,10), times=3), response=c(0,0,0,1,0,1,1,1,1,1, 0,0,0,0,0,1,1,1,1,1, 0,1,0,0,0,0,1,1,1,1), run=rep(c(1,2,3), each=10))

mod <- glm(response ~ time, data=dat1, family="binomial")

在给定一定概率的情况下,我如何提取time?例如,如果概率为0.5,如何得到time

推荐答案

这样的"求x给定y"问题是一个寻根问题.

你的问题有点特别.GLM response ~ time表明,在这种情况下,逻辑曲线是time的单调函数.因此,对于任何目标概率,只有一个根.这使得应用任何数值方法来寻找该根变得微不足道.我们只使用uniroot,它非常详细.

## we want to find the root of this function
## i.e., where it crosses 0
f <- function (tm, model, prob.target) {
  predict(model, newdata = data.frame(time = tm), type = "response") - prob.target
}

## try different lower bound 'lwr' and upper bound 'upr'
## until you see that the curve crosses the horizontal line at 0
lwr <- 0
upr <- 10
curve(f(x, mod, 0.5), lwr, upr)
abline(h = 0, lty = 2)

good

## use this 'lwr' and 'upr' for uniroot()
uniroot(f, c(lwr, upr), model = mod, prob.target = 0.5)$root
#[1] 5.160737

我懂了.我问这个问题是因为@FP0计算出的时间为4.68/0.94=5.16/this answer,所以我想可能有一个简单的关系,我遗漏了.

因为该GLM的分析表达式是已知的:

log(p / (1 - p)) = intercept + slope * time

当p=0.5时,左侧为0.因此根简单地为:

time = -(intercept / slope)

R代码为:

unname(-(mod$coef[1] / mod$coef[2]))
#[1] 5.160737

所以,我展示了如何从分析和数值两方面来实现这一点.我优先考虑数字一,因为堆栈溢出是一个编码网站:D

R相关问答推荐

R绑定具有不同时间观察的两个数据帧

将模拟变量乘以多个观测结果中的模拟变量

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

使用R的序列覆盖

工作流程_set带有Dplyrr风格的 Select 器,用于 Select 结果和预测因子R

使用R中的Shapetime裁剪格栅文件

如何使用按钮切换轨迹?

当我们有多个特殊字符时,使用gsub删除名称和代码'

R函数‘paste`正在颠倒其参数的顺序

如果某些列全部为NA,则更改列

将饼图插入条形图

`夹心::vcovCL`不等于`AER::tobit`标准错误

从多个可选列中选取一个值到一个新列中

如何计算R glm probit中的线性预测因子?

如何计算增加10米(0.01公里)的行?

我将工作代码重构为一个函数--现在我想不出如何传递轴列参数

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

如何根据其他列中的两个条件来计算数据帧中的行之间的差异?

为什么将负值向量提升到分数次方会得到NaN

按镜像列值自定义行顺序