Quand on se lance dans la modélisation à base d’agent, on se retrouve régulièrement face à de très gros jeux de données issus d’analyse de sensibilité. Ce travail d’excavation des résultats est facilement réalisable avec R.
Dans le cas de Netlogo, il existe un certain nombre d’extensions qui permettent, en plus de l’utilisation traditionnelle de R pour l’exploration des résultats, d’appeler des modèles depuis un script R (package RNetlogo), mais également le contraire, c’est-à-dire appeler R dans l’interface Netlogo.
RNetlogo une solution pour le couplage de modèle
La première solution qui consiste à appeler Netlogo dans R par l’intermédiaire du package RNetlogo a été l’objet de l’atelier couplage de modèle que j’ai co-animé avec F. Vinatier en novembre 2013 dans le cadre du projet LACCAVE de l’INRA, portant sur l’adaptation au changement climatique de la viticulture.
Voilà un exemple d’utilisation simple
rm(list=ls(all=TRUE)) # Ligne de code permettant d'effacer toutes les donnees de l'espace de travail #Chargement des LIBRAIRIES library(RNetLogo) #Chargement du répertoire dans lequel se trouvent les données Chemin.datas="/home/delay/DONNEES/" Chemin.Netlogo="/opt/netlogo-5.0.4" Chemin.Model="/home/delay/LAME/LAME" # Chargement de NetLogo NLStart(nl.path=Chemin.Netlogo,nl.version=5,gui=T) # lancement de Netlogo avec la GUI # Chargement du modèle NLLoadModel(paste(Chemin.Model,"/Ruissellement.nlogo",sep="")) # Initialisation du modèle NLCommand("clear-all") NLCommand("setup") # Simulation sur XX pas de temps cpt=0 while(cpt <= 30) { cpt=cpt+1 NLCommand("go") ##le go doit être dans une boucle pour être executee plusieurs fois } # récupération des variables des agents population=NLGetAgentSet(c("age","capital,"innovation"),"farmers with [innovation > 0], as.data.frame=FALSE, agents.by.row=TRUE )
Netlogo-R, absorber les capacités statistiques de R dans Netlogo
L’expérience contraire qui consiste à importer R dans Netlogo via l’extension netlogo-R est possible également , mais m’a semblé un peu plus tricky, surtout à installer (même s’il existe beaucoup de ressources sur l’internet)!
La première chose à faire est de télécharger l’extension sur source-forge, et la décompresser dans le dossier extension de Netlogo.
unzip r_v1.3_for_NL5_R3.0_and_higher.zip /opt/netlogo/extensions/
Il vous faudra également installer R (ça va de soi), et quelques packages additionnels : rJava (pour faire communiquer les deux mondes R et Java) et JavaGD (si vous voulez pouvoir accéder à des graphes R dans netlogo).
install.packages(c("rJava","JavaGD"),dependencies=T)
La dernière petite chose à faire est de charger des variables d’environnement ce qui, sous Linux, peut se faire à la volée si vous complétez le fichier .profile ou .bachrc qui va bien pour votre distribution.
- sous Archlinux ça donne ça :
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk export R_HOME=/usr/lib/R export JRI_HOME=/usr/lib/R/library/rJava/jri
- sous fedora 20 ça :
##export pour R-Netlogo export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk export R_HOME=/usr/lib64/R export JRI_HOME=/usr/lib64/R/library/rJava/jri
et vous pouvez faire une petite vérification …
echo $JRI_HOME
Il vous faudra maintenant lancer Netlogo en console pour que les variables d’environnement soient prises en compte… Pour faire un rapide tour du propriétaire de ces nouvelles possibilités, il y a dans l’archive que vous avez téléchargée et décompressée dans votre fichier Netlogo plusieurs scripts Netlogo d’exemple.
extensions [r] ;;pour charger l'extension
to stat_R ;; des opération stat issu de R ;; create R list from farmers agents ask farmers [ ;;definition de la taille de la mémoire ifelse length capital_list <= 5[ set capital_list lput capital capital_list set my_time lput ticks my_time ][ set capital_list lput capital capital_list set capital_list remove-item 0 capital_list set my_time lput ticks my_time set my_time remove-item 0 my_time ] ifelse length capital_list <= 5 [ ;; send the memory to R r:put "y" capital_list r:put "x" my_time ;; calculate correlation between weight and height r:eval "fm <- lm(y ~ x)" set memory r:get "fm$coefficient[2]" show memory ][ set memory 0 ] ] end
et voilà 🙂