R:找到连续变量的截止点以将观察值分配给两组
R: Find cutoffpoint for continous variable to assign observations to two groups
我有以下数据
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 两个物种,想找出哪个是确定物种的最佳价值分界点。
我发现了以下问题:
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) 进行此类分析。这允许在调整阈值时对截止值的灵敏度和特异性如何变化进行视觉和数字评估。这使您可以 select 根据整体精度何时达到最佳值来确定最佳阈值。例如,使用 pROC
:
library(pROC)
species_roc <- roc(D$Species, D$Value)
我们可以通过检查曲线下的面积来衡量判别器 Value
预测 Species
的效果:
auc(species_roc)
#> Area under the curve: 0.778
plot(species_roc)
我们可以这样找出最佳cut-off阈值:
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
我有以下数据
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 两个物种,想找出哪个是确定物种的最佳价值分界点。
我发现了以下问题:
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) 进行此类分析。这允许在调整阈值时对截止值的灵敏度和特异性如何变化进行视觉和数字评估。这使您可以 select 根据整体精度何时达到最佳值来确定最佳阈值。例如,使用 pROC
:
library(pROC)
species_roc <- roc(D$Species, D$Value)
我们可以通过检查曲线下的面积来衡量判别器 Value
预测 Species
的效果:
auc(species_roc)
#> Area under the curve: 0.778
plot(species_roc)
我们可以这样找出最佳cut-off阈值:
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