Capítulo 3 Operações matemáticas

As operações matemáticas utilizam símbolos que são padrão em outros softwares estatísticos.

1 + 1 # Soma
2 - 1 # Subtração
2 * 2 # Multiplicação
1 + 2 * 2 ^ 2 # Primeiro eleva ao quadrado, depois multiplica e depois soma
((1 + 2) * 2) ^ 2 # Primeiro soma e depois multiplica depois eleva ao quadrado
sqrt(4) # Raiz quadrada
4^2 # Potência
log(10) # Por default, o logarítimo é de base e (logarítimo natural)
log(100, 10) # Logarítimo de base 10
exp(100) # exponencial

Para multiplicação de matrizes utiliza-se %*% ao envéz de *. Note a diferença no exemplo abaixo.

(x <- matrix(1:4, ncol = 2))
#      [,1] [,2]
# [1,]    1    3
# [2,]    2    4
(y <- matrix(5:8, ncol = 2))
#      [,1] [,2]
# [1,]    5    7
# [2,]    6    8

O resultado da multiplicação da matriz x e y é dado por:

\[ \left( {\begin{array}{*{20}{c}}{1 \cdot 5 + 3 \cdot 6}&{1 \cdot 7 + 3 \cdot 8}\\{2 \cdot 5 + 4 \cdot 6}&{2 \cdot 7 + 4 \cdot 8}\end{array}} \right) = \left( {\begin{array}{*{20}{c}}{23}&{31}\\{34}&{46}\end{array}} \right) \]

x * y # Errado
#      [,1] [,2]
# [1,]    5   21
# [2,]   12   32
x %*% y # Certo
#      [,1] [,2]
# [1,]   23   31
# [2,]   34   46

A função t() é utilizada para transposição de matrizes e solve() para inversão de matrizes. Vamos resolver o seguinte sistema de equações retirado do livro de (Rencher and Schaalje 2008) utilizando estes operadores.

\[ \begin{array}{l}{x_1} + 2{x_2} = 4\\{x_1} - {x_2} = 1\\{x_1} + {x_2} = 3\end{array} \]

Matricialmente o sistema acima é dado por:

\[\left[ {\begin{array}{*{20}{c}}{\begin{array}{*{20}{l}}1\\1\\1\end{array}}&{\begin{array}{*{20}{c}}2\\{ - 1}\\1\end{array}}\end{array}} \right]\left[ {\begin{array}{*{20}{c}}{{x_1}}\\{{x_2}}\end{array}} \right] = \left[ {\begin{array}{*{20}{c}}4\\1\\3\end{array}} \right]\]

Esse sistema de equações é representado por \({\bf{AX}} = {\bf{c}}\) e tem como solução \({\bf{X = }}{{\bf{A}}^{{\bf{ - 1}}}}{\bf{c}}\)


(A <- matrix(c(1, 1, 1, 2, -1, 1), nrow = 3, ncol = 2))
#      [,1] [,2]
# [1,]    1    2
# [2,]    1   -1
# [3,]    1    1
A1 <- MASS::ginv(A) # Obtém a inversa generalizada de A
c <- c(4, 1, 3) # Vetor C
X <- A1 %*% c
X
#      [,1]
# [1,]    2
# [2,]    1

Considere um equação linear múltipla cuja variável dependente é Y e as variáveis independentes são X1 e X2 (dados obtidos em (Kutner et al. 2005)). O sistema de equações é representado matricialmente por

\[ \boldsymbol{X'X{\beta = X'Y}} \]

que tem como solução:

\[ \boldsymbol{\hat\beta = X'X^{-1}X'Y} \]

X0 <- rep(1, each = 10)
X1 <- c(68.5, 45.2, 91.3, 47.8, 46.9, 66.1, 49.5, 52, 48.9, 38.4)
X2 <- c(16.7, 16.8, 18.2, 16.3, 17.3, 18.2, 15.9, 17.2, 16.6, 16)
Y <- c(174.4,  164.4, 244.2, 154.6, 181.6, 207.5, 152.8, 163.2, 145.4, 137.2)
X <- matrix(c(X0, X1, X2), nrow = 10, ncol = 3)
X
#       [,1] [,2] [,3]
#  [1,]    1 68.5 16.7
#  [2,]    1 45.2 16.8
#  [3,]    1 91.3 18.2
#  [4,]    1 47.8 16.3
#  [5,]    1 46.9 17.3
#  [6,]    1 66.1 18.2
#  [7,]    1 49.5 15.9
#  [8,]    1 52.0 17.2
#  [9,]    1 48.9 16.6
# [10,]    1 38.4 16.0
B <- (solve(t(X) %*% X)) %*%  t(X) %*% Y
B
#             [,1]
# [1,] -234.698704
# [2,]    1.074137
# [3,]   20.547108

O modelo ajustado é dado por \(\hat Y = - 234.698704 + 1.074137{X_1} + 20.547108{X_2} + \varepsilon\). Combinando algumas funções vistas até agora, vamos criar um vetor de dados chamado PRED com os valores estimados pelo modelo acima. Em adição, um vetor de resíduos (RESID) será criado.

PRED <- B[1] + B[2] * X1 + B[3] * X2
RESID <- Y - PRED

As funções det() para calcular o determinante de uma matriz. Já a função eigen() retorna uma lista com os autovalores e autovetores da matriz. A função names() indica o que contém no objeto av, e usando $ é possivel selecionar os autovalores ou os autovetores.

mat <- matrix(c(0, 2, 4, 3, 5, 0, 2, 4, 4), nrow = 3)
detXX <- det(mat)
av <- eigen(mat)
names(av)
# [1] "values"  "vectors"
av$values # Extrai os autovalores
# [1]  8  2 -1
av$vectors # Extrai os autovetores
#           [,1]       [,2]       [,3]
# [1,] 0.4082483 -0.3333333  0.7715167
# [2,] 0.8164966 -0.6666667  0.1543033
# [3,] 0.4082483  0.6666667 -0.6172134

A função diag() extrai a diagonal de uma matriz ou cria uma matriz onde a diagonal são os elementos declarados. Os próximos comandos extraem a diagonal de XX e criam uma matriz identidade, com 5 linhas e 5 colunas.

diag(mat)
# [1] 0 5 4
diag(x = 1, nrow = 4, ncol = 4)
#      [,1] [,2] [,3] [,4]
# [1,]    1    0    0    0
# [2,]    0    1    0    0
# [3,]    0    0    1    0
# [4,]    0    0    0    1