微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R:找到连续变量的分界点以将观测值分配给两组

如何解决R:找到连续变量的分界点以将观测值分配给两组

我有以下数据

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",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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。