Data Science Stream

Topic 6B: Writing R Functions


Example R code solutions for the Data Science Computer Lab 6 are presented below.

1 R Functions Overview

1.1 R Function Composition

No answer required.

1.1.1 Important Notes

No answer required.

2 Writing Simple Functions in R

2.1 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.

2.1.1

mean_func(c(2:8))
## [1] 5

2.2 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 ))
  
}

2.2.1

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!

3 Writing a \(t\)-test Function in R

3.1 \(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) )
  
}

3.2

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.

4 Adding Details to our \(t\)-test Function

4.1 Degrees of freedom

Please note that solutions are not shown here, as they are almost identical to the solutions shown directly below.

4.1.1

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)
  
}

4.2 Informative Output

No answer required.

4.2.1

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
  
  cat("The test statistic is", round(t.val, 4), "\n",
      "The degrees of freedom is", df, "\n")
  
}

4.3 \(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.

4.3.1

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=