diff --git a/datapackage.json b/datapackage.json index 99d3d4f..861ee4c 100644 --- a/datapackage.json +++ b/datapackage.json @@ -27069,10 +27069,10 @@ } }, { - "name": "vas_120_min", - "path": "resources/vas_120_min/data.parquet", - "title": "vas_120_min", - "description": "vas_120_min", + "name": "vas", + "path": "resources/vas/data.parquet", + "title": "Visual analogue scale measurements", + "description": "Visual analogue scale measurements recorded at multiple timepoints relative to the meal.", "schema": { "fields": [ { @@ -27104,884 +27104,126 @@ ] }, { - "name": "vas_hunger_120min", - "title": "vas_hunger_120min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 120 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_120min", - "title": "vas_satisfaction_120min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 120 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_120min", - "title": "vas_full_120min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 120 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_120min", - "title": "vas_how_much_120min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 120 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_120min", - "title": "vas_comfort_120min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 120 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_120min", - "title": "vas_nausea_120min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 120min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_120min", - "title": "vas_thirst_120min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 120 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_120min", - "title": "vas_sweet_120min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 120 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_120min", - "title": "vas_salt_120min", - "type": "number", - "description": "Visual analogue scale. Salt at time 120 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_120min", - "title": "vas_fat_120min", - "type": "number", - "description": "Visual analogue scale. Fat at time 120 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_180_min", - "path": "resources/vas_180_min/data.parquet", - "title": "vas_180_min", - "description": "vas_180_min", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", - "constraints": { - "required": true, - "enum": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - "categories": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - { - "name": "vas_hunger_180min", - "title": "vas_hunger_180min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 180 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_180min", - "title": "vas_satisfaction_180min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 180 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_180min", - "title": "vas_full_180min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 180 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_180min", - "title": "vas_how_much_180min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 180 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_180min", - "title": "vas_comfort_180min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 180 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_180min", - "title": "vas_nausea_180min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 180min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_180min", - "title": "vas_thirst_180min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 180 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_180min", - "title": "vas_sweet_180min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 180 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_180min", - "title": "vas_salt_180min", - "type": "number", - "description": "Visual analogue scale. Salt at time 180 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_180min", - "title": "vas_fat_180min", - "type": "number", - "description": "Visual analogue scale. Fat at time 180 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_240_min", - "path": "resources/vas_240_min/data.parquet", - "title": "vas_240_min", - "description": "vas_240_min", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", - "constraints": { - "required": true, - "enum": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - "categories": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - { - "name": "vas_hunger_240min", - "title": "vas_hunger_240min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 240 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_240min", - "title": "vas_satisfaction_240min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 240 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_240min", - "title": "vas_full_240min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 240 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_240min", - "title": "vas_how_much_240min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 240 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_240min", - "title": "vas_comfort_240min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 240 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_240min", - "title": "vas_nausea_240min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 240min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_240min", - "title": "vas_thirst_240min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 240 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_240min", - "title": "vas_sweet_240min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 240 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_240min", - "title": "vas_salt_240min", - "type": "number", - "description": "Visual analogue scale. Salt at time 240 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_240min", - "title": "vas_fat_240min", - "type": "number", - "description": "Visual analogue scale. Fat at time 240 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_30min", - "path": "resources/vas_30min/data.parquet", - "title": "vas_30min", - "description": "vas_30min", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", - "constraints": { - "required": true, - "enum": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - "categories": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - { - "name": "vas_hunger_30min", - "title": "vas_hunger_30min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 30 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_30min", - "title": "vas_satisfaction_30min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 30 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_30min", - "title": "vas_full_30min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 30 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_30min", - "title": "vas_how_much_30min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 30 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_30min", - "title": "vas_comfort_30min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 30 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_30min", - "title": "vas_nausea_30min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 30 min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_30min", - "title": "vas_thirst_30min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 30 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_30min", - "title": "vas_sweet_30min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 30 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_30min", - "title": "vas_salt_30min", - "type": "number", - "description": "Visual analogue scale. Salt at time 30 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_30min", - "title": "vas_fat_30min", - "type": "number", - "description": "Visual analogue scale. Fat at time 30 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_60min", - "path": "resources/vas_60min/data.parquet", - "title": "vas_60min", - "description": "vas_60min", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", - "constraints": { - "required": true, - "enum": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - "categories": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - { - "name": "vas_hunger_60min", - "title": "vas_hunger_60min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 60 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_60min", - "title": "vas_satisfaction_60min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 60 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_60min", - "title": "vas_full_60min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 60 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_60min", - "title": "vas_how_much_60min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 60 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_60min", - "title": "vas_comfort_60min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 60 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_60min", - "title": "vas_nausea_60min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 60 min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_60min", - "title": "vas_thirst_60min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 60 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_60min", - "title": "vas_sweet_60min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 60 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_60min", - "title": "vas_salt_60min", - "type": "number", - "description": "Visual analogue scale. Salt at time 60 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_60min", - "title": "vas_fat_60min", - "type": "number", - "description": "Visual analogue scale. Fat at time 60 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_90_min", - "path": "resources/vas_90_min/data.parquet", - "title": "vas_90_min", - "description": "vas_90_min", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", - "constraints": { - "required": true, - "enum": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - "categories": [ - "Copenhagen", - "Aarhus", - "Odense" - ] - }, - { - "name": "vas_hunger_90min", - "title": "vas_hunger_90min", - "type": "number", - "description": "Visual analogue scale. Hunger at time 90 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | Jeg har aldrig været mere sulten", - "constraints": { - "required": true - } - }, - { - "name": "vas_satisfaction_90min", - "title": "vas_satisfaction_90min", - "type": "number", - "description": "Visual analogue scale. Satisfaction at time 90 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | Jeg kan ikke få en bid mere ned", - "constraints": { - "required": true - } - }, - { - "name": "vas_full_90min", - "title": "vas_full_90min", - "type": "number", - "description": "Visual analogue scale. Fullness at time 90 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | Fyldt totalt op", - "constraints": { - "required": true - } - }, - { - "name": "vas_how_much_90min", - "title": "vas_how_much_90min", - "type": "number", - "description": "Visual analogue scale. How much to eat at time 90 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_comfort_90min", - "title": "vas_comfort_90min", - "type": "number", - "description": "Visual analogue scale. Comfort at time 90 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | Virkelig godt", - "constraints": { - "required": true - } - }, - { - "name": "vas_nausea_90min", - "title": "vas_nausea_90min", - "type": "number", - "description": "Visual analogue scale. Nausea at time 90 min Question: Har du kvalme?. Slider scale labels: Ja, meget | Nej, slet ikke", - "constraints": { - "required": true - } - }, - { - "name": "vas_thirst_90min", - "title": "vas_thirst_90min", - "type": "number", - "description": "Visual analogue scale. Thirst at time 90 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | Virkelig meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_sweet_90min", - "title": "vas_sweet_90min", - "type": "number", - "description": "Visual analogue scale. Sweet at time 90 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_salt_90min", - "title": "vas_salt_90min", - "type": "number", - "description": "Visual analogue scale. Salt at time 90 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - }, - { - "name": "vas_fat_90min", - "title": "vas_fat_90min", - "type": "number", - "description": "Visual analogue scale. Fat at time 90 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | Ja, meget", - "constraints": { - "required": true - } - } - ], - "primaryKey": [ - "event" - ] - } - }, - { - "name": "vas_minus10", - "path": "resources/vas_minus10/data.parquet", - "title": "vas_minus10", - "description": "vas_minus10", - "schema": { - "fields": [ - { - "name": "event", - "title": "The unique name of the event", - "type": "string", - "description": "The unique name identifying the event when the form was filled in.", - "constraints": { - "required": true - } - }, - { - "name": "center", - "title": "Research center", - "type": "string", - "description": "The research center where the data item was recorded.", + "name": "minutes_from_meal", + "title": "Minutes from meal", + "type": "integer", + "description": "The time in minutes from the meal when the specific VAS measurement was recorded. Negative values are before the meal.", "constraints": { "required": true, "enum": [ - "Copenhagen", - "Aarhus", - "Odense" + -10, + 30, + 60, + 90, + 120, + 180, + 240 ] }, "categories": [ - "Copenhagen", - "Aarhus", - "Odense" + -10, + 30, + 60, + 90, + 120, + 180, + 240 ] }, { - "name": "vas_hunger_fasted_minus10min", - "title": "vas_hunger_fasted_minus10min", + "name": "hunger", + "title": "hunger", "type": "number", - "description": "Visual analogue scale. How hungry do you feel, at time minus 10 min Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | | Jeg har aldrig været mere sulten", + "description": "How hungry do you feel. Question: Hvor sulten er du?. Slider scale labels: Jeg er slet ikke sulten | | Jeg har aldrig været mere sulten", "constraints": { "required": true } }, { - "name": "vas_satisfaction_fasted_minus10min", - "title": "vas_satisfaction_fasted_minus10min", + "name": "satisfaction", + "title": "satisfaction", "type": "number", - "description": "Visual analogue scale. How satiated do you feel, at time minus 10 min Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | | Jeg kan ikke få en bid mere ned", + "description": "How satiated do you feel. Question: Hvor mæt er du?. Slider scale labels: Jeg har et stort hul i maven | | Jeg kan ikke få en bid mere ned", "constraints": { "required": true } }, { - "name": "vas_full_fasted_minus10min", - "title": "vas_full_fasted_minus10min", + "name": "full", + "title": "full", "type": "number", - "description": "Visual analogue scale. How full do you feel, at time minus 10 min Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | | Fyldt totalt op", + "description": "How full do you feel. Question: Hvor fyldt op føler du dig?. Slider scale labels: Slet ikke fyldt op | | Fyldt totalt op", "constraints": { "required": true } }, { - "name": "vas_how_much_fasted_minus10min", - "title": "vas_how_much_fasted_minus10min", + "name": "how_much", + "title": "how_much", "type": "number", - "description": "Visual analogue scale. How much do you think you can eat, at time minus 10 min Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | | Virkelig meget", + "description": "How much do you think you can eat. Question: Hvor meget tror du, at du kan spise?. Slider scale labels: Slet ingenting | | Virkelig meget", "constraints": { "required": true } }, { - "name": "vas_comfort_fasted_minus10min", - "title": "vas_comfort_fasted_minus10min", + "name": "comfort", + "title": "comfort", "type": "number", - "description": "Visual analogue scale. Level of comfort, at time minus 10 min Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | | Virkelig godt", + "description": "Level of comfort. Question: Hvordan føler du dig tilpas?. Slider scale labels: Virkelig dårligt | | Virkelig godt", "constraints": { "required": true } }, { - "name": "vas_nausea_fasted_minus10min", - "title": "vas_nausea_fasted_minus10min", + "name": "nausea", + "title": "nausea", "type": "number", - "description": "Visual analogue scale. Any nausea, at time minus 10 min Question: Har du kvalme?. Slider scale labels: Ja, meget | | Nej, slet ikke", + "description": "Any nausea. Question: Har du kvalme?. Slider scale labels: Ja, meget | | Nej, slet ikke", "constraints": { "required": true } }, { - "name": "vas_thirst_fasted_minus10min", - "title": "vas_thirst_fasted_minus10min", + "name": "thirst", + "title": "thirst", "type": "number", - "description": "Visual analogue scale. How thirsty do you feel, at time minus 10 min Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | | Virkelig meget", + "description": "How thirsty do you feel. Question: Hvor tørstig føler du dig?. Slider scale labels: Overhovedet ikke | | Virkelig meget", "constraints": { "required": true } }, { - "name": "vas_sweet_fasted_minus10min", - "title": "vas_sweet_fasted_minus10min", + "name": "sweet", + "title": "sweet", "type": "number", - "description": "Visual analogue scale. Would you like something sweet, at time minus 10 min Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | | Ja, meget", + "description": "Would you like something sweet. Question: Har du lyst til at spise noget sødt?. Slider scale labels: Nej, slet ikke | | Ja, meget", "constraints": { "required": true } }, { - "name": "vas_salt_fasted_minus10min", - "title": "vas_salt_fasted_minus10min", + "name": "salt", + "title": "salt", "type": "number", - "description": "Visual analogue scale. Would you like something savoury, at time minus 10 min Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | | Ja, meget", + "description": "Would you like something savoury. Question: Har du lyst til at spise noget salt?. Slider scale labels: Nej, slet ikke | | Ja, meget", "constraints": { "required": true } }, { - "name": "vas_fat_fasted_minus10min", - "title": "vas_fat_fasted_minus10min", + "name": "fat", + "title": "fat", "type": "number", - "description": "Visual analogue scale. Would you like something fatty, at time minus 10 min Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | | Ja, meget", + "description": "Would you like something fatty. Question: Har du lyst til at spise noget fedtrigt?. Slider scale labels: Nej, slet ikke | | Ja, meget", "constraints": { "required": true } } ], "primaryKey": [ - "event" + "event", + "minutes_from_meal" ] } }, diff --git a/scripts/redcap_dict_to_properties.py b/scripts/redcap_dict_to_properties.py index a22d0e5..a08574e 100644 --- a/scripts/redcap_dict_to_properties.py +++ b/scripts/redcap_dict_to_properties.py @@ -1,5 +1,6 @@ import json import re +from functools import reduce from itertools import chain, groupby from operator import itemgetter from pathlib import Path @@ -9,6 +10,9 @@ In = TypeVar("In") Out = TypeVar("Out") +VAS_TIMEPOINTS = [-10, 30, 60, 90, 120, 180, 240] +VAS_TIME_FORM_PATTERN = re.compile(r"^vas_(minus10|(30|60|90|120|180|240)_?min)$") +VAS_TIME_FIELD_PATTERN = re.compile(r"(_fasted)?_(minus10|30|60|90|120|180|240)min$") def _map(x: Iterable[In], fn: Callable[[In], Out]) -> list[Out]: @@ -34,6 +38,7 @@ def dictionary_to_properties( redcap_fields: list[dict[str, str]], ) -> list[sp.ResourceProperties]: """Converts REDCap data dictionary to Data Package resources.""" + redcap_fields = _join_vas_time_resources(redcap_fields) sorted_by_form = sorted(redcap_fields, key=lambda field: field["form_name"]) grouped_by_form = groupby(sorted_by_form, key=lambda field: field["form_name"]) return _map( @@ -42,6 +47,75 @@ def dictionary_to_properties( ) +def _join_vas_time_resources( + redcap_fields: list[dict[str, str]], +) -> list[dict[str, str]]: + """Combines REDCap VAS timepoint forms into one resource schema.""" + return _deduplicate_vas_fields( + _map(redcap_fields, _normalise_vas_time_resource_field) + ) + + +def _normalise_vas_time_resource_field(field: dict[str, str]) -> dict[str, str]: + if not _is_vas_time_resource_field(field): + return field + + return { + **field, + "field_name": _normalise_vas_field_name(field["field_name"]), + "form_name": "vas", + "field_annotation": _remove_vas_time_from_annotation(field["field_annotation"]), + } + + +def _normalise_vas_field_name(field_name: str) -> str: + return re.sub(r"^vas_", "", VAS_TIME_FIELD_PATTERN.sub("", field_name)) + + +def _is_vas_time_resource_field(field: dict[str, str]) -> bool: + return bool(VAS_TIME_FORM_PATTERN.match(field["form_name"])) + + +def _deduplicate_vas_fields(fields: list[dict[str, str]]) -> list[dict[str, str]]: + deduplicated_fields, _ = reduce( + _append_if_new_vas_field, + fields, + ([], set()), + ) + return deduplicated_fields + + +def _append_if_new_vas_field( + result: tuple[list[dict[str, str]], set[str]], field: dict[str, str] +) -> tuple[list[dict[str, str]], set[str]]: + fields, seen_vas_fields = result + field_name = field["field_name"] + + if field["form_name"] != "vas": + return fields + [field], seen_vas_fields + + if field_name in seen_vas_fields: + return result + + return (fields + [field], seen_vas_fields.union({field_name})) + + +def _remove_vas_time_from_annotation(annotation: str) -> str: + annotation = re.sub( + r"^Visual analogue scale\.\s*", + "", + annotation, + flags=re.IGNORECASE, + ) + + return re.sub( + r",?\s+at time\s+(minus\s+10|\d+)\s*min", + "", + annotation, + flags=re.IGNORECASE, + ).strip() + + def _form_to_resource( form_name: str, fields: list[dict[str, str]] ) -> sp.ResourceProperties: @@ -65,6 +139,26 @@ def _form_to_resource( enum=["Copenhagen", "Aarhus", "Odense"], ), ) + default_fields = [event_field, center_field] + primary_key = ["event"] + + if form_name == "vas": + time_field = sp.FieldProperties( + name="minutes_from_meal", + title="Minutes from meal", + type="integer", + description=( + "The time in minutes from the meal when the specific VAS " + "measurement was recorded. Negative values are before the meal." + ), + categories=VAS_TIMEPOINTS, + constraints=sp.ConstraintsProperties( + required=True, + enum=VAS_TIMEPOINTS, + ), + ) + default_fields.append(time_field) + primary_key.append("minutes_from_meal") # Discard fields displayed for information only form_redcap_fields = _filter( @@ -94,19 +188,37 @@ def _form_to_resource( fields, lambda field: field["field_type"] == "checkbox" ) checkbox_fields = _flat_map(checkbox_redcap_fields, _expand_checkbox_field) + resource_title = _get_resource_title(form_name) + resource_description = _get_resource_description(form_name) return sp.ResourceProperties( name=form_name, - # TODO: fill in title and description - title=form_name, - description=form_name, + title=resource_title, + description=resource_description, schema=sp.TableSchemaProperties( - primary_key=["event"], - fields=[event_field, center_field] + form_fields + checkbox_fields, + primary_key=primary_key, + fields=default_fields + form_fields + checkbox_fields, ), ) +def _get_resource_title(form_name: str) -> str: + if form_name == "vas": + return "Visual analogue scale measurements" + + return form_name + + +def _get_resource_description(form_name: str) -> str: + if form_name == "vas": + return ( + "Visual analogue scale measurements recorded at multiple timepoints " + "relative to the meal." + ) + + return form_name + + def _get_error_message(field: dict[str, str], key: str) -> str: return ( f"Unexpected value {field[key]!r} for `{key}` in field {field['field_name']!r} " @@ -179,6 +291,8 @@ def _get_description(redcap_field: dict[str, str]) -> str: + redcap_field["select_choices_or_calculations"] ) + description = re.sub(r"(?