Some background information

For this practical, we’ll be using open data from the following source: Wright, D. and London, K. (2011). Modern Regression Techniques Using R, London: Sage. (Chapter 8). This is available here.

This dataset contains information about a randomised controlled trial, in which primary school pupils were asked about the time they spent doing exercises (weekly). Then, their classes (within schools) were divided into 4 different groups and pupils within those classes were given different treatments:

  1. Control (no treatment at all)
  2. Leaflet (information about exercising)
  3. Leaflet+plan (the leaflet and a plan of exercise)
  4. Leaflet+plan+quiz (leaflet, plan and a quiz to do about exercising)

Pupils were asked again about the time they spent doing exercises (weekly) some time after the treatments were given.

The variable sqw2 is the outcome (time spent doing exercises after treatment). The variable sqw1 is the measure before the treatment. The variable wcond is the group or condition to which the class of the pupils was assigned

Typical workflow setup

a) Define a working directory

You can use any directory in your computer. As in the example below:

setwd("C:/myfolder")

b) Read in data

This is from Wright and London’s book website companion.

mydata<-read.delim("https://us.sagepub.com/sites/default/files/upm-binaries/26934_exercise.dat")

Note: You can safely ignore the warning when reading in the data.

c) Load packages

You always need to load the packages that you will be using. In this practical, we need to use the dplyr package:

library(dplyr)



Task 0: Outcome variable

The data we will use for this practical does not have a binary dependent variable, but we can easily create one by using a threshold for our continuous dependent variable sqw2

First, we gather some information about our variable:

summary(mydata$sqw2)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.7071  1.5811  1.8708  1.7892  2.1213  3.2404

The mean of sqw2 is 1.7892, so we’ll use that as a threshold. The function we use to create a new variable is ifelse:

mydata$bin_sqw2 <- ifelse(mydata$sqw2>=1.7892, 1, 0)

ifelse evaluates the condition mydata$sqw2>=1.7892; if true it returns 1 and if false it returns 0. To check whether this is done correctly, we can do the following:

mydata %>%
  group_by(bin_sqw2) %>%
  summarise(mean=mean(sqw2))
## # A tibble: 2 x 2
##   bin_sqw2  mean
##      <dbl> <dbl>
## 1        0  1.28
## 2        1  2.19

The mean for those in group 0 should be lower than the mean for those in group 1.



Task 1: Fit a simple binary logistic model

\[logit(p_i) = \ln(\frac{p_i}{1-p_i}) = \beta_0 + \beta_1x_{i1}\]

\(logit(p_i)\) is the link function that allows us to convert binary variables into continuous measures

\(\ln(\frac{p_i}{1-p_i})\) is the natural logarithm of the odds of the event of interest

\(\beta_0\) is the overall mean or intercept

\(\beta_1\) is the expected increase in the log-odds when x changes in one unit

\(x_{i1}\) is the independent variable


Note: It is worth noting that logistic regression does not have an error term (\(\epsilon\)). Without going into too much detail, this is because the variance \(p(1-p)\) of the binomial distribution depends on the mean \(p\)



Now let’s fit a logistic model. We’ll use the function glm (generalised linear model), which follows the same logic of the function lm that we use for linear regression. The difference is that we need to the subcommand family=binomial(logit) to indicate that this is a binary logistic regression model (BLR).

logmodel1<-glm(bin_sqw2 ~ sqw1, 
               family=binomial(logit),
               data=mydata)
summary(logmodel1)
## 
## Call:
## glm(formula = bin_sqw2 ~ sqw1, family = binomial(logit), data = mydata)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -3.1349  -0.7531   0.2855   0.7986   2.3886  
## 
## Coefficients:
##             Estimate Std. Error z value Pr(>|z|)    
## (Intercept)  -5.0855     0.4989  -10.19   <2e-16 ***
## sqw1          3.2418     0.2966   10.93   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 690.37  on 502  degrees of freedom
## Residual deviance: 461.18  on 501  degrees of freedom
## AIC: 465.18
## 
## Number of Fisher Scoring iterations: 5

