---
title: "Vector and matrix algebra"
---
## Packages for this section
- This is (almost) all base R! We only need this for one thing later:
```{r vector-matrix-1 }
library(tidyverse)
```
## Vector addition
Adds 2 to each element.
- Adding vectors:
```{r vector-matrix-2}
u <- c(2, 3, 6, 5, 7)
v <- c(1, 8, 3, 2, 0)
u + v
```
- Elementwise addition. (Linear algebra: vector addition.)
## Adding a number to a vector
- Define a vector, then “add 2” to it:
```{r vector-matrix-3}
u
k <- 2
u + k
```
- adds 2 to *each* element of `u`.
## Scalar multiplication
As per linear algebra:
```{r vector-matrix-4}
k
u
k * u
```
- Each element of vector multiplied by 2.
## “Vector multiplication”
What about this?
```{r vector-matrix-5}
u
v
u * v
```
Each element of `u` multiplied by *corresponding* element of `v`. Could be
called elementwise multiplication.
(Don't confuse with “outer” or
“vector” product from linear algebra, or indeed “inner” or “scalar” multiplication,
for which the answer is a number.)
## Combining different-length vectors
- No error here (you get a warning). What happens?
```{r vector-matrix-6}
u
w <- c(1, 2)
u + w
```
- Add 1 to first element of `u`, add 2 to second.
- Go back to beginning of `w` to find something to add: add 1 to 3rd
element of `u`, 2 to 4th element, 1 to 5th.
## How R does this
- Keep re-using shorter vector until reach length of longer one.
- “Recycling”.
- If the longer vector's length not a multiple of the shorter vector's length, get a warning (probably not what you want).
- Same idea is used when multiplying a vector by a number: the number
keeps getting recycled.
## Matrices
- Create matrix like this:
```{r vector-matrix-7}
(A <- matrix(1:4, nrow = 2, ncol = 2))
```
- First: stuff to make matrix from, then how many rows and columns.
- R goes down columns by default. To go along rows instead:
```{r vector-matrix-8}
(B <- matrix(5:8, nrow = 2, ncol = 2, byrow = TRUE))
```
- One of `nrow` and `ncol` enough, since R knows how many things in
the matrix.
## Adding matrices
What happens if you add two matrices?
```{r vector-matrix-9}
A
B
A + B
```
## Adding matrices
- Nothing surprising here. This is matrix addition as we and linear algebra know it.
## Multiplying matrices
- Now, what happens here?
```{r vector-matrix-10}
A
B
A * B
```
## Multiplying matrices?
- *Not* matrix multiplication (as per linear algebra).
- Elementwise multiplication. Also called *Hadamard product* of `A` and `B`.
## Legit matrix multiplication
Like this:
```{r vector-matrix-11}
A
B
A %*% B
```
## Reading matrix from file
- The usual:
```{r vector-matrix-12}
my_url <- "http://ritsokiguess.site/datafiles/m.txt"
M <- read_delim(my_url, " ", col_names = FALSE )
M
class(M)
```
## but...
- except that M is not an R matrix, and thus this doesn’t work:
```{r vector-matrix-13, error=T}
v <- c(1, 3)
M %*% v
```
## Making a genuine matrix
Do this first:
```{r vector-matrix-14}
M <- as.matrix(M)
M
v
```
and then all is good:
```{r vector-matrix-15}
M %*% v
```
## Linear algebra stuff
- To solve system of equations
$Ax = w$ for $x$:
```{r vector-matrix-16}
A
w
solve(A, w)
```
## Matrix inverse
- To find the inverse of A:
```{r vector-matrix-17}
A
solve(A)
```
- You can check that the matrix inverse and equation solution are
correct.
## Inner product
- Vectors in R are column vectors, so just do the matrix multiplication (`t()` is transpose):
```{r vector-matrix-18}
a <- c(1, 2, 3)
b <- c(4, 5, 6)
t(a) %*% b
```
- Note that the answer is actually a 1 × 1 matrix.
- Or as the sum of the elementwise multiplication:
```{r vector-matrix-19}
sum(a * b)
```
## Accessing parts of vector
- use square brackets and a number to get elements of a vector
```{r vector-matrix-20}
b
b[2]
```
## Accessing parts of matrix
- use a row and column index to get an element of a matrix
```{r vector-matrix-21}
A
A[2,1]
```
- leave the row or column index empty to get whole row or column, eg.
```{r vector-matrix-22}
A[1,]
```
## Eigenvalues and eigenvectors
- For a matrix $A$, these are scalars $\lambda$ and vectors $v$ that solve
$$ A v = \lambda v $$
- In R, `eigen` gets these:
```{r vector-matrix-23}
A
e <- eigen(A)
```
## Eigenvalues and eigenvectors
```{r}
e
```
## To check that the eigenvalues/vectors are correct
- $\lambda_1 v_1$: (scalar) multiply first eigenvalue by first eigenvector (in column)
```{r vector-matrix-25}
e$values[1] * e$vectors[,1]
```
- $A v_1$: (matrix) multiply matrix by first eigenvector (in column)
```{r vector-matrix-26}
A %*% e$vectors[,1]
```
- These are (correctly) equal.
- The second one goes the same way.
## A statistical application of eigenvalues
- A negative correlation:
\footnotesize
```{r vector-matrix-27}
d <- tribble(
~x, ~y,
10, 20,
11, 18,
12, 17,
13, 14,
14, 13
)
v <- cor(d)
v
```
\normalsize
- `cor` gives the correlation matrix between each pair of variables (correlation between `x` and `y` is $-0.988$)
## Eigenanalysis of correlation matrix
```{r vector-matrix-28}
eigen(v)
```
- first eigenvalue much bigger than second (second one near zero)
- two variables, but data nearly *one*-dimensional
- opposite signs in first eigenvector indicate that the one dimension is:
- `x` small and `y` large at one end,
- `x` large and `y` small at the other.