Exercise 5: Basic programming in R

 

Read Chapter 7 to help you complete the questions in this exercise.

 

  1. Create a function to calculate the area of a circle. Test the function by finding the area of a circle with a diameter of 3.4 cm. Can you use it on a vector of data?

    # area of a circle
    # the equation to calculate the area of a circle is pi * radius^2
    
    circle.area <- function(d){ 
        pi * (d/2)^2
    }
    
    # to use your new function
    
    circle.area(10)
    # [1] 78.53982
    
    # to test on a vector of diameters
    # first create a vector with diameters ranging from 0 to 50 in steps of 10
    
    cir.diam <- seq(from = 0, to = 50, by = 10)
    
    # test your function
    
    circle.area(cir.diam)
    # [1]    0.00000   78.53982  314.15927  706.85835 1256.63706 1963.49541

 

  1. Write a function to convert farenheit to centegrade (oC = (oF - 32) x 5/9). Get your function to print out your result in the following format: “Farenheit : value of oF is equivalent to value oC centigrade.”

    far.cent <- function(a) {
        val <- (a - 32) * 5/9
        print(paste("Fahrenheit: ", round(a, digits = 3), "oF", sep = " "), quote = FALSE)  # round 3dp
        print(paste("Centigrade: ", round(val, digits = 3), "oC", sep = " "), quote = FALSE)  # round 3dp
    }
    
    # alternative Fahrenheit to centigrade using cat function
    
    far.cent2 <- function(a) {
        val <- (a - 32) * 5/9  #calculation
        cat("Fahrenheit: ", round(a, digits = 3), "oF", "\n")  # use cat function
        cat("Centigrade: ", round(val, digits = 3), "oC", "\n")
    }

 

  1. Create a vector of normally distributed data, of length 100, mean 35 and standard deviation of 15. Write a function to calculate the mean, median, and range of the vector, print these values out with appropriate labels. Also get the function to plot a histogram (as a proportion) of the values and add a density curve.

    # Create a vector of normally distributed data
    # length 100, mean 35 and standard deviation of 29
    
    vals <- rnorm(100, 35, 15)  # create some norm dist data mean 35, sd = 15
    
    summary.fun <- function(dat){
        mymean <- round(mean(dat), digits = 4)          # calc mean
        mymedian <- round(median(dat), digits = 4)    # calc median
        mymin <- round(min(dat), digits = 4)          # calc min
        mymax <- round(max(dat), digits = 4)          # calc max
        print(paste("mean:", mymean, sep = " "), quote = FALSE)     # print mean
        print(paste("median:", mymedian, sep = " "), quote = FALSE)     # print median
        print(paste("range:", "from:", mymin, "to", mymax, sep = " "), quote = FALSE) 
        dens <- density(dat)                          # estimate density curve
        hist(dat, main = "",type = "l",freq = FALSE)  # plot histogram
        lines(dens, lty = 1, col = "red")             # plot density curve
    }
    
    # use the function
    summary.fun(vals)

 

  1. Write a function to calculate the median value of a vector of numbers (yes I know there’s a median() function already but this is fun!). Be careful with vectors of an even sample size, as you will have to take the average of the two central numbers (hint: use modulo %%2 to determine whether the vector is an odd or an even size). Test your function on vectors with both odd and even sample sizes.

    # calculate a median
    
    ourmedian <- function(x){
        n <- length(x)
        if (n %% 2 == 1)      # odd numbers
          sort(x)[(n + 1)/2]  # find the middle number by adding 1 to length and div 2
        else {                # even numbers
          middletwo <- sort(x)[(n/2) + 0:1]   #find the two middle numbers
          mean(middletwo)
          }
    }
    
    # use the function
    mydat <- sample(1:50, size = 10, replace = TRUE )
    
    # our function
    ourmedian(mydat)
    
    # R median function
    median(mydat)

 

  1. You are a population ecologist for the day and wish to investigate the properties of the Ricker model. The Ricker model is defined as:

 

\[ N_{t+1} = N_{t} exp\left[r\left(1- \frac{N_{t}}{K} \right) \right] \]

 

  1. (cont) Where Nt is the population size at time t, r is the population growth rate and K is the carrying capacity. Write a function to simulate this model so you can conveniently determine the effect of changing r and the initial population size N0. K is often set to 100 by default, but you want the option of being able to change this with your function. So, you will need a function with the following arguments; nzero which sets the initial population size, r which will determine the population growth rate, time which sets how long the simulation will run for and K which we will initially set to 100 by default.

    # function to simulate Ricker model
    
    Ricker.model <- function(nzero, r, time, K = 1) {
        # sets initial parameters
        N <- numeric(time + 1)  # creates a real vector of length time+1 to store values of Nt+1
        N[1] <- nzero  # sets initial population size in first element of N
        for (i in 1:time) {
            # loops over time
            N[i + 1] <- N[i] * exp(r * (1 - N[i]/K))
        }
        Time <- 0:time  # creates vector for x axis
        plot(Time, N, type = "o", xlim = c(0, time), xlab = "Time", ylab = "Population size (N)", main = paste("r =", r, sep = " "))  # plots     output
    }
    
    # To run play around with the different parameters, especially r
    Ricker.model(nzero = 0.1, r = 1, time = 100)

 

End of Exercise 6