Как я могу собрать "идентификаторы" направленных ссылок, используя NetLogo Behavior Space? - PullRequest
2 голосов
/ 15 октября 2019

Мы сохранили много данных в качестве атрибутов ссылок в нашей модели NetLogo. Когда я использую Пространство поведения для разработки экспериментов и управления сбором данных, я указываю «[атрибут] ссылки» для извлечения. Тем не менее, в файле CSV я не вижу идентификатор ссылки, которая необходима для понимания данных. Как я могу собрать идентификаторы ссылок в моих результатах? Из того, что я понимаю, нет примитива для включения этой команды.

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Всякий раз, когда вы хотите извлечь информацию из отдельных агентов (включая ссылки), используя BehaviorSpace, хороший способ сделать это - использовать расширение csv, как описано в этом ответе:

https://stackoverflow.com/a/52406247/487946

Общая идея заключается в том, что мы можем встроить csv в наш csv, а затем использовать read_csv -подобную функцию в R (или Python, или Julia, или что-то еще), чтобы извлечь "внутренний csv" из наших результатов в BehaviorSpace.

В случае ссылок было бы полезно включить номер who каждого конца ссылки, чтобы однозначно идентифицировать его. (Это один из очень немногих случаев, когда я буду выступать за использование числа who для чего-либо.)

Давайте возьмем эту глупую примерную модель:

extensions [ csv ]
links-own [ attribute ]

to setup
  clear-all
  create-turtles 3 [
    create-links-with other turtles [
      set attribute random-float 1
    ]
  ]
  reset-ticks
end

to go
  ask links [ set attribute attribute * 0.5 ]
  tick
end

Она просто создает триЧерепахи со ссылками между ними, устанавливают attribute ссылки на случайное число и многократно удваивают это число по мере того, как модель тикает.

Чтобы сгенерировать CSV, который мы будем встраивать в наши результаты BehaviorSpace, мы пишемследующий репортер:

to-report link-attributes-csv
  report csv:to-string
    fput ["who1" "who2" "attribute" ] 
    [ (list [ who ] of end1 [ who ] of end2 attribute) ] of links
end

Если вы попробуете это в командном центре после запуска setup, он выдаст что-то вроде этого:

observer> setup
observer> print link-attributes-csv
who1,who2,attribute
0,1,0.9409784968740699
1,2,0.9079884204004846
0,2,0.9070292656950991

Как вы можете видеть, мы имеемаккуратная маленькая таблица csv, где каждая строка представляет определенную ссылку, идентифицированную числом who черепах, которых она соединяет.

Поскольку этот репортер сообщает о строке (и эта строка может содержать разрывы строк), мы можем использовать его непосредственно в эксперименте BehaviorSpace:

example experiment

Запуск этого эксперимента (с «выводом таблицы») дает следующий выходной файл:

"BehaviorSpace results (NetLogo 6.1.1)"
"link-attributes-example.nlogo"
"experiment"
"10/16/2019 11:00:12:495 +0100"
"min-pxcor","max-pxcor","min-pycor","max-pycor"
"-16","16","-16","16"
"[run number]","[step]","link-attributes"
"1","0","who1,who2,attribute
1,2,0.15670083797389645
0,2,0.40055350697928993
0,1,0.34892645306446335"
"2","0","who1,who2,attribute
0,1,0.2831244347856665
1,2,0.27721328746715357
0,2,0.5221352362751627"
"2","1","who1,who2,attribute
0,1,0.14156221739283326
0,2,0.26106761813758134
1,2,0.13860664373357678"
"1","1","who1,who2,attribute
0,2,0.20027675348964497
1,2,0.07835041898694822
0,1,0.17446322653223167"
"1","2","who1,who2,attribute
1,2,0.03917520949347411
0,2,0.10013837674482248
0,1,0.08723161326611584"
"2","2","who1,who2,attribute
1,2,0.06930332186678839
0,1,0.07078110869641663
0,2,0.13053380906879067"

Это выглядит немного странно со всеми переносами строк, но ваши инструменты анализа данных должны быть в состоянии справиться с этим. Вот как это сделать, используя R и Tidyverse:

library(tidyverse)
df <-
  read_csv("experiment-table.csv", skip = 6) %>%
  mutate(`link-attributes` = map(`link-attributes`, read_csv)) %>%
  unnest()

Функции purrr::map и tidyr::unnest являются ключевыми. Я не буду их здесь объяснять, но стоит посмотреть их и ознакомиться с ними.

Наш конечный результат выглядит следующим образом:

# A tibble: 18 x 5
   `[run number]` `[step]`  who1  who2 attribute
            <dbl>    <dbl> <dbl> <dbl>     <dbl>
 1              1        0     1     2    0.157 
 2              1        0     0     2    0.401 
 3              1        0     0     1    0.349 
 4              2        0     0     1    0.283 
 5              2        0     1     2    0.277 
 6              2        0     0     2    0.522 
 7              2        1     0     1    0.142 
 8              2        1     0     2    0.261 
 9              2        1     1     2    0.139 
10              1        1     0     2    0.200 
11              1        1     1     2    0.0784
12              1        1     0     1    0.174 
13              1        2     1     2    0.0392
14              1        2     0     2    0.100 
15              1        2     0     1    0.0872
16              2        2     1     2    0.0693
17              2        2     0     1    0.0708
18              2        2     0     2    0.131 

Надеюсь, это поможет.

1 голос
/ 15 октября 2019

Как и патчи, ссылки идентифицируются двумя числами, которые являются номерами who двух концов. Вы можете сохранить строковое представление ссылки (например, (ссылка 0 1)) или извлечь числа в виде списка (или отдельно). Например,

to test
  ca
  crt 2
  ask turtle 0 [create-link-with turtle 1]
  print link 0 1
  ask link 0 1 [let id sort [who] of both-ends print id] ; a list
  ask link 0 1 [let id sort [who] of both-ends
    print (word item 0 id "-" item 1 id)
  ] ; a string
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...