Data Science Stream
R Functions Overview
R Function Composition
No answer required.
Important Notes
No answer required.
Writing Simple Functions in R
Mean Function
Example R code is provided below:
mean_func <- function(values){
# Argument:
# values: This is our list of values
n <- length(values)
sum(values) / n
}
Note that, based on this format, our function can compute the mean of a string of numbers of any non-zero length.
mean_func(c(2:8))
## [1] 5
Sample standard deviation Function
Example R code is provided below:
Note that I have used quite a few brackets here, to ensure calculations are performed in the correct order.
sample_sd_func <- function(values){
# Argument:
# values: This is our list of values
n <- length(values)
sqrt( (1 / (n-1) ) * sum( (values - mean_func(values) )^2 ))
}
sample_sd_func(c(2:8))
## [1] 2.160247
sd(c(2:8))
## [1] 2.160247
Note that both our function and the inbuilt R function provide values of 2.160247
. Success!
Writing a \(t\)-test Function in R
\(t\)-test test statistic
Example R code is provided below:
t_test_func <- function(values, mu){
# Arguments:
# values: This is our list of values
# mu: The mean under H0
n <- length(values)
( mean_func(values) - mu ) / (sample_sd_func(values) / sqrt(n) )
}
We run the following commands:
t_test_func(c(2:8), 4)
## [1] 1.224745
t.test(c(2:8), mu = 4)
##
## One Sample t-test
##
## data: c(2:8)
## t = 1.2247, df = 6, p-value = 0.2666
## alternative hypothesis: true mean is not equal to 4
## 95 percent confidence interval:
## 3.002105 6.997895
## sample estimates:
## mean of x
## 5
Our t_test_func
output provides the same \(t\) test statistic as the t.test
function, correct to 4 decimal places.
Adding Details to our \(t\)-test Function
Degrees of freedom
Please note that solutions are not shown here, as they are almost identical to the solutions shown directly below.
Our updated t_test_func
could look like this:
t_test_func <- function(values, mu){
# Arguments:
# values: This is our list of values
# mu: The mean under H0
n <- length(values)
t.val <- ( mean_func(values) - mu ) / (sample_sd_func(values) / sqrt(n) )
df <- n - 1
c("test.stat" = t.val, "df" = df)
}
\(p\)-value Function
Our updated t_test_func
could look like this:
t_test_func <- function(values, mu){
# Arguments:
# values: This is our list of values
# mu: The mean under H0
n <- length(values)
t.val <- (mean_func(values) - mu) / (sample_sd_func(values) / sqrt(n))
df <- n - 1
p.val <- 2*pt(-abs(t.val), df)
cat("The test statistic is", round(t.val, 4), "\n",
"The degrees of freedom is", df, "\n",
"The p-value is", round(p.val, 4), "\n")
}
Note here that using 2*pt(-abs(t.val), df)
utilises the symmetry property of the Student’s \(t\)-distribution.
t_test_func(c(2:8), 4)
## The test statistic is 1.2247
## The degrees of freedom is 6
## The p-value is 0.2666
t.test(c(2:8), mu = 4)
##
## One Sample t-test
##
## data: c(2:8)
## t = 1.2247, df = 6, p-value = 0.2666
## alternative hypothesis: true mean is not equal to 4
## 95 percent confidence interval:
## 3.002105 6.997895
## sample estimates:
## mean of x
## 5
Our t_test_func
output provides the same \(p\)-value as the t.test
function, correct to 4 decimal places.
That’s everything for this computer lab!
These notes have been prepared by Rupert Kuveke and Amanda Shaker. The copyright for the material in these notes resides with the authors named above, with the Department of Mathematical and Physical Sciences and with La Trobe University. Copyright in this work is vested in La Trobe University including all La Trobe University branding and naming. Unless otherwise stated, material within this work is licensed under a Creative Commons Attribution-Non Commercial-Non Derivatives License
BY-NC-ND.
LS0tDQp0aXRsZTogIlNUTTEwMDE6IENvbXB1dGVyIExhYiA2QiBTb2x1dGlvbnMiDQpvdXRwdXQ6DQogIGJvb2tkb3duOjpodG1sX2RvY3VtZW50MjogDQogICAgdG9jOiB0cnVlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgY29kZV9kb3dubG9hZDogdHJ1ZQ0KICAgIHRoZW1lOiByZWFkYWJsZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KYmlibGlvZ3JhcGh5OiBTVE0xMDAxX0RTX0NMX3JlZmVyZW5jZXMuYmliIA0KbGluay1jaXRhdGlvbnM6IHllcw0KLS0tDQoNCjxzdHlsZT4NCiNUT0Mgew0KICBiYWNrZ3JvdW5kOiB1cmwoImh0dHBzOi8vd3d3LmxhdHJvYmUuZWR1LmF1L19tZWRpYS9sYS10cm9iZS1hcGkvdjUvaW1nL2xvZ28uc3ZnIik7DQogIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjsNCiAgcGFkZGluZy10b3A6IDgwcHggIWltcG9ydGFudDsNCiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsNCn0NCjwvc3R5bGU+DQoNCiMjIyBEYXRhIFNjaWVuY2UgU3RyZWFtIHstfQ0KDQojIyMgVG9waWMgNkI6IFdyaXRpbmcgUiBGdW5jdGlvbnMgey19DQoNCjxicj4NCg0KRXhhbXBsZSBSIGNvZGUgc29sdXRpb25zIGZvciB0aGUgW0RhdGEgU2NpZW5jZSBDb21wdXRlciBMYWIgNl0oaHR0cHM6Ly9ycHVicy5jb20vTFRVX1NUTTEwMDEvRFNNQ0w2KSBhcmUgcHJlc2VudGVkIGJlbG93Lg0KDQoNCiMgUiBGdW5jdGlvbnMgT3ZlcnZpZXcNCg0KIyMgUiBGdW5jdGlvbiBDb21wb3NpdGlvbg0KDQpObyBhbnN3ZXIgcmVxdWlyZWQuDQoNCiMjIyBJbXBvcnRhbnQgTm90ZXMNCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIFdyaXRpbmcgU2ltcGxlIEZ1bmN0aW9ucyBpbiBSDQoNCiMjIE1lYW4gRnVuY3Rpb24geyNtZWFuZnVuY30NCg0KRXhhbXBsZSBSIGNvZGUgaXMgcHJvdmlkZWQgYmVsb3c6DQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCm1lYW5fZnVuYyA8LSBmdW5jdGlvbih2YWx1ZXMpew0KICAjIEFyZ3VtZW50Og0KICAjIHZhbHVlczogVGhpcyBpcyBvdXIgbGlzdCBvZiB2YWx1ZXMNCg0KICBuIDwtIGxlbmd0aCh2YWx1ZXMpDQogIHN1bSh2YWx1ZXMpIC8gbg0KDQp9ICAgICAgICAgICAgICAgICAgICAgICAgICANCmBgYA0KDQoqTm90ZSB0aGF0LCBiYXNlZCBvbiB0aGlzIGZvcm1hdCwgb3VyIGZ1bmN0aW9uIGNhbiBjb21wdXRlIHRoZSBtZWFuIG9mIGEgc3RyaW5nIG9mIG51bWJlcnMgb2YgYW55IG5vbi16ZXJvIGxlbmd0aC4qDQoNCiMjIw0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEZ9DQptZWFuX2Z1bmMoYygyOjgpKQ0KYGBgDQoNCiMjIFNhbXBsZSBzdGFuZGFyZCBkZXZpYXRpb24gRnVuY3Rpb24NCg0KRXhhbXBsZSBSIGNvZGUgaXMgcHJvdmlkZWQgYmVsb3c6DQoNCipOb3RlIHRoYXQgSSBoYXZlIHVzZWQgcXVpdGUgYSBmZXcgYnJhY2tldHMgaGVyZSwgdG8gZW5zdXJlIGNhbGN1bGF0aW9ucyBhcmUgcGVyZm9ybWVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLioNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQ0Kc2FtcGxlX3NkX2Z1bmMgPC0gZnVuY3Rpb24odmFsdWVzKXsNCiAgIyBBcmd1bWVudDoNCiAgIyB2YWx1ZXM6IFRoaXMgaXMgb3VyIGxpc3Qgb2YgdmFsdWVzDQogIA0KICBuIDwtIGxlbmd0aCh2YWx1ZXMpDQogIHNxcnQoICgxIC8gKG4tMSkgKSAqIHN1bSggKHZhbHVlcyAtIG1lYW5fZnVuYyh2YWx1ZXMpICleMiApKQ0KICANCn0NCmBgYA0KDQojIyMNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQ0Kc2FtcGxlX3NkX2Z1bmMoYygyOjgpKQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCnNkKGMoMjo4KSkNCmBgYA0KDQpOb3RlIHRoYXQgYm90aCBvdXIgZnVuY3Rpb24gYW5kIHRoZSBpbmJ1aWx0IFIgZnVuY3Rpb24gcHJvdmlkZSB2YWx1ZXMgb2YgYDIuMTYwMjQ3YC4gU3VjY2VzcyENCg0KIyBXcml0aW5nIGEgJHQkLXRlc3QgRnVuY3Rpb24gaW4gUiB7I3R0ZXN0ZnVuY30NCg0KIyMgJHQkLXRlc3QgdGVzdCBzdGF0aXN0aWMNCg0KRXhhbXBsZSBSIGNvZGUgaXMgcHJvdmlkZWQgYmVsb3c6DQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCnRfdGVzdF9mdW5jIDwtIGZ1bmN0aW9uKHZhbHVlcywgbXUpew0KICAjIEFyZ3VtZW50czoNCiAgIyB2YWx1ZXM6IFRoaXMgaXMgb3VyIGxpc3Qgb2YgdmFsdWVzDQogICMgbXU6IFRoZSBtZWFuIHVuZGVyIEgwDQogIA0KICBuIDwtIGxlbmd0aCh2YWx1ZXMpDQogICggbWVhbl9mdW5jKHZhbHVlcykgLSBtdSApIC8gKHNhbXBsZV9zZF9mdW5jKHZhbHVlcykgLyBzcXJ0KG4pICkNCiAgDQp9DQpgYGANCg0KIyMgeyN0dGVzdH0NCg0KV2UgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZHM6DQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCnRfdGVzdF9mdW5jKGMoMjo4KSwgNCkNCmBgYA0KDQpgYGB7ciBjbGFzcy5zb3VyY2UgPSAiZm9sZC1zaG93IiwgZXZhbCA9IFQsIGVjaG8gPSBULCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEZ9DQp0LnRlc3QoYygyOjgpLCBtdSA9IDQpDQpgYGANCg0KT3VyIGB0X3Rlc3RfZnVuY2Agb3V0cHV0IHByb3ZpZGVzIHRoZSBzYW1lICR0JCB0ZXN0IHN0YXRpc3RpYyBhcyB0aGUgYHQudGVzdGAgZnVuY3Rpb24sIGNvcnJlY3QgdG8gNCBkZWNpbWFsIHBsYWNlcy4NCg0KIyBBZGRpbmcgRGV0YWlscyB0byBvdXIgJHQkLXRlc3QgRnVuY3Rpb24NCg0KIyMgRGVncmVlcyBvZiBmcmVlZG9tDQoNClBsZWFzZSBub3RlIHRoYXQgc29sdXRpb25zIGFyZSBub3Qgc2hvd24gaGVyZSwgYXMgdGhleSBhcmUgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgc29sdXRpb25zIHNob3duIGRpcmVjdGx5IGJlbG93Lg0KDQojIyMNCg0KT3VyIHVwZGF0ZWQgYHRfdGVzdF9mdW5jYCBjb3VsZCBsb29rIGxpa2UgdGhpczoNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQ0KdF90ZXN0X2Z1bmMgPC0gZnVuY3Rpb24odmFsdWVzLCBtdSl7DQogICMgQXJndW1lbnRzOg0KICAjIHZhbHVlczogVGhpcyBpcyBvdXIgbGlzdCBvZiB2YWx1ZXMNCiAgIyBtdTogVGhlIG1lYW4gdW5kZXIgSDANCiAgDQogIG4gPC0gbGVuZ3RoKHZhbHVlcykNCiAgdC52YWwgPC0gKCBtZWFuX2Z1bmModmFsdWVzKSAtIG11ICkgLyAoc2FtcGxlX3NkX2Z1bmModmFsdWVzKSAvIHNxcnQobikgKQ0KICANCiAgZGYgPC0gbiAtIDENCiAgDQogIGMoInRlc3Quc3RhdCIgPSB0LnZhbCwgImRmIiA9IGRmKQ0KICANCn0NCmBgYA0KDQojIyBJbmZvcm1hdGl2ZSBPdXRwdXQNCg0KTm8gYW5zd2VyIHJlcXVpcmVkLg0KDQojIyMNCg0KT3VyIHVwZGF0ZWQgYHRfdGVzdF9mdW5jYCBjb3VsZCBsb29rIGxpa2UgdGhpczoNCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQ0KdF90ZXN0X2Z1bmMgPC0gZnVuY3Rpb24odmFsdWVzLCBtdSl7DQogICMgQXJndW1lbnRzOg0KICAjIHZhbHVlczogVGhpcyBpcyBvdXIgbGlzdCBvZiB2YWx1ZXMNCiAgIyBtdTogVGhlIG1lYW4gdW5kZXIgSDANCiAgDQogIG4gPC0gbGVuZ3RoKHZhbHVlcykNCiAgdC52YWwgPC0gKCBtZWFuX2Z1bmModmFsdWVzKSAtIG11ICkgLyAoc2FtcGxlX3NkX2Z1bmModmFsdWVzKSAvIHNxcnQobikgKQ0KICANCiAgZGYgPC0gbiAtIDENCiAgDQogIGNhdCgiVGhlIHRlc3Qgc3RhdGlzdGljIGlzIiwgcm91bmQodC52YWwsIDQpLCAiXG4iLA0KICAgICAgIlRoZSBkZWdyZWVzIG9mIGZyZWVkb20gaXMiLCBkZiwgIlxuIikNCiAgDQp9DQpgYGANCg0KIyMgJHAkLXZhbHVlIEZ1bmN0aW9uDQoNCk91ciB1cGRhdGVkIGB0X3Rlc3RfZnVuY2AgY291bGQgbG9vayBsaWtlIHRoaXM6DQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCnRfdGVzdF9mdW5jIDwtIGZ1bmN0aW9uKHZhbHVlcywgbXUpew0KICAjIEFyZ3VtZW50czoNCiAgIyB2YWx1ZXM6IFRoaXMgaXMgb3VyIGxpc3Qgb2YgdmFsdWVzDQogICMgbXU6IFRoZSBtZWFuIHVuZGVyIEgwDQogDQogIG4gPC0gbGVuZ3RoKHZhbHVlcykNCiANCiAgdC52YWwgPC0gKG1lYW5fZnVuYyh2YWx1ZXMpIC0gbXUpIC8gKHNhbXBsZV9zZF9mdW5jKHZhbHVlcykgLyBzcXJ0KG4pKQ0KIA0KICBkZiA8LSBuIC0gMQ0KIA0KICBwLnZhbCA8LSAyKnB0KC1hYnModC52YWwpLCBkZikNCiANCiAgY2F0KCJUaGUgdGVzdCBzdGF0aXN0aWMgaXMiLCByb3VuZCh0LnZhbCwgNCksICJcbiIsDQogICAgICAiVGhlIGRlZ3JlZXMgb2YgZnJlZWRvbSBpcyIsIGRmLCAiXG4iLA0KICAgICAgIlRoZSBwLXZhbHVlIGlzIiwgcm91bmQocC52YWwsIDQpLCAiXG4iKQ0KfQ0KYGBgDQoNCk5vdGUgaGVyZSB0aGF0IHVzaW5nIGAyKnB0KC1hYnModC52YWwpLCBkZilgIHV0aWxpc2VzIHRoZSBzeW1tZXRyeSBwcm9wZXJ0eSBvZiB0aGUgU3R1ZGVudCdzICR0JC1kaXN0cmlidXRpb24uDQoNCiMjIyANCg0KYGBge3IgY2xhc3Muc291cmNlID0gImZvbGQtc2hvdyIsIGV2YWwgPSBULCBlY2hvID0gVCwgd2FybmluZyA9IEYsIG1lc3NhZ2UgPSBGfQ0KdF90ZXN0X2Z1bmMoYygyOjgpLCA0KQ0KYGBgDQoNCmBgYHtyIGNsYXNzLnNvdXJjZSA9ICJmb2xkLXNob3ciLCBldmFsID0gVCwgZWNobyA9IFQsIHdhcm5pbmcgPSBGLCBtZXNzYWdlID0gRn0NCnQudGVzdChjKDI6OCksIG11ID0gNCkNCmBgYA0KDQpPdXIgYHRfdGVzdF9mdW5jYCBvdXRwdXQgcHJvdmlkZXMgdGhlIHNhbWUgJHAkLXZhbHVlIGFzIHRoZSBgdC50ZXN0YCBmdW5jdGlvbiwgY29ycmVjdCB0byA0IGRlY2ltYWwgcGxhY2VzLg0KDQo8YnI+DQoNCiMjIyMgVGhhdCdzIGV2ZXJ5dGhpbmcgZm9yIHRoaXMgY29tcHV0ZXIgbGFiISAjIyMjIHstfQ0KDQo8YnI+DQoNCjxmb250IGNvbG9yID0gImdyZXkiPg0KVGhlc2Ugbm90ZXMgaGF2ZSBiZWVuIHByZXBhcmVkIGJ5IFJ1cGVydCBLdXZla2UgYW5kIEFtYW5kYSBTaGFrZXIuIFRoZSBjb3B5cmlnaHQgZm9yIHRoZSBtYXRlcmlhbCBpbiB0aGVzZSBub3RlcyByZXNpZGVzIHdpdGggdGhlIGF1dGhvcnMgbmFtZWQgYWJvdmUsIHdpdGggdGhlIERlcGFydG1lbnQgb2YgTWF0aGVtYXRpY2FsIGFuZCBQaHlzaWNhbCBTY2llbmNlcyBhbmQgd2l0aCBMYSBUcm9iZSBVbml2ZXJzaXR5LiBDb3B5cmlnaHQgaW4gdGhpcyB3b3JrIGlzIHZlc3RlZCBpbiBMYSBUcm9iZSBVbml2ZXJzaXR5IGluY2x1ZGluZyBhbGwgTGEgVHJvYmUgVW5pdmVyc2l0eSBicmFuZGluZyBhbmQgbmFtaW5nLiBVbmxlc3Mgb3RoZXJ3aXNlIHN0YXRlZCwgbWF0ZXJpYWwgd2l0aGluIHRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uIENvbW1lcmNpYWwtTm9uIERlcml2YXRpdmVzIExpY2Vuc2UgDQo8YSBocmVmID0gImh0dHBzOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1uYy1uZC80LjAvQ0MiIHRhcmdldD0iX2JsYW5rIj4gQlktTkMtTkQuIDwvYT4NCjwvZm9udD4=