According to this model, the baseline score sqw1 is significant predictor of scoring an average or above score after the trial. An increase of one unit implies an increase of 3.2418 log-odds of the outcome. The log-odds scale is not readily interpretable as it comes, but we know that a positive log-odds implies an increase in the odds (or probability) of the outcome of interest. So, the higher the score at baseline, the more likely a pupil is to score average or above after the trial. We’ll get back to the interpretation of this in the next task.

This is in line with what we found in the linear model. However, we know that the conditions of the trial also made a difference in scores after trial.



Task 2: Fit a multiple binary logistic model

The logic behind a multiple binary logistic model is the same than for linear regression. We rarely rely on one independent variable to explain variation in a dependent variable. We can extend the previous equation to allow for more independent variables as follows:

\[logit(p_i) = \ln(\frac{p_i}{1-p_i}) = \beta_0 + \beta_1x_{i1}+ \beta_2x_{i2} + \dots + \beta_nx_{in}\] All the terms mean the same as before, so we’ll focus on the new information:

\(\beta_2\) is the expected increase in the dependent variable conditional on the rest of the variables remaining constant

\(x_{i2}\) is a second independent variable

\(\beta_nx_{in}\) is used to indicate that there can be multiple independent variables

Now, let’s fit a model that includes the trial conditions (wcond):

logmodel2<-glm(bin_sqw2 ~ sqw1 + factor(wcond), 
               family=binomial(logit),
               data=mydata)
summary(logmodel2)
## 
## Call:
## glm(formula = bin_sqw2 ~ sqw1 + factor(wcond), family = binomial(logit), 
##     data = mydata)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -3.2124  -0.7585   0.2443   0.7218   2.6894  
## 
## Coefficients:
##                Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -5.9697     0.5782 -10.326  < 2e-16 ***
## sqw1             3.3664     0.3074  10.952  < 2e-16 ***
## factor(wcond)2   0.7479     0.3304   2.264  0.02359 *  
## factor(wcond)3   1.1452     0.3196   3.583  0.00034 ***
## factor(wcond)4   0.8838     0.3417   2.587  0.00969 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 690.37  on 502  degrees of freedom
## Residual deviance: 446.66  on 498  degrees of freedom
## AIC: 456.66
## 
## Number of Fisher Scoring iterations: 5

Each of the wcond coefficients refer to the difference between the specific condition and the control group. For example, wcond4 has an expected log-odds estimate that is 0.8838 larger than the log-odds of the control group. This is statistically significant since p=0.00969.

But the problem is that results are in the log-odds scale; thus, not necessarily easy to interpret. To see the results in odds ratio, we need to do exponentiation. You can do exp() for each coefficient separately, or you can access all the coefficients of the fitted model object.

exp(logmodel2$coefficients)
##    (Intercept)           sqw1 factor(wcond)2 factor(wcond)3 factor(wcond)4 
##    0.002554924   28.974302013    2.112561059    3.142957336    2.420035894

Now you can see that children in Leaflet+plan+quiz are 2.42 times as likely to have an average or above score after the trial as children in the control group.

Question time!

Q1. What is the effect of Leaflet+plan compared to the control group?

Confidence intervals

To get the confidence intervals for logmodel2 in the log-odds and the odds-ratio scales, we can type the following:

confint(logmodel2)
##                     2.5 %    97.5 %
## (Intercept)    -7.1616042 -4.890266
## sqw1            2.7953334  4.003209
## factor(wcond)2  0.1053595  1.403167
## factor(wcond)3  0.5262875  1.781631
## factor(wcond)4  0.2208882  1.563289
exp(confint(logmodel2))
##                       2.5 %       97.5 %
## (Intercept)     0.000775809  0.007519423
## sqw1           16.368085684 54.773627734
## factor(wcond)2  1.111109967  4.068062124
## factor(wcond)3  1.692636721  5.939534741
## factor(wcond)4  1.247183980  4.774499070



