Csv NetLogo-使用BehaviorSpace获得每次重复的所有海龟位置
我使用BehaviorSpace使用不同的参数运行模型数百次。但是我需要知道所有海龟的位置,而不仅仅是海龟的数量。如何使用BehaviorSpace实现它 目前,我通过以下代码将结果输出到csv文件中:Csv NetLogo-使用BehaviorSpace获得每次重复的所有海龟位置,csv,netlogo,Csv,Netlogo,我使用BehaviorSpace使用不同的参数运行模型数百次。但是我需要知道所有海龟的位置,而不仅仅是海龟的数量。如何使用BehaviorSpace实现它 目前,我通过以下代码将结果输出到csv文件中: to-report get-locations report (list xcor ycor) end to generate-output file-open "model_r_1.0_locations.csv" file-print csv:to-row get-locati
to-report get-locations
report (list xcor ycor)
end
to generate-output
file-open "model_r_1.0_locations.csv"
file-print csv:to-row get-locations
file-close
end
但是所有的结果都会弹出到同一个csv文件中,所以我无法判断每次运行的条件。Seth建议将您的
csv
输出文件名中包含这些结果。它将允许您将该文件与主BehaviorSpace输出文件中的摘要数据相关联
另一个选择是在你的行为空间实验定义中包括作为“度量”的列表记者。例如,在您的情况下:
map [ t -> [ xcor ] of t ] sort turtles
map [ t -> [ ycor ] of t ] sort turtles
然后,您可以用自己喜欢的数据分析语言“手动”解析结果列表。我以前在Julia中使用过以下函数:
parselist(strlist, T = Float64) = parse.(T, split(strlist[2:end-1]))
我相信您可以轻松地用Python或R或您正在使用的任何语言编写一些等效代码
在上面的例子中,我为海龟的xcor
和ycor
输出了单独的列表。您还可以输出一个“列表列表”,但解析将更加复杂
编辑:如何使用
csv
扩展名和R
巧合的是,我今天不得不为一个不同的项目做一些类似的事情,我意识到和R的组合可以使这变得非常简单
总体思路如下:
- 在NetLogo中,用于将列表数据编码为字符串,然后将该字符串直接写入行为空间输出
- 在R中,使用and,然后使用and,将所有内容解压缩到一个整洁的“每行观察一次”数据框中
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
然后,我们使用我们的positions
reporter作为输出,定义以下微小的行为空间实验,仅重复两次,时间限制为两次:
处理此问题的R代码非常简单:
库(tidyverse)
df%
突变(位置=映射(位置,读取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
您可能希望通过使用链接将
behaviorspace run number
合并到类似示例的filenamese中,为每次运行构造一个唯一的文件名。
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)