Scheduled service maintenance on November 22


On Friday, November 22, 2024, between 06:00 CET and 18:00 CET, GIN services will undergo planned maintenance. Extended service interruptions should be expected. We will try to keep downtimes to a minimum, but recommend that users avoid critical tasks, large data uploads, or DOI requests during this time.

We apologize for any inconvenience.

2 Commits 1068b16772 ... d911bc7cfd

Author SHA1 Message Date
  Lucas Gautheron d911bc7cfd [DATALAD] Recorded changes 10 hours ago
  Lucas Gautheron 0fbd39728b [DATALAD] Recorded changes 10 hours ago

+ 112 - 0
code/models/algo_only_simple.stan

@@ -0,0 +1,112 @@
+functions {
+    #include "blocks/confusion_model.stan"
+    #include "blocks/confusion_inverse_model.stan"
+    #include "blocks/behavior_model_truth.stan"
+}
+
+// TODO
+// use speech rates to set priors on truth_vocs
+data {
+    int<lower=1> n_classes; // number of classes
+
+    // analysis data block
+    int<lower=1> n_recs;
+    int<lower=1> n_children;
+
+    array[n_recs] int<lower=1> children;
+    array[n_recs] real<lower=1> age;
+    array[n_recs] int<lower=-1> siblings;
+    array[n_recs, n_classes] int<lower=0> vocs;
+    array[n_children] int<lower=1> corpus;
+
+    real<lower=0> recs_duration;
+
+    // speaker confusion data block
+    int<lower=1> n_clips;   // number of clips
+    int<lower=1> n_groups; // number of groups
+    int<lower=1> n_corpora;
+    array [n_clips] int group;
+    array [n_clips] int conf_corpus;
+    array [n_clips,n_classes] int<lower=0> algo_total; // algo vocs attributed to specific speakers
+    array [n_clips,n_classes] int<lower=0> truth_total;
+    array [n_clips] real<lower=0> clip_duration;
+    array [n_clips] real<lower=0> clip_age;
+
+    int<lower=0> n_validation;
+
+    // actual speech rates
+    int<lower=1> n_rates;
+    int<lower=1> n_speech_rate_children;
+
+    array [n_rates,n_classes] int<lower=0> speech_rates;
+    array [n_rates] int group_corpus;
+    array [n_rates] real<lower=0> durations;
+    array [n_rates] real<lower=0> speech_rate_age;
+    array [n_rates] int<lower=-1> speech_rate_siblings;
+    array [n_rates] int<lower=1,upper=n_speech_rate_children> speech_rate_child;
+
+    // parallel processing
+    int<lower=1> threads;
+}
+
+transformed data {
+    matrix<lower=0> [n_recs, n_classes] truth_vocs;
+    vector<lower=0>[n_groups] recording_age;
+    array[n_speech_rate_children] int<lower=1> speech_rate_child_corpus;
+
+    array[n_children] int<lower=-1> child_siblings;
+    array[n_speech_rate_children] int<lower=-1> speech_rate_child_siblings;
+    int no_siblings = 0;
+    int has_siblings = 0;
+
+    for (k in 1:n_recs) {
+        for (i in 1:n_classes) {
+            truth_vocs[k,i] = vocs[k,i]>0?vocs[k,i]:0.5;
+        }
+    }
+
+    for (c in 1:n_clips) {
+        recording_age[group[c]] = clip_age[c];
+    }
+
+    for (k in 1:n_rates) {
+        speech_rate_child_corpus[speech_rate_child[k]] = group_corpus[k];
+    }
+
+    for (k in 1:n_recs) {
+        child_siblings[children[k]] = siblings[k];
+    }
+
+    for (c in 1:n_children) {
+        if (child_siblings[c] == 0) {
+            no_siblings += 1;
+        }
+        else if (child_siblings[c] > 0) {
+            has_siblings += 1;
+        }
+    }
+
+    for (k in 1:n_rates) {
+        speech_rate_child_siblings[speech_rate_child[k]] = speech_rate_siblings[k];
+    }
+}
+
+parameters {
+    matrix<lower=0>[n_children,n_classes-1] mu_child_level;
+    vector [n_children] child_dev_age;
+
+    // behavior model parameters
+    #include "blocks/behavior_model_parameters_simple.stan"
+}
+
+model {
+    // contribution of full recordings to the model of behavior
+    #include "blocks/behavior_observations_model_simple.stan"
+
+    // priors on the hierarchical model of speech behavior
+    #include "blocks/behavior_model_priors_simple.stan"
+}
+
+generated quantities {
+    #include "blocks/behavior_model_generated.stan"
+}

+ 20 - 0
code/models/blocks/behavior_model_parameters_simple.stan

@@ -0,0 +1,20 @@
+vector<lower=0>[n_classes] alpha_child_level; // variance across recordings for a given child
+// array[2] vector<lower=0>[n_classes-1] alpha_corpus_level; // variance among children
+// matrix<lower=0>[n_classes-1,n_corpora] mu_corpus_level; // child-level average
+vector<lower=0>[n_classes-1] alpha_pop_level; // variance among corpora
+vector<lower=0>[n_classes] mu_pop_level; // population level averages
+//vector<lower=0>[n_classes-1] alpha_pop; // mean child-level variance
+
+// siblings
+real beta_sib_och; // effect of having siblings on OCH speech
+real beta_sib_adu; // effect of having siblings on ADU speech
+real<lower=0,upper=1> p_sib; // prob of having siblings
+
+
+// average effect of age
+real alpha_dev;
+real<lower=0> sigma_dev;
+
+// effect of excess ADU input
+real beta_dev;
+real beta_direct;