Bonus track

Odds can be further converted to probabilities by using the following formula:

\[p = \frac{OR}{1+OR} = \frac{exp(\beta)}{1+exp(\beta)}\]

Question time!

Q2. What is the probability of Leaflet to have an average or above score after the trial?

LS0tDQp0aXRsZTogIkxvZ2lzdGljIFJlZ3Jlc3Npb24gPGltZyBzcmM9XCJzZW1pbmFyc19sb2dvLnBuZ1wiIHdpZHRoPVwiMjAwXCIgaGVpZ2h0PVwiNTBcIiBzdHlsZT1cImZsb2F0OiByaWdodDtcIi8+Ig0KYXV0aG9yOiAiUGF0cmljaW8gVHJvbmNvc28iDQpkYXRlOiAiTGF0ZXN0IHVwZGF0ZTogTWFyY2ggMjAyMCINCm91dHB1dDogDQogIGh0bWxfZG9jdW1lbnQ6DQogICAgY29kZV9kb3dubG9hZDogeWVzDQogICAgaGlnaGxpZ2h0ZXI6IG51bGwNCiAgICB0aGVtZTogY29zbW8NCiAgICB0b2M6IHllcw0KICAgIHRvY19kZXB0aDogNA0KICAgIHRvY19mbG9hdDogeWVzDQogICAgZm9udHNpemU6IDEycHQNCiAgICBpbmNsdWRlczoNCiAgICAgIGFmdGVyX2JvZHk6IGZvb3Rlci5odG1sDQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQpgYGANCg0KIyBTb21lIGJhY2tncm91bmQgaW5mb3JtYXRpb24NCg0KRm9yIHRoaXMgcHJhY3RpY2FsLCB3ZeKAmWxsIGJlIHVzaW5nIG9wZW4gZGF0YSBmcm9tIHRoZSBmb2xsb3dpbmcgc291cmNlOiBXcmlnaHQsIEQuIGFuZCBMb25kb24sIEsuICgyMDExKS4gTW9kZXJuIFJlZ3Jlc3Npb24gVGVjaG5pcXVlcyBVc2luZyBSLCBMb25kb246ICBTYWdlLiAoQ2hhcHRlciA4KS4gVGhpcyBpcyBhdmFpbGFibGUgWypoZXJlKl0oaHR0cDovL2R4LmRvaS5vcmcvMTAuNDEzNS85NzgwODU3MDI0NDk3KS4NCg0KVGhpcyBkYXRhc2V0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcmFuZG9taXNlZCBjb250cm9sbGVkIHRyaWFsLCBpbiB3aGljaCBwcmltYXJ5IHNjaG9vbCBwdXBpbHMgd2VyZSBhc2tlZCBhYm91dCB0aGUgdGltZSB0aGV5IHNwZW50IGRvaW5nIGV4ZXJjaXNlcyAod2Vla2x5KS4gVGhlbiwgdGhlaXIgY2xhc3NlcyAod2l0aGluIHNjaG9vbHMpIHdlcmUgZGl2aWRlZCBpbnRvIDQgZGlmZmVyZW50IGdyb3VwcyBhbmQgcHVwaWxzIHdpdGhpbiB0aG9zZSBjbGFzc2VzIHdlcmUgZ2l2ZW4gZGlmZmVyZW50IHRyZWF0bWVudHM6DQogIA0KMSkgQ29udHJvbCAobm8gdHJlYXRtZW50IGF0IGFsbCkNCjIpIExlYWZsZXQgKGluZm9ybWF0aW9uIGFib3V0IGV4ZXJjaXNpbmcpDQozKSBMZWFmbGV0K3BsYW4gKHRoZSBsZWFmbGV0IGFuZCBhIHBsYW4gb2YgZXhlcmNpc2UpDQo0KSBMZWFmbGV0K3BsYW4rcXVpeiAobGVhZmxldCwgcGxhbiBhbmQgYSBxdWl6IHRvIGRvIGFib3V0IGV4ZXJjaXNpbmcpDQoNClB1cGlscyB3ZXJlIGFza2VkIGFnYWluIGFib3V0IHRoZSB0aW1lIHRoZXkgc3BlbnQgZG9pbmcgZXhlcmNpc2VzICh3ZWVrbHkpIHNvbWUgdGltZSBhZnRlciB0aGUgdHJlYXRtZW50cyB3ZXJlIGdpdmVuLg0KDQpUaGUgdmFyaWFibGUgc3F3MiBpcyB0aGUgb3V0Y29tZSAodGltZSBzcGVudCBkb2luZyBleGVyY2lzZXMgYWZ0ZXIgdHJlYXRtZW50KS4NClRoZSB2YXJpYWJsZSBzcXcxIGlzIHRoZSBtZWFzdXJlIGJlZm9yZSB0aGUgdHJlYXRtZW50Lg0KVGhlIHZhcmlhYmxlIHdjb25kIGlzIHRoZSBncm91cCBvciBjb25kaXRpb24gdG8gd2hpY2ggdGhlIGNsYXNzIG9mIHRoZSBwdXBpbHMgd2FzIGFzc2lnbmVkDQoNCiMgVHlwaWNhbCB3b3JrZmxvdyBzZXR1cA0KDQojIyBhKSBEZWZpbmUgYSB3b3JraW5nIGRpcmVjdG9yeQ0KDQpZb3UgY2FuIHVzZSBhbnkgZGlyZWN0b3J5IGluIHlvdXIgY29tcHV0ZXIuIEFzIGluIHRoZSBleGFtcGxlIGJlbG93Og0KDQpgYGB7fQ0Kc2V0d2QoIkM6L215Zm9sZGVyIikNCmBgYA0KDQojIyBiKSBSZWFkIGluIGRhdGEgDQoNClRoaXMgaXMgZnJvbSBXcmlnaHQgYW5kIExvbmRvbidzIGJvb2sgd2Vic2l0ZSBjb21wYW5pb24uIA0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCm15ZGF0YTwtcmVhZC5kZWxpbSgiaHR0cHM6Ly91cy5zYWdlcHViLmNvbS9zaXRlcy9kZWZhdWx0L2ZpbGVzL3VwbS1iaW5hcmllcy8yNjkzNF9leGVyY2lzZS5kYXQiKQ0KYGBgDQoNCk5vdGU6IFlvdSBjYW4gc2FmZWx5IGlnbm9yZSB0aGUgd2FybmluZyB3aGVuIHJlYWRpbmcgaW4gdGhlIGRhdGEuDQoNCiMjIGMpIExvYWQgcGFja2FnZXMNCg0KWW91IGFsd2F5cyBuZWVkIHRvIGxvYWQgdGhlIHBhY2thZ2VzIHRoYXQgeW91IHdpbGwgYmUgdXNpbmcuIEluIHRoaXMgcHJhY3RpY2FsLCB3ZSBuZWVkIHRvIHVzZSB0aGUgYGRwbHlyYCBwYWNrYWdlOg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GfQ0KbGlicmFyeShkcGx5cikNCmBgYA0KDQo8YnI+DQoNCioqKg0KDQojIFRhc2sgMDogT3V0Y29tZSB2YXJpYWJsZQ0KDQpUaGUgZGF0YSB3ZSB3aWxsIHVzZSBmb3IgdGhpcyBwcmFjdGljYWwgZG9lcyBub3QgaGF2ZSBhIGJpbmFyeSBkZXBlbmRlbnQgdmFyaWFibGUsIGJ1dCB3ZSBjYW4gZWFzaWx5IGNyZWF0ZSBvbmUgYnkgdXNpbmcgYSB0aHJlc2hvbGQgZm9yIG91ciBjb250aW51b3VzIGRlcGVuZGVudCB2YXJpYWJsZSBgc3F3MmANCg0KRmlyc3QsIHdlIGdhdGhlciBzb21lIGluZm9ybWF0aW9uIGFib3V0IG91ciB2YXJpYWJsZToNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCnN1bW1hcnkobXlkYXRhJHNxdzIpDQpgYGANCg0KVGhlIG1lYW4gb2YgYHNxdzJgIGlzIDEuNzg5Miwgc28gd2UnbGwgdXNlIHRoYXQgYXMgYSB0aHJlc2hvbGQuIFRoZSBmdW5jdGlvbiB3ZSB1c2UgdG8gY3JlYXRlIGEgbmV3IHZhcmlhYmxlIGlzIGlmZWxzZToNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCm15ZGF0YSRiaW5fc3F3MiA8LSBpZmVsc2UobXlkYXRhJHNxdzI+PTEuNzg5MiwgMSwgMCkNCmBgYA0KDQpgaWZlbHNlYCBldmFsdWF0ZXMgdGhlIGNvbmRpdGlvbiBgbXlkYXRhJHNxdzI+PTEuNzg5MmA7IGlmIHRydWUgaXQgcmV0dXJucyAxIGFuZCBpZiBmYWxzZSBpdCByZXR1cm5zIDAuIFRvIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBkb25lIGNvcnJlY3RseSwgd2UgY2FuIGRvIHRoZSBmb2xsb3dpbmc6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpteWRhdGEgJT4lDQogIGdyb3VwX2J5KGJpbl9zcXcyKSAlPiUNCiAgc3VtbWFyaXNlKG1lYW49bWVhbihzcXcyKSkNCmBgYA0KDQpUaGUgbWVhbiBmb3IgdGhvc2UgaW4gZ3JvdXAgMCBzaG91bGQgYmUgbG93ZXIgdGhhbiB0aGUgbWVhbiBmb3IgdGhvc2UgaW4gZ3JvdXAgMS4NCg0KPGJyPg0KDQoqKioNCg0KIyBUYXNrIDE6IEZpdCBhIHNpbXBsZSBiaW5hcnkgbG9naXN0aWMgbW9kZWwNCg0KJCRsb2dpdChwX2kpID0gXGxuKFxmcmFje3BfaX17MS1wX2l9KSA9IFxiZXRhXzAgKyBcYmV0YV8xeF97aTF9JCQNCg0KJGxvZ2l0KHBfaSkkIGlzIHRoZSBgbGlua2AgZnVuY3Rpb24gdGhhdCBhbGxvd3MgdXMgdG8gY29udmVydCBiaW5hcnkgdmFyaWFibGVzIGludG8gY29udGludW91cyBtZWFzdXJlcw0KDQokXGxuKFxmcmFje3BfaX17MS1wX2l9KSQgaXMgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBgb2Rkc2Agb2YgdGhlIGV2ZW50IG9mIGludGVyZXN0DQoNCiRcYmV0YV8wJCBpcyB0aGUgb3ZlcmFsbCBtZWFuIG9yIGludGVyY2VwdA0KDQokXGJldGFfMSQgaXMgdGhlIGV4cGVjdGVkIGluY3JlYXNlIGluIHRoZSBgbG9nLW9kZHNgIHdoZW4gYHhgIGNoYW5nZXMgaW4gb25lIHVuaXQNCg0KJHhfe2kxfSQgaXMgdGhlIGluZGVwZW5kZW50IHZhcmlhYmxlDQoNCioqKg0KDQoqKk5vdGU6KiogSXQgaXMgd29ydGggbm90aW5nIHRoYXQgbG9naXN0aWMgcmVncmVzc2lvbiBkb2VzIG5vdCBoYXZlIGFuIGVycm9yIHRlcm0gKCRcZXBzaWxvbiQpLiBXaXRob3V0IGdvaW5nIGludG8gdG9vIG11Y2ggZGV0YWlsLCB0aGlzIGlzIGJlY2F1c2UgdGhlIHZhcmlhbmNlICRwKDEtcCkkIG9mIHRoZSBiaW5vbWlhbCBkaXN0cmlidXRpb24gZGVwZW5kcyBvbiB0aGUgbWVhbiAkcCQgDQoNCioqKg0KPGJyPg0KDQpOb3cgbGV0J3MgZml0IGEgbG9naXN0aWMgbW9kZWwuIFdlJ2xsIHVzZSB0aGUgZnVuY3Rpb24gYGdsbWAgKGdlbmVyYWxpc2VkIGxpbmVhciBtb2RlbCksIHdoaWNoIGZvbGxvd3MgdGhlIHNhbWUgbG9naWMgb2YgdGhlIGZ1bmN0aW9uIGBsbWAgdGhhdCB3ZSB1c2UgZm9yIGxpbmVhciByZWdyZXNzaW9uLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdlIG5lZWQgdG8gdGhlIHN1YmNvbW1hbmQgYGZhbWlseT1iaW5vbWlhbChsb2dpdClgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIGJpbmFyeSBsb2dpc3RpYyByZWdyZXNzaW9uIG1vZGVsIChCTFIpLg0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GfQ0KbG9nbW9kZWwxPC1nbG0oYmluX3NxdzIgfiBzcXcxLCANCiAgICAgICAgICAgICAgIGZhbWlseT1iaW5vbWlhbChsb2dpdCksDQogICAgICAgICAgICAgICBkYXRhPW15ZGF0YSkNCnN1bW1hcnkobG9nbW9kZWwxKQ0KYGBgDQoNCkFjY29yZGluZyB0byB0aGlzIG1vZGVsLCB0aGUgYmFzZWxpbmUgc2NvcmUgYHNxdzFgIGlzIHNpZ25pZmljYW50IHByZWRpY3RvciBvZiBzY29yaW5nIGFuIGF2ZXJhZ2Ugb3IgYWJvdmUgc2NvcmUgYWZ0ZXIgdGhlIHRyaWFsLiBBbiBpbmNyZWFzZSBvZiBvbmUgdW5pdCBpbXBsaWVzIGFuIGluY3JlYXNlIG9mIDMuMjQxOCBsb2ctb2RkcyBvZiB0aGUgb3V0Y29tZS4gVGhlIGxvZy1vZGRzIHNjYWxlIGlzIG5vdCByZWFkaWx5IGludGVycHJldGFibGUgYXMgaXQgY29tZXMsIGJ1dCB3ZSBrbm93IHRoYXQgYSBwb3NpdGl2ZSBsb2ctb2RkcyBpbXBsaWVzIGFuIGluY3JlYXNlIGluIHRoZSBvZGRzIChvciBwcm9iYWJpbGl0eSkgb2YgdGhlIG91dGNvbWUgb2YgaW50ZXJlc3QuIFNvLCB0aGUgaGlnaGVyIHRoZSBzY29yZSBhdCBiYXNlbGluZSwgdGhlIG1vcmUgbGlrZWx5IGEgcHVwaWwgaXMgdG8gc2NvcmUgYXZlcmFnZSBvciBhYm92ZSBhZnRlciB0aGUgdHJpYWwuIA0KV2UnbGwgZ2V0IGJhY2sgdG8gdGhlIGludGVycHJldGF0aW9uIG9mIHRoaXMgaW4gdGhlIG5leHQgdGFzay4gDQoNClRoaXMgaXMgaW4gbGluZSB3aXRoIHdoYXQgd2UgZm91bmQgaW4gdGhlIGxpbmVhciBtb2RlbC4gSG93ZXZlciwgd2Uga25vdyB0aGF0IHRoZSBjb25kaXRpb25zIG9mIHRoZSB0cmlhbCBhbHNvIG1hZGUgYSBkaWZmZXJlbmNlIGluIHNjb3JlcyBhZnRlciB0cmlhbC4NCg0KPGJyPg0KDQoqKioNCg0KIyBUYXNrIDI6IEZpdCBhIG11bHRpcGxlIGJpbmFyeSBsb2dpc3RpYyBtb2RlbA0KDQpUaGUgbG9naWMgYmVoaW5kIGEgbXVsdGlwbGUgYmluYXJ5IGxvZ2lzdGljIG1vZGVsIGlzIHRoZSBzYW1lIHRoYW4gZm9yIGxpbmVhciByZWdyZXNzaW9uLiBXZSByYXJlbHkgcmVseSBvbiBvbmUgaW5kZXBlbmRlbnQgdmFyaWFibGUgdG8gZXhwbGFpbiB2YXJpYXRpb24gaW4gYSBkZXBlbmRlbnQgdmFyaWFibGUuIFdlIGNhbiBleHRlbmQgdGhlIHByZXZpb3VzIGVxdWF0aW9uIHRvIGFsbG93IGZvciBtb3JlIGluZGVwZW5kZW50IHZhcmlhYmxlcyBhcyBmb2xsb3dzOg0KDQokJGxvZ2l0KHBfaSkgPSBcbG4oXGZyYWN7cF9pfXsxLXBfaX0pID0gXGJldGFfMCArIFxiZXRhXzF4X3tpMX0rIFxiZXRhXzJ4X3tpMn0gKyBcZG90cyArIFxiZXRhX254X3tpbn0kJA0KQWxsIHRoZSB0ZXJtcyBtZWFuIHRoZSBzYW1lIGFzIGJlZm9yZSwgc28gd2UnbGwgZm9jdXMgb24gdGhlIG5ldyBpbmZvcm1hdGlvbjoNCg0KJFxiZXRhXzIkIGlzIHRoZSBleHBlY3RlZCBpbmNyZWFzZSBpbiB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGNvbmRpdGlvbmFsIG9uIHRoZSByZXN0IG9mIHRoZSB2YXJpYWJsZXMgcmVtYWluaW5nIGNvbnN0YW50DQoNCiR4X3tpMn0kIGlzIGEgc2Vjb25kIGluZGVwZW5kZW50IHZhcmlhYmxlIA0KDQokXGJldGFfbnhfe2lufSQgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGNhbiBiZSBtdWx0aXBsZSBpbmRlcGVuZGVudCB2YXJpYWJsZXMNCg0KTm93LCBsZXQncyBmaXQgYSBtb2RlbCB0aGF0IGluY2x1ZGVzIHRoZSB0cmlhbCBjb25kaXRpb25zIChgd2NvbmRgKToNCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCmxvZ21vZGVsMjwtZ2xtKGJpbl9zcXcyIH4gc3F3MSArIGZhY3Rvcih3Y29uZCksIA0KICAgICAgICAgICAgICAgZmFtaWx5PWJpbm9taWFsKGxvZ2l0KSwNCiAgICAgICAgICAgICAgIGRhdGE9bXlkYXRhKQ0Kc3VtbWFyeShsb2dtb2RlbDIpDQpgYGANCg0KRWFjaCBvZiB0aGUgd2NvbmQgY29lZmZpY2llbnRzIHJlZmVyIHRvIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNwZWNpZmljIGNvbmRpdGlvbiBhbmQgdGhlIGNvbnRyb2wgZ3JvdXAuIEZvciBleGFtcGxlLCBgd2NvbmQ0YCBoYXMgYW4gZXhwZWN0ZWQgbG9nLW9kZHMgZXN0aW1hdGUgdGhhdCBpcyAwLjg4MzggbGFyZ2VyIHRoYW4gdGhlIGxvZy1vZGRzIG9mIHRoZSBjb250cm9sIGdyb3VwLiBUaGlzIGlzIHN0YXRpc3RpY2FsbHkgc2lnbmlmaWNhbnQgc2luY2UgYHA9MC4wMDk2OWAuDQoNCkJ1dCB0aGUgcHJvYmxlbSBpcyB0aGF0IHJlc3VsdHMgYXJlIGluIHRoZSBsb2ctb2RkcyBzY2FsZTsgdGh1cywgbm90IG5lY2Vzc2FyaWx5IGVhc3kgdG8gaW50ZXJwcmV0LiBUbyBzZWUgdGhlIHJlc3VsdHMgaW4gb2RkcyByYXRpbywgd2UgbmVlZCB0byBkbyBleHBvbmVudGlhdGlvbi4gWW91IGNhbiBkbyBleHAoKSBmb3IgZWFjaCBjb2VmZmljaWVudCBzZXBhcmF0ZWx5LCBvciB5b3UgY2FuIGFjY2VzcyBhbGwgdGhlIGNvZWZmaWNpZW50cyBvZiB0aGUgZml0dGVkIG1vZGVsIG9iamVjdC4NCg0KYGBge3IsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9Rn0NCg0KZXhwKGxvZ21vZGVsMiRjb2VmZmljaWVudHMpDQoNCmBgYA0KDQpOb3cgeW91IGNhbiBzZWUgdGhhdCBjaGlsZHJlbiBpbiBMZWFmbGV0K3BsYW4rcXVpeiBhcmUgMi40MiB0aW1lcyBhcyBsaWtlbHkgdG8gaGF2ZSBhbiBhdmVyYWdlIG9yIGFib3ZlIHNjb3JlIGFmdGVyIHRoZSB0cmlhbCBhcyBjaGlsZHJlbiBpbiB0aGUgY29udHJvbCBncm91cC4NCg0KIyMgUXVlc3Rpb24gdGltZSENCg0KKipRMS4qKiBXaGF0IGlzIHRoZSBlZmZlY3Qgb2YgTGVhZmxldCtwbGFuIGNvbXBhcmVkIHRvIHRoZSBjb250cm9sIGdyb3VwPw0KDQojIyBDb25maWRlbmNlIGludGVydmFscw0KDQpUbyBnZXQgdGhlIGNvbmZpZGVuY2UgaW50ZXJ2YWxzIGZvciBsb2dtb2RlbDIgaW4gdGhlIGxvZy1vZGRzIGFuZCB0aGUgb2Rkcy1yYXRpbyBzY2FsZXMsIHdlIGNhbiB0eXBlIHRoZSBmb2xsb3dpbmc6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQoNCmNvbmZpbnQobG9nbW9kZWwyKQ0KZXhwKGNvbmZpbnQobG9nbW9kZWwyKSkNCg0KYGBgDQoNCjxicj4NCg0KKioqDQoNCiMgQm9udXMgdHJhY2sNCg0KT2RkcyBjYW4gYmUgZnVydGhlciBjb252ZXJ0ZWQgdG8gcHJvYmFiaWxpdGllcyBieSB1c2luZyB0aGUgZm9sbG93aW5nIGZvcm11bGE6DQoNCiQkcCA9IFxmcmFje09SfXsxK09SfSA9IFxmcmFje2V4cChcYmV0YSl9ezErZXhwKFxiZXRhKX0kJA0KPGJyPg0KDQoNCiMjIFF1ZXN0aW9uIHRpbWUhDQoNCioqUTIuKiogV2hhdCBpcyB0aGUgcHJvYmFiaWxpdHkgb2YgTGVhZmxldCB0byBoYXZlIGFuIGF2ZXJhZ2Ugb3IgYWJvdmUgc2NvcmUgYWZ0ZXIgdGhlIHRyaWFsPw0K
 

Patricio Troncoso

patricio.troncoso@manchester.ac.uk