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, ggplot2 is optional, but we’ll load it anyway:
library(ggplot2)
Task 1: Correlation
Before we start any data analysis process, we need to explore our variables. In the case of linear regression, it is good to know how correlated our variables are.
What is the correlation between exercise before and after the intervention?
cor(mydata$sqw2, mydata$sqw1)
## [1] 0.7648664
Correlations go from -1 to 1, so we can safely say that these two variables are highly correlated. This is not surprising at all, since what we’re measuring is behaviour (time spent doing exercises) and you know what they say “the best predictor of future behaviour is past behaviour” .
In any case, this is overly simplistic, so we’ll proceed to run a series of linear regression models.
Task 2: Simple linear regression
Simple linear regression has the following algebraic form:
\[Y_i = \beta_0 + \beta_1x_{i1} + \epsilon_i\]
Where:
\(Y_i\) is the dependent variable (outcome of interest)
\(\beta_0\) is the intercept (overall mean)
\(\beta_1\) is the change in the dependent variable when the independent variable changes in one unit
\(x_{i1}\) is the independent variable (aka explanatory variable, predictor or covariate)
\(\epsilon_i\) is the residual
To run a simple linear regression, we need to specify a name for our model (model1) and then call the function lm (linear model). Then we specify the data we will use mydata. Finally, we specify the actual statistical model: sqw2 on the left-hand side as the dependent variable followed by ~ and then the right-hand side contains the independent variable sqw1.
model1 <- lm(data = mydata, sqw2 ~ sqw1)
summary(model1)
##
## Call:
## lm(formula = sqw2 ~ sqw1, data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.21789 -0.23311 0.01738 0.19632 1.25155
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.58851 0.04799 12.26 <2e-16 ***
## sqw1 0.71438 0.02688 26.58 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3632 on 501 degrees of freedom
## Multiple R-squared: 0.585, Adjusted R-squared: 0.5842
## F-statistic: 706.3 on 1 and 501 DF, p-value: < 2.2e-16
Question time!
Q1. What is the effect of sqw1 on sqw2?
Q2. How much variance is explained?
Task 3: Multiple linear regression
Normally in social sciences, you wouldn’t expect phenomena to be explained by only one variable. In the example we’re working on
\[Y_i = \beta_0 + \beta_1x_{i1} + \beta_2x_{i2} + \dots + \beta_nx_{in} + \epsilon_i\] 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, run a multiple linear regression model by adding the experimental condition variable.
Tip: The experimental condition is a categorical variable. In R, categorical variables are referred to as “factor”. To add a factor variable to a regression model, you need to specify it as such:
factor(name_of_variable)
model2 <- lm(data = mydata, sqw2 ~ sqw1 + factor(wcond))
summary(model2)
##
## Call:
## lm(formula = sqw2 ~ sqw1 + factor(wcond), data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.29138 -0.20989 0.05553 0.17752 1.19031
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.44117 0.05419 8.142 3.15e-15 ***
## sqw1 0.71615 0.02630 27.225 < 2e-16 ***
## factor(wcond)2 0.15754 0.04431 3.556 0.000413 ***
## factor(wcond)3 0.20734 0.04403 4.709 3.22e-06 ***
## factor(wcond)4 0.21753 0.04525 4.808 2.03e-06 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3536 on 498 degrees of freedom
## Multiple R-squared: 0.6091, Adjusted R-squared: 0.606
## F-statistic: 194 on 4 and 498 DF, p-value: < 2.2e-16
Question time!
Q3. What is the effect of condition 2 in relation to the control group?
Q4. What is the effect of condition 3 in relation to the control group?
Q5. What is the effect of condition 4 in relation to the control group?
Task 4: Adding interaction effects
Adding interaction is fairly straightforward in R. All you need to do is “multiply” the terms you want to interact (using *).
Take the previous model and add an interaction term between the experimental condition and exercise before the intervention.
model3 <- lm(data = mydata, sqw2 ~ sqw1 + factor(wcond) + sqw1*factor(wcond))
summary(model3)
##
## Call:
## lm(formula = sqw2 ~ sqw1 + factor(wcond) + sqw1 * factor(wcond),
## data = mydata)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.29475 -0.20625 0.05175 0.15790 1.27243
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 0.38351 0.09700 3.954 8.82e-05 ***
## sqw1 0.75041 0.05460 13.744 < 2e-16 ***
## factor(wcond)2 0.39801 0.13079 3.043 0.00247 **
## factor(wcond)3 0.11658 0.13936 0.837 0.40326
## factor(wcond)4 0.23328 0.13393 1.742 0.08215 .
## sqw1:factor(wcond)2 -0.13978 0.07225 -1.935 0.05361 .
## sqw1:factor(wcond)3 0.05949 0.08123 0.732 0.46428
## sqw1:factor(wcond)4 -0.01006 0.07398 -0.136 0.89184
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.3518 on 495 degrees of freedom
## Multiple R-squared: 0.6153, Adjusted R-squared: 0.6099
## F-statistic: 113.1 on 7 and 495 DF, p-value: < 2.2e-16
Question time!
Q6. What is the R-squared of this model?
Q7. Does the addition of interactions improve the model?
Task 5: Predictions
You can calculate predicted values by using the values of the coefficients. So, for example, you can predict the score of a pupil who scored 2 in the baseline measure and was in the control group as such:
Since the control group is coded 0, the equation for these pupils reduces to:
\({Y}_i = \beta_0 + \beta_1x_{i1}\)
Then
\(\hat{y} = 0.38351 + 0.75041*baseline\)
\(\hat{y} = 0.38351 + 0.75041*2\)
\(\hat{y} = 1.88433\)
The predicted score after the trial for a child in the control group who scored 2 at baseline is then 1.88433.
Question time!
Q8. What is the predicted score for a child in condition 2 that scored 1.5 at baseline?
Plotting the estimated model
To do this, you can retrieve the predictions from your model object and plot them against the observed values of x
mydata$predicted <- fitted(model3)
Remember: You need to load ggplot2 for this!
library(ggplot2)
Then draw a line plot. The resulting line is the predicted effect of sqw1 on sqw2, conditional upon the experimental condition and the interaction between sqw1 and the experimental condition.
plot1 <- ggplot(mydata, aes(y = predicted, x = sqw1)) +
geom_smooth(method = "lm", aes(y = predicted, x = sqw1), se=F)
plot1

