Skip to content

Ego-Netzwerke: Namensgeneratoren, Namensinterpretatoren, Dyadenzensus und Soziogramme

Persönliche Netzwerke in Potato mit Namensgeneratoren, Namensinterpretatoren, einem Dyadenzensus und einem Soziogramm erheben, Network-Canvas-Protokolle importieren und GraphML exportieren.

Neu in v2.12.0

ego_network erhebt ein persönliches (egozentriertes) Netzwerk, einen Standardgegenstand der sozialen Netzwerkanalyse. Die befragte Person, das Ego, nennt Personen (Alteri), beantwortet Fragen zu jeder von ihnen, gibt an, welche von ihnen einander kennen, und platziert sie auf einer Karte. Das Schema funktioniert auf einer Umfrageseite, wie die meisten Studien zu persönlichen Netzwerken es einsetzen, und auf Annotationsitems, wo eine codierende Person das Netzwerk erfasst, das ein Dokument beschreibt.

Ein Schema enthält eine geordnete Liste von Stufen. Jede Stufe arbeitet mit derselben Menge von Alteri, sodass eine im ersten Namensgenerator genannte Person in jeder späteren Stufe erscheint.

StufeWas die befragte Person tut
name_generatorTippt Namen als Antwort auf eine Aufforderung ein oder wählt sie aus einer Liste
name_interpreterBeantwortet zu jeder Person dieselben Fragen (radio, multiselect, number, text)
dyad_censusGibt für jedes Personenpaar an, ob die beiden einander kennen: n(n-1)/2 Paare, eines nach dem anderen, mit einem Fortschrittsbalken
sociogramZieht Personen auf einer Zeichenfläche umher und klickt auf zwei Personen, um eine Linie zwischen ihnen hinzuzufügen oder zu entfernen

Standardmäßig werden die Stufen einzeln angezeigt, jede mit eigenen Schaltflächen Back und Next und einer Reihe von Schrittschaltflächen. stage_layout: stacked zeigt alle zugleich auf der Seite.

Konfiguration

Führen Sie auf einer Umfrageseite die Seite unter phases auf und legen Sie das Schema in ihre Datei:

yaml
phases:
  order: [your_network, annotation]
  your_network:
    type: prestudy
    file: surveys/your-network.json

Die Seitendatei enthält das Schema, hier in YAML gezeigt. Dieselben Schlüssel funktionieren in annotation_schemes:

yaml
- annotation_type: ego_network
  name: personal_network
  description: People you talk to
  label_requirement:
    required: true
  stages:
    - type: name_generator
      id: discuss
      title: Important matters
      prompt: >-
        Looking back over the last six months, who are the people you talked
        to about matters that are important to you?
      min_alters: 1
      max_alters: 8
      sets: {discuss: true}
    - type: name_generator
      id: help
      title: Practical help
      prompt: Who would you ask for help if you were ill for a couple of weeks?
      sets: {help: true}
    - type: name_interpreter
      id: about
      title: About each person
      required: true
      questions:
        - name: closeness
          type: radio
          description: How close do you feel to {name}?
          labels:
            - {name: very, text: Very close}
            - {name: somewhat, text: Somewhat close}
            - {name: not, text: Not close}
        - name: years_known
          type: number
          description: About how many years have you known {name}?
          min: 0
          max: 100
          required: false
    - type: dyad_census
      id: know
      prompt: Do {a} and {b} know each other?
    - type: sociogram
      id: map
      rings: 3
OptionStandardBedeutung
stageserforderlichDie Stufen in ihrer Reihenfolge. Ein name_generator muss vor jeder anderen Stufe kommen
stage_layoutstepssteps zeigt jeweils eine Stufe, stacked zeigt alle zugleich
label_requirementkeiner{required: true} verhindert das Weitergehen, bis das Netzwerk vollständig ist

Jede Stufe nimmt type, id (ein Buchstabe, gefolgt von Buchstaben, Ziffern, _ oder -, standardmäßig <type>_<n>), title, prompt und instructions.

Namensgeneratoren

OptionStandardBedeutung
min_alters0Personen, die diese Stufe braucht, bevor die befragte Person weitergehen kann
max_alterskeinerHöchstzahl der Personen, die diese Stufe annimmt
rosterkeinerNamen zur Auswahl statt zum Eintippen: Strings oder {id, name}
roster_fieldkeinerEin Item-Feld, das die Liste enthält (nur Annotationsitems)
setskeinerAttribute, die alle in dieser Stufe genannten Personen erhalten, etwa {support: true}
placeholderFirst name or nicknamePlatzhalter des Namensfelds

