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