计算MaxEnt和BIOMOD的ROC / AUC

时间:2011-03-23 07:07:27

标签: r

非常感谢温彻斯特的帮助!我也看到了教程,这对我有用!在过去的两天里,我探索了MaxEnt和BIOMOD的输出,我想我仍然对两者中使用的术语感到困惑。

根据飞利浦的代码,他似乎使用Sample点和backaground点来计算ROC,而在BIOMOD中,只有来自存在和伪缺失点的预测。这意味着,对于同一数据集,我有相同数量的存在/样本数据,但两个模型的缺失/背景数据分别不同。当我重新计算ROC时,它通常与模型本身报告的值不一致。

我认为我仍然没有得到一些关于模型评估的观点,关于评估的内容以及如何生成评估数据集,即。输入矩阵,选择哪部分数据作为评估。

感谢大家的回复!对此给您带来的不便,我感到非常抱歉。我在BIOMOD的帖子中添加了几个句子以使其可运行,对于MaxEnt,您可以使用教程数据。

实际上,我的帖子的目的是找到有经验使用存在/不存在数据集和仅存在数据集的人。我可能知道如何单独处理它们,但不完全是这样。

我在BIOMOD下使用MaxEnt和一些算法来分配我的物种,我想在同一个图中绘制ROC / AUC,之前有人做过吗?

据我所知,对于MaxEnt,可以使用ROCR和vcd库绘制ROC,这是由Philips的MaxEnt教程中给出的:

   install.packages("ROCR", dependencies=TRUE)
   install.packages("vcd",  dependencies=TRUE)
   library(ROCR)
   library(vcd)
   library(boot)
   setwd("c:/maxent/tutorial/outputs")
   presence <- read.csv("bradypus_variegatus_samplePredictions.csv")
   background <- read.csv("bradypus_variegatus_backgroundPredictions.csv")
   pp <- presence$Logistic.prediction                # get the column of predictions
   testpp <- pp[presence$Test.or.train=="test"]       # select only test points
   trainpp <- pp[presence$Test.or.train=="train"]   # select only test points
   bb <- background$logistic
   combined <- c(testpp, bb)                             # combine into a single vector
   label <- c(rep(1,length(testpp)),rep(0,length(bb)))  # labels: 1=present, 0=random
   pred <- prediction(combined, label)                    # labeled predictions
   perf <- performance(pred, "tpr", "fpr")          # True / false positives, for ROC curve
   plot(perf, colorize=TRUE)                                # Show the ROC curve
   performance(pred, "auc")@y.values[[1]]            # Calculate the AUC

对于BIOMOD,它们需要存在/不存在数据,因此我使用了1000个伪存在点,并且没有背景。我找到了Thuiller自己给出的另一个剧本:

library(BIOMOD)
library(PresenceAbsence)

data(Sp.Env)

Initial.State(Response=Sp.Env[,12:13], Explanatory=Sp.Env[,4:10], 
IndependentResponse=NULL, IndependentExplanatory=NULL)

Models(GAM = TRUE, NbRunEval = 1, DataSplit = 80,
   Yweights=NULL, Roc=TRUE, Optimized.Threshold.Roc=TRUE, Kappa=F, TSS=F, KeepPredIndependent = FALSE, VarImport=0,
   NbRepPA=0, strategy="circles", coor=CoorXY, distance=2, nb.absences=1000)


load("pred/Pred_Sp277")

    data=cbind(Sp.Env[,1], Sp.Env[,13], Pred_Sp277[,3,1,1]/1000)

    plotroc <- roc.plot.calculate(data)


    plot(plotroc$threshold, plotroc$sensitivity, type="l", col="blue ")

    lines(plotroc$threshold, plotroc$specificity)
    lines(plotroc$threshold, (plotroc$specificity+plotroc$sensitivity)/2, col="red")

现在,问题是,我怎么能完全绘制它们?我已经尝试了两种方法,它们分别适用于单独使用,但仅限于此。也许我需要一个人来帮助我理解ROC的基础哲学。

提前致谢〜

3 个答案:

答案 0 :(得分:3)

理想情况下,如果您要比较方法,您可能应该从MaxEnt和BIOMOD为数据集的测试部分的每个位置生成预测(观察到的存在和缺席)。正如克里斯蒂安提到的那样,pROC是一个很好的方案,特别是用于比较ROC曲线。虽然我无法访问数据,但我已经生成了一个虚拟数据集,它应该说明绘制两条roc曲线并计算AUC的差异。

library(pROC)

#Create dummy data set for test observations
obs<-rep(0:1, each=50)
pred1<-c(runif(50,min=0,max=0.8),runif(50,min=0.3,max=0.6))
pred2<-c(runif(50,min=0,max=0.6),runif(50,min=0.4,max=0.9))

roc1<-roc(obs~pred1) # Calculate ROC for each method
roc2<-roc(obs~pred2) 

#Plot roc curves for each method

plot(roc1)
lines(roc2,col="red")

#Compare differences in area under ROC
roc.test(roc1,roc2,method="bootstrap",paired=TRUE)

答案 1 :(得分:2)

我仍然无法使您的代码正常工作,但这里有一个示例包含来自PresenceAbsence包的演示数据。我已经绘制了你的线条,然后为ROC添加了一条粗线。如果你对它进行标记,则误报率在x轴上,在y轴上具有假负率,但我认为对于存在的其他行,这是不准确的。这是你想做的吗?

data(SIM3DATA)
plotroc <- roc.plot.calculate(SIM3DATA,which.model=2, xlab = NULL, ylab = NULL)
plot(plotroc$threshold, plotroc$sensitivity, type="l", col="blue ")   
lines(plotroc$threshold, plotroc$specificity)    
lines(plotroc$threshold, (plotroc$specificity+plotroc$sensitivity)/2, col="red")
lines(1 - plotroc$specificity, plotroc$sensitivity, lwd = 2, lty = 5)

答案 2 :(得分:1)

我一直在使用pROC package。在同一图表中绘制ROC和AUC时,它有很多不错的功能。此外它非常有用。