+ 13 - 0
code/models/blocks/behavior_model_priors_simple.stan

@@ -0,0 +1,13 @@
+alpha_child_level ~ gamma(4,1);
+mu_pop_level ~ exponential(4); // 250 vocs/hour
+alpha_pop_level ~ gamma(25, 1); // sd = 0.35 x \mu
+
+has_siblings ~ binomial(has_siblings+no_siblings, p_sib);
+p_sib ~ uniform(0, 1);
+beta_sib_och ~ normal(0, 1);
+beta_sib_adu ~ normal(0, 1);
+
+alpha_dev ~ normal(0, 1);
+sigma_dev ~ exponential(1);
+beta_dev ~ normal(0, 1);
+beta_direct ~ normal(0, 1);

+ 20 - 0
code/models/blocks/behavior_model_simple.stan

@@ -0,0 +1,20 @@
+vector<lower=0>[n_classes] alpha_child_level; // variance across recordings for a given child
+// array[2] vector<lower=0>[n_classes-1] alpha_corpus_level; // variance among children
+// matrix<lower=0>[n_classes-1,n_corpora] mu_corpus_level; // child-level average
+vector<lower=0>[n_classes-1] alpha_pop_level; // variance among corpora
+vector<lower=0>[n_classes] mu_pop_level; // population level averages
+//vector<lower=0>[n_classes-1] alpha_pop; // mean child-level variance
+
+// siblings
+real beta_sib_och; // effect of having siblings on OCH speech
+real beta_sib_adu; // effect of having siblings on ADU speech
+real<lower=0,upper=1> p_sib; // prob of having siblings
+
+
+// average effect of age
+real alpha_dev;
+real<lower=0> sigma_dev;
+
+// effect of excess ADU input
+real beta_dev;
+real beta_direct;

+ 59 - 0
code/models/blocks/behavior_observations_model_simple.stan

@@ -0,0 +1,59 @@
+// P(recs|child)
+real mu_adu = p_sib*(mu_pop_level[3]+mu_pop_level[4])+(1-p_sib)*(mu_pop_level[3]+mu_pop_level[4])*exp(beta_sib_adu/10.0);
+
+target += reduce_sum(
+    recs_priors_lpmf, children, 1,
+    n_recs, n_classes, recs_duration, age,
+    truth_vocs,
+    mu_pop_level, mu_adu, mu_child_level, alpha_child_level,
+    child_dev_age, alpha_dev, sigma_dev, beta_dev, beta_direct
+);
+
+// P(child|corpus)
+vector [2] ll;
+for (c in 1:n_children) {
+    // if there is sibling data
+    if (child_siblings[c]>=0) {
+        int distrib = child_siblings[c]==0?2:1;
+
+        mu_child_level[c,1] ~ gamma(
+            alpha_pop_level[distrib,1],
+            (alpha_pop_level[distrib,1]/(mu_pop_level[2,corpus[c]]*exp(
+                child_siblings[c]==0?beta_sib_och:0 
+            )))
+        );
+        mu_child_level[c,2:] ~ gamma(
+            alpha_pop_level[distrib,2:],
+            (alpha_pop_level[distrib,2:]./(mu_pop_level[3:,corpus[c]]*exp(
+                child_siblings[c]==0?beta_sib_adu/10.0:0 
+            )))
+        );
+    }
+    // otherwise
+    else {
+        // assuming no sibling
+        ll[1] = log(1-p_sib)+gamma_lpdf(
+            mu_child_level[c,1] | alpha_pop_level[2,1], alpha_pop_level[2,2]/(mu_pop_level[2,corpus[c]]*exp(beta_sib_och))
+        );
+        ll[1] += gamma_lpdf(
+            mu_child_level[c,2] | alpha_pop_level[2,2], alpha_pop_level[2,3]/(mu_pop_level[3,corpus[c]]*exp(beta_sib_adu/10.0))
+        );
+        ll[1] += gamma_lpdf(
+            mu_child_level[c,3] | alpha_pop_level[2,3], alpha_pop_level[2,4]/(mu_pop_level[4,corpus[c]]*exp(beta_sib_adu/10.0))
+        );
+
+        // assuming sibling
+        ll[2] = log(p_sib)+gamma_lpdf(
+            mu_child_level[c,1] | alpha_pop_level[1,1], alpha_pop_level[1,2]/(mu_pop_level[2,corpus[c]])
+        );
+        ll[2] += gamma_lpdf(
+            mu_child_level[c,2] | alpha_pop_level[1,2], alpha_pop_level[1,3]/(mu_pop_level[3,corpus[c]])
+        );
+        ll[2] += gamma_lpdf(
+            mu_child_level[c,3] | alpha_pop_level[1,3], alpha_pop_level[1,4]/(mu_pop_level[4,corpus[c]])
+        );
+        target += log_sum_exp(ll);
+    }
+}
+
+child_dev_age ~ normal(0, 1);