Task 6: Checking assumptions
We are going to focus on the two most basic assumption checks that you can do, which are to do with the residuals. We will use graphic methods, since they are quite straightforward and easily understood.
6.1. Normality of residuals
A key assumption in linear regression is that our residuals are normally distributed. This means roughly that whatever is left unexplained by our model could be thought of as random variation or “white noise”.
The normality of the residuals can be checked by running a formal statistical test, e.g. the Kolmogorov-Smirnov test, but those methods can be overly sensitive to small departures. Graphic methods, such as drawing a histogram or a Q-Q plot, are widely used instead.
To draw a Q-Q plot from your model results, you can quickly use the base package as such:
plot(model3,2)

The result is a Q-Q plot or normal quantile plot. It compares the residuals against the normal distribution. Put simply, the residuals (dots on the plot) should all lie on the diagonal line. Any obvious patterns would indicate that our model does not meet the normality assumption.
In the plot above, we can see that the extremes of the distribution depart from normality, which could be indicating that there are outliers. It may also be the case that we need to control for other variables.
6.2. Homoscedasticity
Homoscedasticity means that residuals should distribute evenly in terms of spread across the predicted values of our model. In other words, if we plot residuals vs fitted values, it should look completely random, i.e. a random cloud of dots.
To check this, we can run the following code:
plot(model3,1)

What we are interested to see here is no obvious patterns. In this specific plot, there seems to be some non-random pattern (not a huge one). The left-hand side of the distribution (lower predicted values) tends to have more positive residuals, whereas the right-hand side has more negative residuals. How do you address this? Usually by adding more variables to the model.
Bonus track
You can add the residuals to your data (as a new variable) to be able to work with them alongside the observed data more easily. To retrieve the residuals of your model, you can do the following:
mydata$residuals <- residuals(model3)
Then you can manipulate them as you wish and, for example, draw plots with ggplot2:
This is to draw a histogram of the residuals with the ggplot2 package:
hist <- ggplot(mydata, aes(residuals)) + geom_histogram()
hist

And this is to check for homoscedasticity:
homoscedasticity <- ggplot(mydata, aes(y = residuals, x = predicted)) + geom_point()
homoscedasticity