Wird ein Name eingetippt, der schon auf der Liste steht, wird er mit einer Meldung abgewiesen, damit eine Person nicht doppelt erfasst wird. Ein späterer Namensgenerator listet die früher genannten Personen unter "Named earlier" auf, und die befragte Person fügt mit einem Klick alle hinzu, die auch dorthin gehören. Der Alter behält eine ID und verzeichnet jeden Generator, der ihn genannt hat. Wird eine Person aus dem einzigen Generator entfernt, der sie genannt hat, verschwindet sie samt ihren Antworten und Beziehungen aus dem Netzwerk.

Namensinterpretatoren

Eine Stufe name_interpreter nimmt questions (erforderlich) und required, den Standard für ihre Fragen. Jede Frage hat name (eindeutig im gesamten Schema), type (radio, multiselect, number oder text), description ({name} wird durch den Namen der Person ersetzt), labels für radio und multiselect (Strings oder {name, text}, wobei name das Gespeicherte ist), required sowie min, max und step für Zahlen. Die Seite zeigt eine Karte pro Person mit allen Fragen darauf.

Dyadenzensus

OptionStandardBedeutung
promptDo {a} and {b} know each other?{a} und {b} werden durch die beiden Namen ersetzt
relationkeinerName der Relation, wenn eine Studie mehr als eine Art von Beziehung erfasst
yes_label, no_labelYes, NoAntwortlabels
strength_labelskeinerFragt statt nach Ja, wie stark die Beziehung ist, mit einer Schaltfläche pro Label plus no_label
strength_variablestrengthBeziehungsattribut, unter dem die Stärkeantwort gespeichert wird

Der Zensus zeigt jeweils ein Paar und geht nach jeder Antwort zum nächsten unbeantworteten Paar. "All pairs" listet alle Paare mit ihrer Antwort auf, und ein Klick auf eines führt dorthin zurück.

Soziogramm

OptionStandardBedeutung
relationkeinerDie Relation, die die Linien erfassen
allow_tiestruefalse für eine Zeichenfläche, auf der nur platziert wird
rings3Konzentrische Kreise hinter den Personen, von 0 bis 6

Positionen werden als Bruchteile von Breite und Höhe der Zeichenfläche gespeichert. Eine im Soziogramm gezeichnete Linie und eine Zensusantwort für dieselbe Relation sind derselbe Datensatz, sodass das Zeichnen einer Linie zwischen zwei Personen ihre Zensusantwort auf Ja setzt und das Entfernen auf Nein.

Jedes Bedienelement ist eine Schaltfläche oder ein Textfeld, das mit Tab erreichbar ist. Im Soziogramm wechselt Tab zwischen Personen, Enter wählt eine aus und öffnet eine Liste aller anderen, um Beziehungen hinzuzufügen oder zu entfernen, die Pfeiltasten bewegen die fokussierte Person (mit Shift weiter), und Escape schließt die Liste.

Datenformat

Die Antwort wird als ein einziger JSON-String gespeichert:

json
{
  "alters": [{"id": "a1", "name": "Ann", "named_in": ["discuss", "help"]},
             {"id": "a2", "name": "Bob", "named_in": ["discuss"]}],
  "attributes": {"a1": {"discuss": true, "help": true, "closeness": "very"}},
  "ties": [["a1", "a2"]],
  "positions": {"a1": [0.42, 0.31], "a2": [0.7, 0.55]},
  "census": {"a1|a2": true},
  "tie_attributes": {}
}

Alter-IDs sind a1, a2 und so weiter, in der Reihenfolge, in der die Personen genannt wurden, und eine gelöschte ID wird nicht wiederverwendet. Eine Beziehung ist [a, b] oder [a, b, relation], wenn die Stufe eine Relation nennt.

Export

bash
python -m potato.export --config config.yaml --format ego_network --output out/
DateiInhalt
egos.csvEine Zeile pro Netzwerk: network_size, n_ties, possible_ties, density, isolates, components, relations und complete mit incomplete_reason, geprüft anhand der eigenen Regeln des Schemas
alters.csvEine Zeile pro Alter: alter_id, named_in, x, y, degree und eine Spalte attr_<name> pro Attribut
edges.csvEine Zeile pro Beziehung: source_alter, target_alter, relation (tie, wenn unbenannt) und Spalten tie_<name> wie tie_strength
graphml/<user>__<item>.graphmlEine GraphML-Datei pro Netzwerk, mit Alteri als Knoten und Beziehungen als ungerichteten Kanten

Das Ego ist in diesen Dateien kein Knoten. Dichte, Komponenten und Grad werden über Beziehungen zwischen Alteri berechnet, und zwei Personen, die über zwei Relationen verbunden sind, zählen als ein verbundenes Paar.

Namen der Alteri

