Skip to content

Redes egocéntricas: generadores de nombres, intérpretes de nombres, censo de díadas y sociogramas

Recoge redes personales en Potato con generadores de nombres, intérpretes de nombres, un censo de díadas y un sociograma, importa protocolos de Network Canvas y exporta GraphML.

Nuevo en v2.12.0

ego_network recoge una red personal (egocéntrica), un objeto de estudio habitual del análisis de redes sociales. La persona encuestada, el ego, nombra a otras personas (los alteri), responde preguntas sobre cada una, indica cuáles se conocen entre sí y las sitúa en un mapa. El esquema funciona en una página de encuesta, que es como lo ejecutan la mayoría de los estudios de redes personales, y en ítems de anotación, donde un codificador registra la red que describe un documento.

Un esquema contiene una lista ordenada de etapas. Todas las etapas trabajan sobre el mismo conjunto de alteri, así que una persona nombrada en el primer generador de nombres aparece en todas las etapas posteriores.

EtapaQué hace la persona encuestada
name_generatorEscribe nombres en respuesta a un enunciado, o los elige de una lista
name_interpreterResponde las mismas preguntas sobre cada persona (radio, multiselect, number, text)
dyad_censusIndica, para cada par de personas, si se conocen: n(n-1)/2 pares, de uno en uno, con una barra de progreso
sociogramArrastra a las personas por un lienzo y hace clic en dos personas para añadir o quitar una línea entre ellas

Por defecto las etapas se muestran de una en una, cada una con sus propios botones Back y Next y una fila de botones de paso. stage_layout: stacked las muestra todas a la vez en la página.

Configuración

En una página de encuesta, enumera la página en phases y pon el esquema en su archivo:

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

El archivo de la página contiene el esquema, que aquí se muestra en YAML. Las mismas claves funcionan en 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
OpciónValor por defectoSignificado
stagesobligatorioLas etapas, en orden. Un name_generator tiene que ir antes que cualquier otra etapa
stage_layoutstepssteps muestra una etapa cada vez, stacked las muestra todas a la vez
label_requirementninguno{required: true} impide que la página continúe hasta que la red esté completa

Todas las etapas admiten type, id (una letra seguida de letras, dígitos, _ o -, que por defecto es <type>_<n>), title, prompt e instructions.

Generadores de nombres

OpciónValor por defectoSignificado
min_alters0Personas que necesita esta etapa antes de que la persona encuestada pueda seguir
max_altersningunoMáximo de personas que acepta esta etapa
rosterningunoNombres entre los que elegir en lugar de escribirlos: cadenas, o {id, name}
roster_fieldningunoUn campo del ítem que contiene la lista (solo en ítems de anotación)
setsningunoAtributos que se dan a todas las personas nombradas en esta etapa, como {support: true}
placeholderFirst name or nicknameMarcador de posición del cuadro del nombre

Escribir un nombre que ya está en la lista se rechaza con un mensaje, para que una persona no quede registrada dos veces. Un generador de nombres posterior enumera a las personas nombradas antes bajo "Named earlier", y la persona encuestada añade con un clic a quien también deba estar ahí. El alter conserva un único ID y registra todos los generadores que lo nombraron. Quitar a una persona del único generador que la nombró la elimina de la red, junto con sus respuestas y sus vínculos.

Intérpretes de nombres

Una etapa name_interpreter admite questions (obligatorio) y required, el valor por defecto de sus preguntas. Cada pregunta tiene name (único en todo el esquema), type (radio, multiselect, number o text), description ({name} se sustituye por el nombre de la persona), labels para radio y multiselect (cadenas o {name, text}, donde name es lo que se guarda), required, y min, max y step para los números. La página muestra una tarjeta por persona con todas las preguntas.

Censo de díadas

OpciónValor por defectoSignificado
promptDo {a} and {b} know each other?{a} y {b} se sustituyen por los dos nombres
relationningunoNombre de la relación, cuando un estudio registra más de un tipo de vínculo
yes_label, no_labelYes, NoEtiquetas de las respuestas
strength_labelsningunoPregunta por la fuerza del vínculo en lugar de por el sí, con un botón por etiqueta más no_label
strength_variablestrengthAtributo del vínculo en el que se guarda la respuesta sobre la fuerza

El censo muestra un par cada vez y pasa al siguiente par sin responder después de cada respuesta. "All pairs" enumera todos los pares con su respuesta, y al hacer clic en uno se vuelve a él.

Sociograma

OpciónValor por defectoSignificado
relationningunoLa relación que registran las líneas
allow_tiestruefalse para un lienzo en el que solo se sitúa a las personas
rings3Círculos concéntricos dibujados detrás de las personas, de 0 a 6

Las posiciones se guardan como fracciones de la anchura y la altura del lienzo. Una línea dibujada en el sociograma y una respuesta del censo para la misma relación son el mismo registro, así que dibujar una línea entre dos personas pone su respuesta del censo en sí, y quitarla la pone en no.

Todos los controles son botones o cuadros de texto accesibles con Tab. En el sociograma, Tab pasa de una persona a otra, Enter selecciona una y abre una lista con todas las demás para añadir o quitar vínculos, las flechas mueven a la persona con el foco (Shift la mueve más lejos), y Escape cierra la lista.