Acknowledgement
This practical reproduces some of the materials created by Ana Morales-Gomez, UKDS, The University of Manchester. Those materials are available here.
LS0tDQp0aXRsZTogIkxpbmVhciBSZWdyZXNzaW9uIDxpbWcgc3JjPVwic2VtaW5hcnNfbG9nby5wbmdcIiB3aWR0aD1cIjIwMFwiIGhlaWdodD1cIjUwXCIgc3R5bGU9XCJmbG9hdDogcmlnaHQ7XCIvPiINCmF1dGhvcjogIlBhdHJpY2lvIFRyb25jb3NvIg0KZGF0ZTogIkxhdGVzdCB1cGRhdGU6IE1hcmNoIDIwMjAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KICAgIGhpZ2hsaWdodGVyOiBudWxsDQogICAgdGhlbWU6IGNvc21vDQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZGVwdGg6IDQNCiAgICB0b2NfZmxvYXQ6IHllcw0KICAgIGZvbnRzaXplOiAxMnB0DQogICAgaW5jbHVkZXM6DQogICAgICBhZnRlcl9ib2R5OiBmb290ZXIuaHRtbA0KLS0tDQoNCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQ0KYGBgDQoNCiMgU29tZSBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uDQoNCkZvciB0aGlzIHByYWN0aWNhbCwgd2XigJlsbCBiZSB1c2luZyBvcGVuIGRhdGEgZnJvbSB0aGUgZm9sbG93aW5nIHNvdXJjZTogV3JpZ2h0LCBELiBhbmQgTG9uZG9uLCBLLiAoMjAxMSkuIE1vZGVybiBSZWdyZXNzaW9uIFRlY2huaXF1ZXMgVXNpbmcgUiwgTG9uZG9uOiAgU2FnZS4gKENoYXB0ZXIgOCkuIFRoaXMgaXMgYXZhaWxhYmxlIFsqaGVyZSpdKGh0dHA6Ly9keC5kb2kub3JnLzEwLjQxMzUvOTc4MDg1NzAyNDQ5NykuDQoNClRoaXMgZGF0YXNldCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHJhbmRvbWlzZWQgY29udHJvbGxlZCB0cmlhbCwgaW4gd2hpY2ggcHJpbWFyeSBzY2hvb2wgcHVwaWxzIHdlcmUgYXNrZWQgYWJvdXQgdGhlIHRpbWUgdGhleSBzcGVudCBkb2luZyBleGVyY2lzZXMgKHdlZWtseSkuIFRoZW4sIHRoZWlyIGNsYXNzZXMgKHdpdGhpbiBzY2hvb2xzKSB3ZXJlIGRpdmlkZWQgaW50byA0IGRpZmZlcmVudCBncm91cHMgYW5kIHB1cGlscyB3aXRoaW4gdGhvc2UgY2xhc3NlcyB3ZXJlIGdpdmVuIGRpZmZlcmVudCB0cmVhdG1lbnRzOg0KICANCjEpIENvbnRyb2wgKG5vIHRyZWF0bWVudCBhdCBhbGwpDQoyKSBMZWFmbGV0IChpbmZvcm1hdGlvbiBhYm91dCBleGVyY2lzaW5nKQ0KMykgTGVhZmxldCtwbGFuICh0aGUgbGVhZmxldCBhbmQgYSBwbGFuIG9mIGV4ZXJjaXNlKQ0KNCkgTGVhZmxldCtwbGFuK3F1aXogKGxlYWZsZXQsIHBsYW4gYW5kIGEgcXVpeiB0byBkbyBhYm91dCBleGVyY2lzaW5nKQ0KDQpQdXBpbHMgd2VyZSBhc2tlZCBhZ2FpbiBhYm91dCB0aGUgdGltZSB0aGV5IHNwZW50IGRvaW5nIGV4ZXJjaXNlcyAod2Vla2x5KSBzb21lIHRpbWUgYWZ0ZXIgdGhlIHRyZWF0bWVudHMgd2VyZSBnaXZlbi4NCg0KVGhlIHZhcmlhYmxlIHNxdzIgaXMgdGhlIG91dGNvbWUgKHRpbWUgc3BlbnQgZG9pbmcgZXhlcmNpc2VzIGFmdGVyIHRyZWF0bWVudCkuDQpUaGUgdmFyaWFibGUgc3F3MSBpcyB0aGUgbWVhc3VyZSBiZWZvcmUgdGhlIHRyZWF0bWVudC4NClRoZSB2YXJpYWJsZSB3Y29uZCBpcyB0aGUgZ3JvdXAgb3IgY29uZGl0aW9uIHRvIHdoaWNoIHRoZSBjbGFzcyBvZiB0aGUgcHVwaWxzIHdhcyBhc3NpZ25lZA0KDQojIFR5cGljYWwgd29ya2Zsb3cgc2V0dXANCg0KIyMgYSkgRGVmaW5lIGEgd29ya2luZyBkaXJlY3RvcnkNCg0KWW91IGNhbiB1c2UgYW55IGRpcmVjdG9yeSBpbiB5b3VyIGNvbXB1dGVyLiBBcyBpbiB0aGUgZXhhbXBsZSBiZWxvdzoNCg0KYGBge30NCnNldHdkKCJDOi9teWZvbGRlciIpDQpgYGANCg0KIyMgYikgUmVhZCBpbiBkYXRhIA0KDQpUaGlzIGlzIGZyb20gV3JpZ2h0IGFuZCBMb25kb24ncyBib29rIHdlYnNpdGUgY29tcGFuaW9uLiANCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpteWRhdGE8LXJlYWQuZGVsaW0oImh0dHBzOi8vdXMuc2FnZXB1Yi5jb20vc2l0ZXMvZGVmYXVsdC9maWxlcy91cG0tYmluYXJpZXMvMjY5MzRfZXhlcmNpc2UuZGF0IikNCmBgYA0KDQpOb3RlOiBZb3UgY2FuIHNhZmVseSBpZ25vcmUgdGhlIHdhcm5pbmcgd2hlbiByZWFkaW5nIGluIHRoZSBkYXRhLg0KDQojIyBjKSBMb2FkIHBhY2thZ2VzDQoNCllvdSBhbHdheXMgbmVlZCB0byBsb2FkIHRoZSBwYWNrYWdlcyB0aGF0IHlvdSB3aWxsIGJlIHVzaW5nLiBJbiB0aGlzIHByYWN0aWNhbCwgYGdncGxvdDJgIGlzIG9wdGlvbmFsLCBidXQgd2UnbGwgbG9hZCBpdCBhbnl3YXk6DQoNCmBgYHtyLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZ9DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KKioqDQoNCiMgVGFzayAxOiBDb3JyZWxhdGlvbg0KDQpCZWZvcmUgd2Ugc3RhcnQgYW55IGRhdGEgYW5hbHlzaXMgcHJvY2Vzcywgd2UgbmVlZCB0byBleHBsb3JlIG91ciB2YXJpYWJsZXMuIEluIHRoZSBjYXNlIG9mIGxpbmVhciByZWdyZXNzaW9uLCBpdCBpcyBnb29kIHRvIGtub3cgaG93IGNvcnJlbGF0ZWQgb3VyIHZhcmlhYmxlcyBhcmUuDQoNCldoYXQgaXMgdGhlIGNvcnJlbGF0aW9uIGJldHdlZW4gZXhlcmNpc2UgYmVmb3JlIGFuZCBhZnRlciB0aGUgaW50ZXJ2ZW50aW9uPw0KDQpgYGB7cn0NCmNvcihteWRhdGEkc3F3MiwgbXlkYXRhJHNxdzEpDQpgYGANCg0KQ29ycmVsYXRpb25zIGdvIGZyb20gLTEgdG8gMSwgc28gd2UgY2FuIHNhZmVseSBzYXkgdGhhdCB0aGVzZSB0d28gdmFyaWFibGVzIGFyZSBoaWdobHkgY29ycmVsYXRlZC4gVGhpcyBpcyBub3Qgc3VycHJpc2luZyBhdCBhbGwsIHNpbmNlIHdoYXQgd2UncmUgbWVhc3VyaW5nIGlzIGJlaGF2aW91ciAodGltZSBzcGVudCBkb2luZyBleGVyY2lzZXMpIGFuZCB5b3Uga25vdyB3aGF0IHRoZXkgc2F5ICJ0aGUgYmVzdCBwcmVkaWN0b3Igb2YgZnV0dXJlIGJlaGF2aW91ciBpcyBwYXN0IGJlaGF2aW91ciIgW14xXS4NCg0KSW4gYW55IGNhc2UsIHRoaXMgaXMgb3Zlcmx5IHNpbXBsaXN0aWMsIHNvIHdlJ2xsIHByb2NlZWQgdG8gcnVuIGEgc2VyaWVzIG9mIGxpbmVhciByZWdyZXNzaW9uIG1vZGVscy4NCg0KKioqDQoNCiMgVGFzayAyOiBTaW1wbGUgbGluZWFyIHJlZ3Jlc3Npb24NCg0KU2ltcGxlIGxpbmVhciByZWdyZXNzaW9uIGhhcyB0aGUgZm9sbG93aW5nIGFsZ2VicmFpYyBmb3JtOiANCg0KJCRZX2kgPSBcYmV0YV8wICsgXGJldGFfMXhfe2kxfSArIFxlcHNpbG9uX2kkJA0KDQpXaGVyZToNCg0KJFlfaSQgaXMgdGhlIGRlcGVuZGVudCB2YXJpYWJsZSAob3V0Y29tZSBvZiBpbnRlcmVzdCkNCg0KJFxiZXRhXzAkIGlzIHRoZSBpbnRlcmNlcHQgKG92ZXJhbGwgbWVhbikNCg0KJFxiZXRhXzEkIGlzIHRoZSBjaGFuZ2UgaW4gdGhlIGRlcGVuZGVudCB2YXJpYWJsZSB3aGVuIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBjaGFuZ2VzIGluIG9uZSB1bml0DQoNCiR4X3tpMX0kIGlzIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSAoYWthIGV4cGxhbmF0b3J5IHZhcmlhYmxlLCBwcmVkaWN0b3Igb3IgY292YXJpYXRlKQ0KDQokXGVwc2lsb25faSQgaXMgdGhlIHJlc2lkdWFsDQoNCjxicj4NCg0KVG8gcnVuIGEgc2ltcGxlIGxpbmVhciByZWdyZXNzaW9uLCB3ZSBuZWVkIHRvIHNwZWNpZnkgYSBuYW1lIGZvciBvdXIgbW9kZWwgKGBtb2RlbDFgKSBhbmQgdGhlbiBjYWxsIHRoZSBmdW5jdGlvbiBgbG1gIChsaW5lYXIgbW9kZWwpLiBUaGVuIHdlIHNwZWNpZnkgdGhlIGRhdGEgd2Ugd2lsbCB1c2UgYG15ZGF0YWAuIEZpbmFsbHksIHdlIHNwZWNpZnkgdGhlIGFjdHVhbCBzdGF0aXN0aWNhbCBtb2RlbDogYHNxdzJgIG9uIHRoZSBsZWZ0LWhhbmQgc2lkZSBhcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlIGZvbGxvd2VkIGJ5IGB+YCBhbmQgdGhlbiB0aGUgcmlnaHQtaGFuZCBzaWRlIGNvbnRhaW5zIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZSBgc3F3MWAuDQoNCmBgYHtyfQ0KbW9kZWwxIDwtIGxtKGRhdGEgPSBteWRhdGEsIHNxdzIgfiBzcXcxKQ0KDQpzdW1tYXJ5KG1vZGVsMSkNCmBgYA0KDQojIyBRdWVzdGlvbiB0aW1lIQ0KDQoqKlExLioqIFdoYXQgaXMgdGhlIGVmZmVjdCBvZiBgc3F3MWAgb24gYHNxdzJgPw0KDQo8YnI+DQoNCioqUTIuKiogSG93IG11Y2ggdmFyaWFuY2UgaXMgZXhwbGFpbmVkPw0KDQo8YnI+DQoNCioqKg0KDQojIFRhc2sgMzogTXVsdGlwbGUgbGluZWFyIHJlZ3Jlc3Npb24NCg0KTm9ybWFsbHkgaW4gc29jaWFsIHNjaWVuY2VzLCB5b3Ugd291bGRuJ3QgZXhwZWN0IHBoZW5vbWVuYSB0byBiZSBleHBsYWluZWQgYnkgb25seSBvbmUgdmFyaWFibGUuIEluIHRoZSBleGFtcGxlIHdlJ3JlIHdvcmtpbmcgb24gDQoNCiQkWV9pID0gXGJldGFfMCArIFxiZXRhXzF4X3tpMX0gKyBcYmV0YV8yeF97aTJ9ICsgXGRvdHMgKyBcYmV0YV9ueF97aW59ICsgXGVwc2lsb25faSQkDQpBbGwgdGhlIHRlcm1zIG1lYW4gdGhlIHNhbWUgYXMgYmVmb3JlLCBzbyB3ZSdsbCBmb2N1cyBvbiB0aGUgbmV3IGluZm9ybWF0aW9uOg0KDQokXGJldGFfMiQgaXMgdGhlIGV4cGVjdGVkIGluY3JlYXNlIGluIHRoZSBkZXBlbmRlbnQgdmFyaWFibGUgY29uZGl0aW9uYWwgb24gdGhlIHJlc3Qgb2YgdGhlIHZhcmlhYmxlcyByZW1haW5pbmcgY29uc3RhbnQNCg0KJHhfe2kyfSQgaXMgYSBzZWNvbmQgaW5kZXBlbmRlbnQgdmFyaWFibGUgDQoNCiRcYmV0YV9ueF97aW59JCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGluZGVwZW5kZW50IHZhcmlhYmxlcw0KDQoNCjxicj4NCg0KTm93LCBydW4gYSBtdWx0aXBsZSBsaW5lYXIgcmVncmVzc2lvbiBtb2RlbCBieSBhZGRpbmcgdGhlIGV4cGVyaW1lbnRhbCBjb25kaXRpb24gdmFyaWFibGUuIA0KDQpUaXA6IFRoZSBleHBlcmltZW50YWwgY29uZGl0aW9uIGlzIGEgY2F0ZWdvcmljYWwgdmFyaWFibGUuIEluIFIsIGNhdGVnb3JpY2FsIHZhcmlhYmxlcyBhcmUgcmVmZXJyZWQgdG8gYXMgImZhY3RvciIuIFRvIGFkZCBhIGZhY3RvciB2YXJpYWJsZSB0byBhIHJlZ3Jlc3Npb24gbW9kZWwsIHlvdSBuZWVkIHRvIHNwZWNpZnkgaXQgYXMgc3VjaDogDQoNCmBgYHt9DQpmYWN0b3IobmFtZV9vZl92YXJpYWJsZSkNCmBgYA0KDQoNCmBgYHtyfQ0KbW9kZWwyIDwtIGxtKGRhdGEgPSBteWRhdGEsIHNxdzIgfiBzcXcxICsgZmFjdG9yKHdjb25kKSkNCg0Kc3VtbWFyeShtb2RlbDIpDQpgYGANCg0KIyMgUXVlc3Rpb24gdGltZSENCg0KKipRMy4qKiBXaGF0IGlzIHRoZSBlZmZlY3Qgb2YgY29uZGl0aW9uIDIgaW4gcmVsYXRpb24gdG8gdGhlIGNvbnRyb2wgZ3JvdXA/DQoNCjxicj4NCg0KKipRNC4qKiBXaGF0IGlzIHRoZSBlZmZlY3Qgb2YgY29uZGl0aW9uIDMgaW4gcmVsYXRpb24gdG8gdGhlIGNvbnRyb2wgZ3JvdXA/DQoNCjxicj4NCg0KKipRNS4qKiBXaGF0IGlzIHRoZSBlZmZlY3Qgb2YgY29uZGl0aW9uIDQgaW4gcmVsYXRpb24gdG8gdGhlIGNvbnRyb2wgZ3JvdXA/DQoNCjxicj4NCg0KKioqDQoNCiMgVGFzayA0OiBBZGRpbmcgaW50ZXJhY3Rpb24gZWZmZWN0cw0KDQpBZGRpbmcgaW50ZXJhY3Rpb24gaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCBpbiBSLiBBbGwgeW91IG5lZWQgdG8gZG8gaXMgIm11bHRpcGx5IiB0aGUgdGVybXMgeW91IHdhbnQgdG8gaW50ZXJhY3QgKHVzaW5nIGAqYCkuDQoNClRha2UgdGhlIHByZXZpb3VzIG1vZGVsIGFuZCBhZGQgYW4gaW50ZXJhY3Rpb24gdGVybSBiZXR3ZWVuIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9uIGFuZCBleGVyY2lzZSBiZWZvcmUgdGhlIGludGVydmVudGlvbi4NCg0KYGBge3J9DQptb2RlbDMgPC0gbG0oZGF0YSA9IG15ZGF0YSwgc3F3MiB+IHNxdzEgKyBmYWN0b3Iod2NvbmQpICsgc3F3MSpmYWN0b3Iod2NvbmQpKQ0KDQpzdW1tYXJ5KG1vZGVsMykNCmBgYA0KIyMgUXVlc3Rpb24gdGltZSENCg0KKipRNi4qKiBXaGF0IGlzIHRoZSBSLXNxdWFyZWQgb2YgdGhpcyBtb2RlbD8NCg0KPGJyPg0KDQoqKlE3LioqIERvZXMgdGhlIGFkZGl0aW9uIG9mIGludGVyYWN0aW9ucyBpbXByb3ZlIHRoZSBtb2RlbD8NCg0KPGJyPg0KDQoqKioNCg0KIyBUYXNrIDU6IFByZWRpY3Rpb25zDQoNCllvdSBjYW4gY2FsY3VsYXRlIHByZWRpY3RlZCB2YWx1ZXMgYnkgdXNpbmcgdGhlIHZhbHVlcyBvZiB0aGUgY29lZmZpY2llbnRzLiBTbywgZm9yIGV4YW1wbGUsIHlvdSBjYW4gcHJlZGljdCB0aGUgc2NvcmUgb2YgYSBwdXBpbCB3aG8gc2NvcmVkIDIgaW4gdGhlIGJhc2VsaW5lIG1lYXN1cmUgYW5kIHdhcyBpbiB0aGUgY29udHJvbCBncm91cCBhcyBzdWNoOg0KDQpTaW5jZSB0aGUgY29udHJvbCBncm91cCBpcyBjb2RlZCAwLCB0aGUgZXF1YXRpb24gZm9yIHRoZXNlIHB1cGlscyByZWR1Y2VzIHRvOg0KDQoke1l9X2kgPSBcYmV0YV8wICsgXGJldGFfMXhfe2kxfSQNCg0KVGhlbiANCg0KJFxoYXR7eX0gPSAwLjM4MzUxICsgMC43NTA0MSpiYXNlbGluZSQNCg0KJFxoYXR7eX0gPSAwLjM4MzUxICsgMC43NTA0MSoyJCAgIA0KDQokXGhhdHt5fSA9IDEuODg0MzMkDQoNClRoZSBwcmVkaWN0ZWQgc2NvcmUgYWZ0ZXIgdGhlIHRyaWFsIGZvciBhIGNoaWxkIGluIHRoZSBjb250cm9sIGdyb3VwIHdobyBzY29yZWQgMiBhdCBiYXNlbGluZSBpcyB0aGVuIDEuODg0MzMuDQoNCiMjIFF1ZXN0aW9uIHRpbWUhDQoNCioqUTguKiogV2hhdCBpcyB0aGUgcHJlZGljdGVkIHNjb3JlIGZvciBhIGNoaWxkIGluIGNvbmRpdGlvbiAyIHRoYXQgc2NvcmVkIDEuNSBhdCBiYXNlbGluZT8NCg0KPGJyPg0KDQojIyBQbG90dGluZyB0aGUgZXN0aW1hdGVkIG1vZGVsDQoNClRvIGRvIHRoaXMsIHlvdSBjYW4gcmV0cmlldmUgdGhlIHByZWRpY3Rpb25zIGZyb20geW91ciBtb2RlbCBvYmplY3QgYW5kIHBsb3QgdGhlbSBhZ2FpbnN0IHRoZSBvYnNlcnZlZCB2YWx1ZXMgb2YgeA0KDQpgYGB7cn0NCm15ZGF0YSRwcmVkaWN0ZWQgPC0gZml0dGVkKG1vZGVsMykNCmBgYA0KDQpSZW1lbWJlcjogWW91IG5lZWQgdG8gbG9hZCBnZ3Bsb3QyIGZvciB0aGlzIQ0KDQpgYGB7ciwgd2FybmluZz1GLCBtZXNzYWdlPUZ9DQpsaWJyYXJ5KGdncGxvdDIpDQpgYGANCg0KVGhlbiBkcmF3IGEgbGluZSBwbG90LiBUaGUgcmVzdWx0aW5nIGxpbmUgaXMgdGhlIHByZWRpY3RlZCBlZmZlY3Qgb2Ygc3F3MSBvbiBzcXcyLCBjb25kaXRpb25hbCB1cG9uIHRoZSBleHBlcmltZW50YWwgY29uZGl0aW9uIGFuZCB0aGUgaW50ZXJhY3Rpb24gYmV0d2VlbiBzcXcxIGFuZCB0aGUgZXhwZXJpbWVudGFsIGNvbmRpdGlvbi4NCg0KYGBge3J9DQpwbG90MSA8LSBnZ3Bsb3QobXlkYXRhLCBhZXMoeSA9IHByZWRpY3RlZCwgeCA9IHNxdzEpKSArIA0KICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBhZXMoeSA9IHByZWRpY3RlZCwgeCA9IHNxdzEpLCBzZT1GKQ0KcGxvdDENCmBgYA0KDQoNCioqKg0KDQojIFRhc2sgNjogQ2hlY2tpbmcgYXNzdW1wdGlvbnMNCg0KV2UgYXJlIGdvaW5nIHRvIGZvY3VzIG9uIHRoZSB0d28gbW9zdCBiYXNpYyBhc3N1bXB0aW9uIGNoZWNrcyB0aGF0IHlvdSBjYW4gZG8sIHdoaWNoIGFyZSB0byBkbyB3aXRoIHRoZSByZXNpZHVhbHMuIFdlIHdpbGwgdXNlIGdyYXBoaWMgbWV0aG9kcywgc2luY2UgdGhleSBhcmUgcXVpdGUgc3RyYWlnaHRmb3J3YXJkIGFuZCBlYXNpbHkgdW5kZXJzdG9vZC4gDQoNCiMjIDYuMS4gTm9ybWFsaXR5IG9mIHJlc2lkdWFscw0KDQpBIGtleSBhc3N1bXB0aW9uIGluIGxpbmVhciByZWdyZXNzaW9uIGlzIHRoYXQgb3VyIHJlc2lkdWFscyBhcmUgbm9ybWFsbHkgZGlzdHJpYnV0ZWQuIFRoaXMgbWVhbnMgcm91Z2hseSB0aGF0IHdoYXRldmVyIGlzIGxlZnQgdW5leHBsYWluZWQgYnkgb3VyIG1vZGVsIGNvdWxkIGJlIHRob3VnaHQgb2YgYXMgcmFuZG9tIHZhcmlhdGlvbiBvciAid2hpdGUgbm9pc2UiLg0KDQo8YnI+DQoNCmBgYHtyLCBlY2hvPUZBTFNFLCBmaWcuYWxpZ249ICJjZW50ZXIiLCBvdXQud2lkdGg9IjEwMHB4IiwgZmlnLmNhcD0iVGhpcyBpcyBhIHZlcnkgdXNlZnVsIGdpZiAoZm91bmQgdmlhIEdpcGh5KSB0aGF0IHNob3dzIHJhbmRvbSB3aGl0ZSBub2lzZSIsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vbWVkaWEuZ2lwaHkuY29tL21lZGlhL3Z4Y3V1NmJMWkRkbTAvZ2lwaHkuZ2lmIikNCmBgYA0KDQo8YnI+DQpUaGUgbm9ybWFsaXR5IG9mIHRoZSByZXNpZHVhbHMgY2FuIGJlIGNoZWNrZWQgYnkgcnVubmluZyBhIGZvcm1hbCBzdGF0aXN0aWNhbCB0ZXN0LCBlLmcuIHRoZSBLb2xtb2dvcm92LVNtaXJub3YgdGVzdCwgYnV0IHRob3NlIG1ldGhvZHMgY2FuIGJlIG92ZXJseSBzZW5zaXRpdmUgdG8gc21hbGwgZGVwYXJ0dXJlcy4gR3JhcGhpYyBtZXRob2RzLCBzdWNoIGFzIGRyYXdpbmcgYSBoaXN0b2dyYW0gb3IgYSBRLVEgcGxvdCwgYXJlIHdpZGVseSB1c2VkIGluc3RlYWQuDQoNClRvIGRyYXcgYSBRLVEgcGxvdCBmcm9tIHlvdXIgbW9kZWwgcmVzdWx0cywgeW91IGNhbiBxdWlja2x5IHVzZSB0aGUgYmFzZSBwYWNrYWdlIGFzIHN1Y2g6DQoNCmBgYHtyLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCnBsb3QobW9kZWwzLDIpDQpgYGANCg0KVGhlIHJlc3VsdCBpcyBhIFEtUSBwbG90IG9yIG5vcm1hbCBxdWFudGlsZSBwbG90LiBJdCBjb21wYXJlcyB0aGUgcmVzaWR1YWxzIGFnYWluc3QgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uIFB1dCBzaW1wbHksIHRoZSByZXNpZHVhbHMgKGRvdHMgb24gdGhlIHBsb3QpIHNob3VsZCBhbGwgbGllIG9uIHRoZSBkaWFnb25hbCBsaW5lLiBBbnkgb2J2aW91cyBwYXR0ZXJucyB3b3VsZCBpbmRpY2F0ZSB0aGF0IG91ciBtb2RlbCBkb2VzIG5vdCBtZWV0IHRoZSBub3JtYWxpdHkgYXNzdW1wdGlvbi4NCg0KSW4gdGhlIHBsb3QgYWJvdmUsIHdlIGNhbiBzZWUgdGhhdCB0aGUgZXh0cmVtZXMgb2YgdGhlIGRpc3RyaWJ1dGlvbiBkZXBhcnQgZnJvbSBub3JtYWxpdHksIHdoaWNoIGNvdWxkIGJlIGluZGljYXRpbmcgdGhhdCB0aGVyZSBhcmUgb3V0bGllcnMuIEl0IG1heSBhbHNvIGJlIHRoZSBjYXNlIHRoYXQgd2UgbmVlZCB0byBjb250cm9sIGZvciBvdGhlciB2YXJpYWJsZXMuDQoNCg0KDQojIyA2LjIuIEhvbW9zY2VkYXN0aWNpdHkNCg0KSG9tb3NjZWRhc3RpY2l0eSBtZWFucyB0aGF0IHJlc2lkdWFscyBzaG91bGQgZGlzdHJpYnV0ZSBldmVubHkgaW4gdGVybXMgb2Ygc3ByZWFkIGFjcm9zcyB0aGUgcHJlZGljdGVkIHZhbHVlcyBvZiBvdXIgbW9kZWwuIEluIG90aGVyIHdvcmRzLCBpZiB3ZSBwbG90IHJlc2lkdWFscyB2cyBmaXR0ZWQgdmFsdWVzLCBpdCBzaG91bGQgbG9vayBjb21wbGV0ZWx5IHJhbmRvbSwgaS5lLiBhIHJhbmRvbSBjbG91ZCBvZiBkb3RzLg0KDQpUbyBjaGVjayB0aGlzLCB3ZSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29kZToNCmBgYHtyLCB3YXJuaW5nPUYsIG1lc3NhZ2U9Rn0NCnBsb3QobW9kZWwzLDEpDQpgYGANCg0KV2hhdCB3ZSBhcmUgaW50ZXJlc3RlZCB0byBzZWUgaGVyZSBpcyBubyBvYnZpb3VzIHBhdHRlcm5zLiBJbiB0aGlzIHNwZWNpZmljIHBsb3QsIHRoZXJlIHNlZW1zIHRvIGJlIHNvbWUgbm9uLXJhbmRvbSBwYXR0ZXJuIChub3QgYSBodWdlIG9uZSkuIFRoZSBsZWZ0LWhhbmQgc2lkZSBvZiB0aGUgZGlzdHJpYnV0aW9uIChsb3dlciBwcmVkaWN0ZWQgdmFsdWVzKSB0ZW5kcyB0byBoYXZlIG1vcmUgcG9zaXRpdmUgcmVzaWR1YWxzLCB3aGVyZWFzIHRoZSByaWdodC1oYW5kIHNpZGUgaGFzIG1vcmUgbmVnYXRpdmUgcmVzaWR1YWxzLiBIb3cgZG8geW91IGFkZHJlc3MgdGhpcz8gVXN1YWxseSBieSBhZGRpbmcgbW9yZSB2YXJpYWJsZXMgdG8gdGhlIG1vZGVsLg0KDQojIEJvbnVzIHRyYWNrDQoNCllvdSBjYW4gYWRkIHRoZSByZXNpZHVhbHMgdG8geW91ciBkYXRhIChhcyBhIG5ldyB2YXJpYWJsZSkgdG8gYmUgYWJsZSB0byB3b3JrIHdpdGggdGhlbSBhbG9uZ3NpZGUgdGhlIG9ic2VydmVkIGRhdGEgbW9yZSBlYXNpbHkuDQpUbyByZXRyaWV2ZSB0aGUgcmVzaWR1YWxzIG9mIHlvdXIgbW9kZWwsIHlvdSBjYW4gZG8gdGhlIGZvbGxvd2luZzoNCg0KYGBge3J9DQpteWRhdGEkcmVzaWR1YWxzIDwtIHJlc2lkdWFscyhtb2RlbDMpDQpgYGANCg0KVGhlbiB5b3UgY2FuIG1hbmlwdWxhdGUgdGhlbSBhcyB5b3Ugd2lzaCBhbmQsIGZvciBleGFtcGxlLCBkcmF3IHBsb3RzIHdpdGggYGdncGxvdDJgOg0KDQpUaGlzIGlzIHRvIGRyYXcgYSBoaXN0b2dyYW0gb2YgdGhlIHJlc2lkdWFscyB3aXRoIHRoZSBgZ2dwbG90MmAgcGFja2FnZToNCg0KYGBge3IsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KaGlzdCA8LSBnZ3Bsb3QobXlkYXRhLCBhZXMocmVzaWR1YWxzKSkgKyBnZW9tX2hpc3RvZ3JhbSgpDQoNCmhpc3QNCmBgYA0KDQpBbmQgdGhpcyBpcyB0byBjaGVjayBmb3IgaG9tb3NjZWRhc3RpY2l0eToNCg0KYGBge3IsIHdhcm5pbmc9RiwgbWVzc2FnZT1GfQ0KaG9tb3NjZWRhc3RpY2l0eSA8LSBnZ3Bsb3QobXlkYXRhLCBhZXMoeSA9IHJlc2lkdWFscywgeCA9IHByZWRpY3RlZCkpICsgZ2VvbV9wb2ludCgpDQoNCmhvbW9zY2VkYXN0aWNpdHkNCmBgYA0KDQo8YnI+DQoNCiMgQWNrbm93bGVkZ2VtZW50DQoNClRoaXMgcHJhY3RpY2FsIHJlcHJvZHVjZXMgc29tZSBvZiB0aGUgbWF0ZXJpYWxzIGNyZWF0ZWQgYnkgQW5hIE1vcmFsZXMtR29tZXosIFVLRFMsIFRoZSBVbml2ZXJzaXR5IG9mIE1hbmNoZXN0ZXIuIFRob3NlIG1hdGVyaWFscyBhcmUgYXZhaWxhYmxlIFsqKmhlcmUqKl0oaHR0cHM6Ly9naXRodWIuY29tL0EtbW9yYS9DcmltZS13b3Jrc2hvcCkuDQoNCjxicj4NCg0KYGBge3IsIGVjaG89RkFMU0UsIGZpZy5hbGlnbj0gImNlbnRlciIsIG91dC53aWR0aD0iMjAwcHgiLCBmaWcuY2FwPSJUaGFuayB5b3UgZXZlciBzbyBtdWNoLCBBbmEhIChnaWYgdmlhIEdpcGh5KSIsIG1lc3NhZ2U9Riwgd2FybmluZz1GfQ0Ka25pdHI6OmluY2x1ZGVfZ3JhcGhpY3MoImh0dHBzOi8vbWVkaWEuZ2lwaHkuY29tL21lZGlhL3U3aUtZeVVQZG1mRm0vZ2lwaHkuZ2lmIikNCmBgYA0KDQpbXjFdOiBTb3JyeSwgSSBjb3VsZG4ndCBmaW5kIGEgcHJlY2lzZSBjaXRhdGlvbiBmb3IgdGhpcy4gVGhlcmUgc2VlbXMgdG8gYmUgYSBsb3Qgb2YgYXR0cmlidXRpb24gdW5jZXJ0YWludHkgcmVnYXJkaW5nIHRoaXMgcXVvdGUu
Patricio Troncoso
patricio.troncoso@manchester.ac.uk