# Assignment 3

**Opened:**Thursday, 27 January 2022, 11:30 AM

**Due:**Thursday, 3 February 2022, 11:59 PM

**1)** Create an R file named `myFuncs.R`, which contains definitions for the following two functions.

**1a)** Write an R function, called `geom.pos.mean`

, which takes 1 argument `x`

, a vector of numeric values. The function should calculate and return the "geometric mean" of **positive** values in the vector `x`

.

The geometric mean determines the typical value of a set of numbers by using the product of their values (as opposed to the arithmetic mean which uses their sum). It is defined as the nth root of the product of `n`

numbers numbers, i.e., for a set of numbers `x1, x2, ..., xn`

, the geometric mean is defined as

$$\left(\prod^n_{i=1} x_i\right)^\frac1n = \sqrt[n]{x_1 x_2 \ldots x_n}$$

Your function `geom.pos.mean`

should only work on positive numbers (not including zero). Any non-positive value in the input vector should to be ignored.

There are native R functions `prod()`

and `length()`

that you may find useful; use `help()`

to understand how to use them. You should also know that the caret `^`

symbol is used to raise something to a power, as well as the double star `**`

. That is, `2^3 == 2**3 = 8`

.

**1b)** Write an R function, called `neg.mean`

, which calculates and returns the usual arithmetic mean of a vector of numeric values, but only considers negative values (not including 0), and ignores positive values.

$$\frac1n \sum_{i=1}^n x_i = (x_1 + x_2 + \ldots + x_n)/n$$

Find ways to use the techniques explained in class, such as 'slicing' (lecture 4, slide 9), which will make your code cleaner, more robust and efficient. No loops should be used for either of these two functions.

The `source` command gives you access to the functions stored in a file. The `source`

command reads and executes the whole file as if you were typing the lines at the R prompt. Use the `source("myFuncs.R")`

command inside your R prompt (RGui if you have Windows) to check the output of
your functions. Your functions should behave as follows:

```
```>
> source("myFuncs.R")
>
> geom.pos.mean(-4:4)
[1] 2.213364
>
> neg.mean(-4:4)
[1] -2.5
>

**2)** Write a function, called `harmonicMean`

, which takes 1 argument, `x`

, a vector of numeric values. The function should calculate and return the "harmonic mean" of `x`

.

The harmonic mean determines the typical value of a set of numbers by calculating the reciprocal of the average reciprocal value of the vector of values. Thus for `n`

numbers, i.e. for a set of numbers `x1, x2, ..., xn`

, the harmonic mean is defined as

$$\left(\frac1n \sum_{i=1}^n \frac1{x_i}\right)^{-1} = \frac1{\frac1n(\frac1{x_1} + \frac1{x_2} + \ldots + \frac1{x_n})}$$

As you might expect, if any of the values of `x`

are zero, the harmonic mean is undefined. Your function, `harmonicMean`, should handle the existence of zeros in `x`

. If any zero values are encountered in `x`

, those values should be ignored and the harmonic mean calculated using the remaining values.

Use the techniques explained in class, such as 'slicing', which will make your code cleaner, more robust and efficient. There are some native R functions you may find useful: `sum()`

, and `length()`

; use `help()`

to understand how to use them. You should not need to use loops in your function.

Your function should behave as follows:

```
```>
> source("myFuncs.R")
>
> harmonicMean(1:10)
[1] 3.414172
>
> harmonicMean(-3:5)
[1] 17.77778
>
> harmonicMean(c(-2, 0, 0.5, 7, 0, 4, 4, -2))
[1] 3.652174
>

Be sure to comment your code, indent your code blocks, and use meaningful variable names. You should not need to use loops in this assignment.

Submit your script `myFuncs.R`

.

**Assignments will be graded on 10 points basis.**

**Due date is February 3rd 2022 (midnight), with 0.5 point penalty per day for late submission until the cut-off date of February 10th, 2022, at 11:00am.**