Formato de datos

La respuesta se guarda como una cadena JSON:

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": {}
}

Los ID de los alteri son a1, a2 y así sucesivamente, en el orden en que se nombró a las personas, y un ID eliminado no se reutiliza. Un vínculo es [a, b], o [a, b, relation] cuando la etapa nombra una relación.

Exportación

bash
python -m potato.export --config config.yaml --format ego_network --output out/
ArchivoContenido
egos.csvUna fila por red: network_size, n_ties, possible_ties, density, isolates, components, relations, y complete con incomplete_reason, comprobado según las propias reglas del esquema
alters.csvUna fila por alter: alter_id, named_in, x, y, degree, y una columna attr_<name> por atributo
edges.csvUna fila por vínculo: source_alter, target_alter, relation (tie cuando no tiene nombre), y columnas tie_<name> como tie_strength
graphml/<user>__<item>.graphmlUn archivo GraphML por red, con los alteri como nodos y los vínculos como aristas no dirigidas

El ego no es un nodo en estos archivos. La densidad, los componentes y el grado se calculan sobre los vínculos entre alteri, y dos personas vinculadas en dos relaciones cuentan como un solo par conectado.

Nombres de los alteri

Los nombres que escriben las personas encuestadas identifican a personas que no han aceptado participar en el estudio, así que la exportación ego_network los deja fuera y escribe solo los ID seudónimos. --option export_names=true los incluye.

Los nombres siguen estando en la salida en bruto (annotation_output/) y en las exportaciones generales (csv, jsonl), que escriben el JSON guardado tal cual. Pide a las personas encuestadas nombres de pila o apodos, y trata esos archivos como datos identificables.

Completitud

Con label_requirement: {required: true}, la página no continúa mientras un generador de nombres tenga menos de min_alters personas, una pregunta obligatoria de un intérprete de nombres quede sin responder para alguien, o un censo de díadas tenga pares sin responder, e indica cuál es el caso. Dentro del widget, Next se queda en un generador de nombres hasta que tiene min_alters personas, tanto si el esquema es obligatorio como si no.

Importar un protocolo de Network Canvas

potato import -f network_canvas -i my-study.netcanvas -o my-study/ lee un protocolo de Network Canvas, ya sea el archivo .netcanvas guardado en Architect o un protocol.json suelto. Los formularios del ego se convierten en páginas de preguntas normales, y las etapas de red de cada tipo de nodo se convierten en una pregunta ego_network:

Network CanvasPotato
EgoFormUna página de encuesta, con el panel de introducción como encabezado
Information (elementos de texto)Una página pure_display, con el Markdown reducido a texto plano
NameGenerator, NameGeneratorQuickAddEtapas name_generator, una por enunciado
NameGeneratorRostername_generator con un roster leído del recurso CSV o JSON del protocolo
additionalAttributes en un enunciadosets en ese generador de nombres
Campos adicionales en el formulario para añadir personasUna etapa name_interpreter justo después del generador de nombres
AlterFormname_interpreter
OrdinalBin, CategoricalBinname_interpreter con una pregunta radio por enunciado
DyadCensus, OneToManyDyadCensusdyad_census, con relation tomado del tipo de arista
TieStrengthCensusdyad_census con strength_labels tomado de las opciones de la variable de la arista
Sociogramsociogram, con concentricCircles como rings
minNodes, maxNodesmin_alters (primer enunciado), max_alters (cada enunciado)

Los valores de las opciones se conservan como respuestas guardadas, así que las exportaciones llevan los mismos códigos que el protocolo. La lógica de salto sobre variables del ego se convierte en show_when de página, y un salto a una etapa FinishSession se convierte en exit_when en la página anterior, así que un participante que no da su consentimiento sale del estudio en ese punto. Los protocolos con traducciones se importan en inglés salvo que indiques --survey-language.

Algunas cosas cambian. Todas las etapas de red de un tipo de nodo comparten una página, situada donde estaba la primera de ellas, así que una etapa de red que venía después de otras páginas pasa a ir antes que ellas, y la importación avisa de cada una. Arrastrar a las personas a casillas se convierte en una elección por persona, con los mismos valores guardados. La lógica de salto que comprueba datos de nodos o de aristas, AlterEdgeForm, Narrative, Geospatial y las etapas de genealogía, los selectores de fecha, los elementos multimedia y las notas del entrevistador aparecen en IMPORT_REPORT.md y no se importan.

Ejemplo

examples/advanced/ego-network/ ejecuta el esquema dos veces: como página de encuesta antes de la tarea, para la red propia del participante, y como tarea de anotación, en la que los codificadores registran la red que describe cada fragmento de entrevista.

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

Pon entre comillas "Yes" y "No" en las listas de etiquetas, porque YAML los lee sin comillas como booleanos, y escribe stage_layout: stacked, no layout: stacked, ya que layout es el mapeo de colocación en la cuadrícula que admiten todos los esquemas.

Lecturas adicionales

Para detalles de implementación, consulta la documentación fuente.