R:找到连续变量的截止点以将观察值分配给两组

标签 r threshold mass-package

我有以下数据

Species <- c(rep('A', 47), rep('B', 23))
Value<- c(3.8711, 3.6961, 3.9984, 3.8641, 4.0863, 4.0531, 3.9164, 3.8420, 3.7023, 3.9764, 4.0504, 4.2305,
          4.1365, 4.1230, 3.9840, 3.9297, 3.9945, 4.0057, 4.2313, 3.7135, 4.3070, 3.6123, 4.0383, 3.9151,
          4.0561, 4.0430, 3.9178, 4.0980, 3.8557, 4.0766, 4.3301, 3.9102, 4.2516, 4.3453, 4.3008, 4.0020,
          3.9336, 3.5693, 4.0475, 3.8697, 4.1418, 4.0914, 4.2086, 4.1344, 4.2734, 3.6387, 2.4088, 3.8016,
          3.7439, 3.8328, 4.0293, 3.9398, 3.9104, 3.9008, 3.7805, 3.8668, 3.9254, 3.7980, 3.7766, 3.7275,
          3.8680, 3.6597, 3.7348, 3.7357, 3.9617, 3.8238, 3.8211, 3.4176, 3.7910, 4.0617)
D<-data.frame(Species,Value)

我有 A 和 B 两个物种,想找出哪个是确定物种的最佳值(value)分界点。

我发现了以下问题:

R: Determine the threshold that maximally separates two groups based on a continuous variable?

并按照公认的答案使用 MASS 包中的 dose.p 函数找到最佳值。我有几个相似的值并且对它们有效,但对上面给出的值无效(这也是我需要在此处包括所有 70 个观察结果的原因)。

D$Species_b<-ifelse(D$Species=="A",0,1) 
my.glm<-glm(Species_b~Value, data = D, family = binomial)
dose.p(my.glm,p=0.5)

给我 3.633957 作为阈值:

             Dose        SE
p = 0.5: 3.633957 0.1755291

这导致 45 个正确的分配。但是,如果我查看数据,很明显这不是最佳值。通过反复试验,我发现 3.8 给了我 50 个正确的作业,这显然更好。

为什么该函数适用于其他值,但不适用于这个值?我错过了一个明显的错误吗?或者是否有不同/更好的方法来解决我的问题?我有几个需要执行此操作的值,所以我真的不想在找到最佳值之前随机测试值。

如有任何帮助,我们将不胜感激。

最佳答案

对于此类分析,我通常会使用受试者工作特征曲线 (ROC)。这允许在调整阈值时对截止值的灵敏度和特异性如何变化进行视觉和数字评估。这使您可以根据整体精度何时达到最佳来选择最佳阈值。例如,使用 pROC:

library(pROC)

species_roc <- roc(D$Species, D$Value)

我们可以通过检查曲线下的面积来衡量判别器 Value 在预测 Species 方面有多好:

auc(species_roc)
#> Area under the curve: 0.778

plot(species_roc)

enter image description here

我们可以这样找到最佳截止阈值:

coords(species_roc, x = "best")
#>   threshold specificity sensitivity
#> 1   3.96905   0.6170213   0.9130435

我们看到这个阈值正确识别了 50 个案例:

table(Actual = D$Species, Predicted = c("A", "B")[1 + (D$Value < 3.96905)])
#>       Predicted
#> Actual  A  B
#>      A 29 18
#>      B  2 21

关于R:找到连续变量的截止点以将观察值分配给两组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64534063/

相关文章:

r - 多处理两个数据帧之间的行匹配操作的最佳方式

r - 更改 RMarkdown 代码输出中错误消息的颜色(HTML、PDF)

r - 与AWS一起使用biocep?

使用 fct_relevel 按组对因子重新排序仅更改第一组中的因子顺序

matlab - 尼黑阈值处理

R:根据数据矩阵和阈值数据框创建 boolean 矩阵

matlab - 在人脸识别过程中,如何计算matlab训练集中每个图像的特征脸或PCA算法的阈值?

R将线性模型传递给函数内的另一个函数