Расчет ROC / AUC для MaxEnt и BIOMOD - PullRequest
3 голосов
/ 23 марта 2011

Большое спасибо Винчестер за любезную помощь! Я также видел учебник, и это работает для меня! В последние два дня я изучал результаты работы MaxEnt и BIOMOD, и я думаю, что меня все еще немного смущают термины, используемые в них.

Из кода Philips, похоже, что он использовал точки выборки и точку заднего фона для расчета ROC, в то время как в BIOMOD есть только прогноз на основе точек присутствия и псевдо отсутствия. Это означает, что для одного и того же набора данных у меня одинаковое количество данных присутствия / выборки, но разные данные отсутствия / фона для двух моделей соответственно. И когда я пересчитываю ROC, это обычно не согласуется со значениями, сообщаемыми самой моделью.

Я думаю, что я до сих пор не получил некоторой точки оценки модели, относительно того, что оценивается и как генерировать набор данных оценки, т.е. матрица сочетаний и какая часть данных была выбрана в качестве оценки.

Спасибо всем за добрый ответ! Я очень извиняюсь за неудобства. Я добавил еще несколько предложений к сообщению для BIOMOD, чтобы сделать его работоспособным, а для MaxEnt вы можете использовать учебные данные.

На самом деле, цель моего поста - найти человека, который имел опыт работы как с набором данных о присутствии / отсутствии, так и с набором данных только для присутствия. Я, наверное, знаю, как обращаться с ними по отдельности, но не совсем.

Я использую как MaxEnt, так и несколько алгоритмов под BIOMOD для распределения моего вида, и я хотел бы нарисовать ROC / AUC на том же рисунке, кто-нибудь делал это раньше?

Насколько мне известно, для MaxEnt ROC можно построить с использованием библиотеки ROCR и vcd, которая была дана в руководстве MaxEnt от Philips:

   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 точек псевдо-отсутствия, а фона нет. Я нашел другой сценарий, данный самим Тюиллером:

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

Теперь проблема в том, как я мог бы построить их вообще? Я пробовал оба, они работают хорошо для обоих по отдельности, но исключительно. Может быть, мне нужен кто-то, чтобы помочь мне понять основополагающую философию РПЦ.

Заранее спасибо ~

Marco

Ответы [ 3 ]

3 голосов
/ 05 апреля 2011

В идеале, если вы собираетесь сравнивать методы, вам, вероятно, следует сгенерировать прогнозы из 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)
2 голосов
/ 24 марта 2011

Я все еще не могу заставить ваш код работать, но вот пример с демонстрационными данными из пакета PresenceAbsence.Я подготовил ваши линии, а затем добавил жирную линию для РПЦ.Если бы вы пометили его, уровень ложных срабатываний находится на оси 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)
1 голос
/ 23 марта 2011

Я использовал пакет pROC . Он имеет много приятных особенностей, когда речь идет о графике ROC и AUC на одном графике. Кроме того, это очень полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...