Die Namen, die Befragte eintippen, identifizieren Personen, die der Teilnahme an der Studie nicht zugestimmt haben. Der Export ego_network lässt sie daher weg und schreibt nur die pseudonymen IDs. --option export_names=true nimmt sie mit auf.

Die Namen stehen weiterhin in der Rohausgabe (annotation_output/) und in den allgemeinen Exporten (csv, jsonl), die das gespeicherte JSON unverändert schreiben. Fragen Sie Befragte nach Vornamen oder Spitznamen und behandeln Sie diese Dateien als identifizierbare Daten.

Vollständigkeit

Mit label_requirement: {required: true} lässt die Seite kein Weitergehen zu, solange ein Namensgenerator weniger als min_alters Personen hat, eine erforderliche Frage eines Namensinterpretators für jemanden unbeantwortet ist oder ein Dyadenzensus unbeantwortete Paare hat, und sie gibt an, was fehlt. Innerhalb des Widgets bleibt Next auf einem Namensgenerator stehen, bis dieser min_alters Personen hat, unabhängig davon, ob das Schema erforderlich ist.

Ein Network-Canvas-Protokoll importieren

potato import -f network_canvas -i my-study.netcanvas -o my-study/ liest ein Network Canvas-Protokoll, entweder die in Architect gespeicherte .netcanvas-Datei oder eine bloße protocol.json. Ego-Formulare werden zu Seiten mit gewöhnlichen Fragen, und die Netzwerkstufen für jeden Knotentyp werden zu einer ego_network-Frage:

Network CanvasPotato
EgoFormEine Umfrageseite, mit dem Einleitungsbereich als Überschrift
Information (Text-Items)Eine pure_display-Seite, wobei Markdown auf reinen Text reduziert wird
NameGenerator, NameGeneratorQuickAddname_generator-Stufen, eine pro Aufforderung
NameGeneratorRostername_generator mit einem roster, gelesen aus dem CSV- oder JSON-Asset des Protokolls
additionalAttributes an einer Aufforderungsets an diesem Namensgenerator
Zusätzliche Felder im Formular zum Hinzufügen einer PersonEine name_interpreter-Stufe direkt nach dem Namensgenerator
AlterFormname_interpreter
OrdinalBin, CategoricalBinname_interpreter mit einer Radio-Frage pro Aufforderung
DyadCensus, OneToManyDyadCensusdyad_census, mit relation aus dem Kantentyp
TieStrengthCensusdyad_census mit strength_labels aus den Optionen der Kantenvariable
Sociogramsociogram, mit concentricCircles als rings
minNodes, maxNodesmin_alters (erste Aufforderung), max_alters (jede Aufforderung)

Optionswerte werden als gespeicherte Antworten beibehalten, sodass Exporte dieselben Codes wie das Protokoll tragen. Skip-Logik auf Ego-Variablen wird zu show_when der Seite, und ein Sprung zu einer Stufe FinishSession wird zu exit_when auf der vorherigen Seite, sodass eine teilnehmende Person, die die Einwilligung ablehnt, die Studie dort verlässt. Protokolle mit Übersetzungen werden auf Englisch importiert, sofern Sie nicht --survey-language übergeben.

Manches ändert sich. Alle Netzwerkstufen für einen Knotentyp teilen sich eine Seite, die dort steht, wo die erste von ihnen war, sodass eine Netzwerkstufe, die nach anderen Seiten kam, vor diese rückt, und der Import warnt bei jeder. Das Ziehen von Personen in Bins wird zu einer Auswahl pro Person, mit denselben gespeicherten Werten. Skip-Logik, die Knoten- oder Kantendaten prüft, AlterEdgeForm, Narrative, Geospatial und die Stammbaumstufen, Datumsauswahlen, Medien-Items und Notizen für Interviewende werden in IMPORT_REPORT.md aufgeführt und nicht importiert.

Beispiel

examples/advanced/ego-network/ führt das Schema zweimal aus: als Umfrageseite vor der Aufgabe, für das eigene Netzwerk der teilnehmenden Person, und als Annotationsaufgabe, in der Codierende das Netzwerk erfassen, das jeder Interviewausschnitt beschreibt.

bash
python potato/flask_server.py start examples/advanced/ego-network/config.yaml -p 8000

Setzen Sie "Yes" und "No" in Labellisten in Anführungszeichen, weil YAML sie ohne Anführungszeichen als Booleans liest, und schreiben Sie stage_layout: stacked, nicht layout: stacked, da layout die Zuordnung für die Rasterplatzierung ist, die jedes Schema akzeptiert.

Weiterführende Informationen

Implementierungsdetails finden Sie in der Quelldokumentation.