Предложение Сета о включении behaviorspace-run-number
в имя файла вашего вывода csv
является одной из альтернатив.Это позволит вам связать этот файл со сводными данными в вашем основном выходном файле BehaviorSpace.
Другой вариант - включить репортеров списков в качестве «мер» в определение эксперимента в пространстве поведения.Например, в вашем случае:
map [ t -> [ xcor ] of t ] sort turtles
map [ t -> [ ycor ] of t ] sort turtles
Затем вы можете проанализировать полученный список «вручную» на вашем любимом языке анализа данных.Ранее я использовал для этого следующую функцию в Джулии:
parselist(strlist, T = Float64) = parse.(T, split(strlist[2:end-1]))
Я уверен, что вы легко можете написать какой-нибудь эквивалентный код на Python или R или на любом другом языке, который вы используете.
В приведенном выше примере я вывел отдельные списки для xcor
и ycor
черепах.Вы также можете вывести один «список списков», но анализ будет более сложным.
Редактировать: Как сделать это, используя расширение csv
и R
По совпадению,Мне пришлось сделать что-то подобное сегодня для другого проекта, и я понял, что комбинация csv
extension и R. может сделать это очень легко.
Общая идея заключается в следующем:
В NetLogo используйте csv:to-string
для кодирования данных списка в строку, а затем запишите эту строку непосредственно в вывод BehaviorSpace.
В R используйте purrr::map
и readr::read_csv
, а затем tidyr::unnest
, чтобы распаковать все в аккуратный "один"наблюдение за строкой "dataframe.
Другими словами: нам нравится CSV, поэтому мы помещаем CSV в наш CSV, чтобы мы могли анализировать, пока мы анализируем.
Вотполноценный пример.Допустим, у нас есть следующая модель NetLogo:
extensions [ csv ]
to setup
clear-all
create-turtles 2 [ move-to one-of patches ]
reset-ticks
end
to go
ask turtles [ forward 1 ]
tick
end
to-report positions
let coords [ (list who xcor ycor) ] of turtles
report csv:to-string fput ["who" "x" "y"] coords
end
Затем мы определим следующий крошечный эксперимент BehaviorSpace, только с двумя повторениями и ограничением по времени, используя наш репортер positions
в качестве вывода:
Код R для его обработки приятно прост:
library(tidyverse)
df <- read_csv("experiment-table.csv", skip = 6) %>%
mutate(positions = map(positions, read_csv)) %>%
unnest()
Что приводит к следующему кадру данных, все аккуратно и аккуратно:
> df
# A tibble: 12 x 5
`[run number]` `[step]` who x y
<int> <int> <int> <dbl> <dbl>
1 1 0 0 16 10
2 1 0 1 10 -2
3 1 1 1 9.03 -2.24
4 1 1 0 -16.0 10.1
5 1 2 1 8.06 -2.48
6 1 2 0 -15.0 10.3
7 2 0 1 -14 1
8 2 0 0 13 15
9 2 1 0 14.0 15.1
10 2 1 1 -13.7 0.0489
11 2 2 0 15.0 15.1
12 2 2 1 -13.4 -0.902
То же самое у Юлии:
using CSV, DataFrames
df = CSV.read("experiment-table.csv", header = 7)
cols = filter(col -> col != :positions, names(df))
df = by(df -> CSV.read(IOBuffer(df[:positions][1])), df, cols)