# Definição de matrizes
A <- matrix(c(1, -308, 1, -318), ncol = 2, byrow = TRUE) # matriz A;
# o sinal negativo decorre da função possuir inclinação negativa
b <- matrix(c(4.4, -5.2), ncol = 1) # matriz b9 Bioenergética
- Estabilidade de biopolímeros;
- Interação ligante-receptor;
- Transporte de biomoléculas e íons;
- Mudanças conformacionais em biomacromoléculas;
- Associação de biopolímeros;
- Transferência de elétrons em proteínas;
- Combustão e síntese de biomoléculas;
- Geração de energia metabólica.
\[ \Delta G = \Delta H - T * \Delta S \tag{9.1}\]
Para isto é necessário determinar-se o valor de \(\Delta\)G da transição de fase, o que pode ser realizado de diversas maneiras, e a partir de metodologia igualmente diversificada. Assim, por meio de medidas espectroscópicas (absorção molecular, fluorescência, luminescência), hidrodinâmicas (viscosimetria, coeficiente de sedimentação, pressão osmótica), eletroquímicas (potenciometria, voltametria), ou de atividade biológica, dentre muitas, é possível quantificar o parâmetro termodinâmico \(\Delta\)G. Esse, por sua vez, pode ser extraído das relações que seguem, considerando-se uma transição de dois estados:
\[ N \rightleftarrows D \tag{9.2}\]
\[ K_{eq} = \frac{[D]}{[N]} \tag{9.3}\]
\[ \Delta G = - R*T*ln(K_{eq}) \tag{9.4}\]
Onde \(K_{eq}\), [D], e [N] representam, respectivamente, a constante de equilíbrio de desnaturação da proteina, bem como as concentrações dessa na forma desnaturada e nativa.
Em \(35^{o}\)C: \(\Delta\)G\(_{desn}\) = \(\Delta\)H\(_{desn}\) - 308 * \(\Delta\)S\(_{desn}\) = +4,4 kJ \(mol^{-1}\)
Em \(45^{o}\)C: \(\Delta\)G\(_{desn}\) = \(\Delta\)H\(_{desn}\) - 318 * \(\Delta\)S\(_{desn}\) = -5,2 kJ \(mol^{-1}\)
Outra solução, mais prática e computacional, envolve a resolução do sistema de equações lineares, tal como segue:
\[ a_{11}*x_1 + a_{12} * x_2 = b_1 \\ a_{21}*x_1 + a_{22} * x_2 = b_2 \tag{9.5}\]
Onde \(x_1\) e \(x_2\) representam, respectivamente, \(\Delta\)H\(_{desn}\) e \(\Delta\)S\(_{desn}\).
\[ a_{11}*x_1 + a_{12} * x_2 = b_1 \\ a_{21}*x_1 + a_{22} * x_2 = b_2 \tag{9.6}\]
\[ A = \begin{bmatrix} a_{11} & a_{12}\\ a_{21} & a_{22} \end{bmatrix} , \]
\[ x = \begin{bmatrix} b_1\\ b_2 \end{bmatrix} , \]
\[ b = \begin{bmatrix} x_1\\ x_2 \end{bmatrix} \]
\[ x = A^{-1} * b \tag{9.7}\]
9.1 Solução de sistema de equações lineares no R
R, define-se inicialmente a matriz para A e a matriz para b tal que:\[ A = \begin{bmatrix} 1 & -308\\ 1 & -318 \end{bmatrix} , \]
\[ b = \begin{bmatrix} +4,4\\ -5,2 \end{bmatrix} \]
solve:# Solução matricial para sistema linear
solve(A) %*% b # # a operação %*% indica o produto escalar de dois [,1]
[1,] 300.08
[2,] 0.96
# vetores ('dot product')\[ \begin{pmatrix} 1 \\ 2 \\ 3 \\ \end{pmatrix} * \begin{pmatrix} 1 & 2 & 3 \\ \end{pmatrix} = \begin{pmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \\ 3 & 6 & 9 \\ \end{pmatrix} \tag{9.8}\]
Dessa forma, tal como visto no capítulo Capítulo 5, poderíamos solucionar os parâmetros \(\Delta\)H\(_{desn}\) e \(\Delta\)SH\(_{desn}\) por ajuste linear. De fato, uma das expressões de Van’t Hoff que definem esta relação linear é:
\[ ln \, K_{eq} = - \frac{\Delta H}{R} * \frac{1}{T} + \frac{\Delta S}{R} \] {?eq-eqVHoff}
De fato, a solução matricial de ajuste linear pode ser obtida a partir da relação abaixo:
\[ \beta = (X^T \; X)^{-1} \; X^T*y \tag{9.9}\]
lm sejam extraídos por outras funções do algoritmo de cálculos matriciais/estatísticos. Na equação Equação 9.9 o termo entre parênteses envolve a operação de inversão da matriz. Em álgebra linear não existe a operação de divisão para matrizes, mas somente a multiplicação de uma matriz por um escalar ou pela inversa de outra. E mesmo assim, somente se tratar-se de uma matriz quadrada. Dessa forma o termo (X\(^{T}\) X)\(^{-1}\) só pode ser calculado com inversão matricial. No R essa ação é dada pelo comando solve.Com dantes, é vital importância também que a matriz X contendo a variável independente seja criada com valores unitários à esquerda, tal como segue:
\[ X = \begin{bmatrix} 1 & x_{1}\\ 1 & x_{2}\\ 1 & x_{3}\\ ... & ... \end{bmatrix} \]
# Solução matricial para os parâmetros cinéticos de Lineweaver-Burk
# Repetindo os dados para as variáveis de Lineweaver-Burk
S <- seq(0.1, 1, length.out = 20) # gera uma sequência com 20 pontos
# entre 0 e 1 para valores de substrato
Vm <- 10
Km <- 0.5 # parâmetros cinéticos
set.seed(1500) # estabelece a mesma semente aleatória do gráfico direto
# de Michaelis-Menten, para reproducibilidade dos pontos
erro <- runif(20, 0, 1) # comando para erro uniforme (no. de pontos, min, max)
v <- Vm * S/(Km + S) + erro # equação de Michaelis-Menten
inv.S <- 1/S # cria variáveis para o duplo-recíproco
inv.v <- 1/v
# Criação das matrizes A e b
A2 <- matrix(c(rep(1, 20), inv.S), nrow = 20, byrow = FALSE) # cria matriz
# com valor unitário necessário antes da variável independente
b2 <- as.matrix(inv.v, nrow = 1, byrow = FALSE) # vetor b
# Solução matricial do ajuste linear
beta <- solve(t(A2) %*% A2) %*% t(A2) %*% b2
beta [,1]
[1,] 0.11363419
[2,] 0.03277244
lm do R.9.2 Matrizes e R
Dessa forma, é interessante uma rápida panorâmica no potencial de matrizes que o
R possui.# Algumas manipulações com matrizes
## Identificação de linhas e colunas
res <- matrix(c(-308, -318),
nrow = 2, byrow = TRUE, # definição de matriz
dimnames = list(c("Delta H", "Delta S"), "kJ/mol")
)
res kJ/mol
Delta H -308
Delta S -318
## Operações aritméticas
m1 <- matrix(c(1, 2, 3, 4), nrow = 2, byrow = T)
m2 <- matrix(c(4, 5, 6, 7), nrow = 2, byrow = T)
m1 + 5 [,1] [,2]
[1,] 6 7
[2,] 8 9
m2 - 7 # soma ou subtração em escalar [,1] [,2]
[1,] -3 -2
[2,] -1 0
m1^2 [,1] [,2]
[1,] 1 4
[2,] 9 16
sin(m2) # potência ou trigonometria [,1] [,2]
[1,] -0.7568025 -0.9589243
[2,] -0.2794155 0.6569866
m1 + m2 # soma de elementos em matrizes de igual dimensão [,1] [,2]
[1,] 5 7
[2,] 9 11
m1 * m2 # multiplicação de elementos em matrizes de igual dimensão [,1] [,2]
[1,] 4 10
[2,] 18 28
m1 %*% m2 # produto cruzado de matrizes ("dot product" de vetores) [,1] [,2]
[1,] 16 19
[2,] 36 43
det(m1) # determinante da matriz[1] -2
t(m2) # transposição da matriz [,1] [,2]
[1,] 4 6
[2,] 5 7
diag(m1) # matriz diagonal[1] 1 4
solve(m2) # inverso da matriz [,1] [,2]
[1,] -3.5 2.5
[2,] 3.0 -2.0
eigen(m1) # autovalor ("eingenvalue") e autovetor ("eigenvector") da matrizeigen() decomposition
$values
[1] 5.3722813 -0.3722813
$vectors
[,1] [,2]
[1,] -0.4159736 -0.8245648
[2,] -0.9093767 0.5657675
R também permite várias outras operações utilizadas em cálculo numérico e simbólico que utilizam matrizes, tais como as funções kronecker (multiplicação matricial), svd (Single Decomposition Value), qr (Decomposição QR), e chol(Decomposição de Cholesky).9.3 Solução de parâmetros termodinâmicos de estabilidade enzimática
\[ \begin{cases}\Delta G^\ddagger = \Delta H^\ddagger-T* \Delta S^\ddagger \\ ln(\frac{kcat*h}{K_B*T})=-\frac{1}{RT}*\Delta H^\ddagger + \frac{1}{R}*\Delta S^\ddagger \end{cases} \tag{9.10}\]
Onde os termos com \(\ddagger\) simbolizam as variações de quantidades referentes à ativação (ou desativação) da enzima (estado de transição do complexo ativado), \(K_{B}\) representa a constante de Boltzmann (1,381x10\(^{-23}\) JK\(^{-1}\)), h a constante de Planck (6,686x10\(^{-34}\) J*s), e R a constante geral dos gases (8,314 JK\(^{-1}\) mol\(^{-1}\)). Nem sempre é possível convergir uma solução matricial pela simples utilização de multiplicação cruzada (dot product).
\[ \Delta G^{\ddagger}=65920\, J\,mol^{-1} \\ T = 328 K \\ kcat = 217 s^{-1} \tag{9.11}\]
\[ A = \begin{bmatrix} 1 & -328\\ -3.67e-4 & 0.120\\ \end{bmatrix} , \]
\[ b = \begin{bmatrix} 65920\\ -24.17\\ \end{bmatrix} \]
# Tentativa de solução matricial simples em dados publicados (Appl. Microbiol.
# Biotechnol, 73, 1290, 2007):
A <- matrix(c(1, -0.000367, -328, 0.12), nrow = 2, byrow = TRUE)
b <- matrix(c(65921, -24.17), nrow = 2)
solve(A) %*% b [,1]
[1,] -21038593
[2,] -57505488910
solve também sofre de resolução para o problema, incorrendo em erro se executada, tal como no trecho que segue. Observe também a possibilidade distinta para a construção das matrizes.Aframe <- data.frame(c(1, -0.000367), c(-328, 0.12))
A <- as.matrix(Aframe)
b <- as.matrix(c(65921, -24.17))
solve(t(A) %*% A) %*% t(A) %*% bR, tal como o rootSolve já utilizado ou o nleqslv empregado anteriormente. Nesse sentido, a minimização de busca de raízes para o sistema de equações pode ser demonstrada a seguir:library(rootSolve)
T <- 328
R <- 8.314
h <- 6.626e-34
kb <- 1.381e-23
kcat <- 217
DG <- -R * T * log((kcat * h)/(kb * T)) # 65920 J/mol
model <- function(x) c(x[1] - T * x[2] - DG, x[2]/R - x[1]/(R * T) - log((kcat *
h)/(kb * T)))
(ss <- multiroot(model, start = c(50000, 50000)))$root
[1] 40843.50837 -76.45441
$f.root
[1] 2.110028e-09 -7.744916e-13
$iter
[1] 3
$estim.precis
[1] 1.055401e-09
Comparando-se os valores, os autores encontraram \(\Delta\) H\(^{\ddagger}\) = 33,3 kJmol\(^{-1}\) e \(\Delta\) S\(^{\ddagger}\) = -99,8 Jmol\(^{-1}\)K\(^{-1}\). Perceba a semelhança dos resultados obtidos pela minimização de raízes com os parâmetros encontrados pelos autores. A obtenção do valor de \(\Delta\) H\(^{\ddagger}\) para esses, contudo, foi obtida somente a partir da obtenção do valor experimental de energia de ativação de Arrhenius (Ea), pela inclinação de um gráfico linearizado da taxa de reação, tal como segue:
require(rootSolve)
T <- 328
R <- 8.314
h <- 6.626e-34
kb <- 1.381e-23
kcat <- 217
DG <- 66000
model <- function(x) c(x[1] - T * x[2] - DG, x[2]/R - x[1]/(R * T) - log((kcat *
h)/(kb * T)))
(ss <- multiroot(model, start = c(50000, 50000)))$root
[1] 51579492242 157254348
$f.root
[1] 177.50881195 -0.09422566
$iter
[1] 3
$estim.precis
[1] 88.80152
9.4 Entalpia De Reação Por Matrizes
Matematicamente a Lei de Hess pode ser expressa como:
Onde \(\nu\) representa a estequiometria da reação, ou seja, o número de mols de cada composto/elemento, enquanto P e R referem-se à Produto e Reagente.
Para isso, é necessário 1) compor as matrizes A e b, 2) calcular o vetor de coeficients beta, e 3) efetuar o produto escalar (%*%) de beta com uma matriz formada pelos valores de entalpia de formação. O racional para compor as matrizes envolve elencar cada composto com sua estequiometria de reação, e exige que para reagentes seja conferido valor negativo, enquanto que para produtos, valor positivo.
A tabela abaixo ilustra essa construção para o problema em questão.
library(knitr) # para gerar a tabela
comp <- c("C2H2", "O2", "CO2", "H2O", "C2H6", "H2") # elenco dos compostos envolvidos
rea1 <- c(-2, -5, +4, +2, 0, 0) # estequiometria (reação1)
rea2 <- c(0, -7, +4, +6, -2, 0) # estequiometria (reação2)
rea3 <- c(0, -0.5, 0, +1, 0, -1) # estequiometria (reação3)
incog <- c(-1, 0, 0, 0, +1, -2) # estequiometria da reação com entalpia desconhecida
tab_esteq <- data.frame(comp, rea1, rea2, rea3, incog) # dataframe com os resultados
colnames(tab_esteq) <- c("composto", "reação 1", "reação 2", "reação 3", "etano") # nomeia as colunas
knitr::kable(tab_esteq, caption = "Estequiometria reacional para solução matricial de formação de etano (C2H6).",
"pipe") # tabela| composto | reação 1 | reação 2 | reação 3 | etano |
|---|---|---|---|---|
| C2H2 | -2 | 0 | 0.0 | -1 |
| O2 | -5 | -7 | -0.5 | 0 |
| CO2 | 4 | 4 | 0.0 | 0 |
| H2O | 2 | 6 | 1.0 | 0 |
| C2H6 | 0 | -2 | 0.0 | 1 |
| H2 | 0 | 0 | -1.0 | -2 |
# Solução matricial para entalpia de formação
A <- matrix(c(-2, 0, 0, -5, -7, -0.5, 4, 4, 0, 2, 6, 1, 0, -2, 0, 0, 0, -1), nrow = 6,
byrow = T) # cria matrix das reações com variação de entalpia conhecida
b <- matrix(c(-1, 0, 0, 0, 1, -2), nrow = 6, byrow = T) # cria matriz dos coeficientes estequiométricos da reação com variação de entalpia desconhecida
beta <- solve(t(A) %*% A) %*% t(A) %*% b # cálcula beta
energ <- matrix(c(-2600, -3210, -286), nrow = 1, byrow = T) # cria matriz com os valores de entalpia
etano <- energ %*% beta
cat("Valor para deltaHr etano: ", etano, " kJ/mol")Valor para deltaHr etano: -267 kJ/mol
9.5 Quantidades Termodinâmicas Por Ajuste Polinomial
Não obstante, não poderíamos utilizar as relações lineares de matrizes ou ajustes lineares para solucionar parâmetros quantitativos em situações que não repousassem no comportamento linear entre as variáveis, tal como referido pela equação ?eq-eqVHoff, por exemplo.
T <- c(5.29, 10.07, 15.23, 20.21, 25.11, 30.29, 37.39) + 273 # dados de temperatura, em graus Kelvin
dG <- c(11.74, 12.17, 12.46, 12.73, 12.88, 12.98, 13.13) * -1000 # dados de -deltaG, em kcal/mol
plot(T, dG, xlab = "T, K", ylab = expression(paste(Delta, "G, kcal/mol")))
pol3 <- lm(dG ~ poly(T, 3, raw = TRUE)) # ajuste a polinômio de 3o. grau; "raw=TRUE" é essencial
# Alternativamente, pode-se também ajustar polinômios como
# pol3<-lm(dG ~ T + I(T^2)+I(T^3))
summary(pol3)
Call:
lm(formula = dG ~ poly(T, 3, raw = TRUE))
Residuals:
1 2 3 4 5 6 7
2.350 -13.432 26.731 -16.407 -8.577 12.164 -2.829
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 8.970e+05 2.449e+05 3.663 0.0352 *
poly(T, 3, raw = TRUE)1 -8.836e+03 2.498e+03 -3.537 0.0385 *
poly(T, 3, raw = TRUE)2 2.866e+01 8.492e+00 3.375 0.0433 *
poly(T, 3, raw = TRUE)3 -3.105e-02 9.613e-03 -3.230 0.0482 *
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 21.6 on 3 degrees of freedom
Multiple R-squared: 0.999, Adjusted R-squared: 0.9981
F-statistic: 1045 on 3 and 3 DF, p-value: 5.02e-05
plot(T, dG,
xlab = "T, K", ylab = expression(paste(Delta, "G, kcal/mol"))
# gráfico de T x deltaG
)
lines(T, fitted(pol3), col = "red") # curva ajustada sobre os dados
\[A = \begin{bmatrix} 1 & 278.29\\ 1 & 283.07\\ 1 & 288.23\\ 1 & 293.21\\ 1 & 298.11\\ 1 & 303.29\\ 1 & 310.39\\ \end{bmatrix} , \] \[b = \begin{bmatrix} -11740\\ -12170\\ -12460\\ -12730\\ -12880\\ -12980\\ -13130\\ \end{bmatrix} \]
\[matriz \,V = \begin{bmatrix} 1 & x_1 & x_1^2 & x_1^3 & ... \\ 1 & x_2 & x_2^2 & x_2^3 & ... \\ 1 & x_3 & x_3^2 & x_3^3 & ...\\ 1 & ...& ... & ... & ...\\ \end{bmatrix} , \]
R possui um pacote para automatizar essa transformação, matrixcalc, exemplificado no trecho de código abaixo:Agora basta aplicar a mesma relação matricial da equação @ref(eq:eqAm1xb), no caso, para quatro pontos intercalados dos dados experimentais acima, e portanto produzindo um polinômio de 4o grau:
T <- c(5.29, 15.23, 25.11, 37.39) + 273 # dados de temperatura, em graus Kelvin
dG <- c(11.74, 12.46, 12.88, 13.13) * -1000 #
library(matrixcalc)
# Criação das matrizes A (Vandermonde) e b
b <- as.matrix(dG, nrow = 4, byrow = TRUE) # vetor b
A <- vandermonde.matrix(alpha = T, n = 4)
A # função para criar matriz de alternância (Vandermonde) [,1] [,2] [,3] [,4]
[1,] 1 278.29 77445.32 21552259
[2,] 1 288.23 83076.53 23945149
[3,] 1 298.11 88869.57 26492908
[4,] 1 310.39 96341.95 29903579
sol.vnd <- solve(A) %*% b
sol.vnd # coeficientes polinomiais (4o. grau) [,1]
[1,] 5.095658e+05
[2,] -4.886799e+03
[3,] 1.525183e+01
[4,] -1.589352e-02
polynom:library(polynom) # converte vetor de coeficientes em polinômio simbólico
p <- as.polynomial(sol.vnd)
p2 <- as.function(p) # permite converter o polinômio pra função curve
plot(T, dG)
curve(p2, from = 273, to = 315, add = TRUE) # curva polinomial suave
R (lm) como pela solução matricial acima, revele boa adesão do modelo aos dados experimentais, como representado pela Figura @ref(fig:TdG) e pela tabela de resultados acima, não há correlação de parâmetros termodinâmicos, posto tratar-se de um modelo matemático empírico, e não analítico para o sistema.Entretanto, é possível obter uma boa aproximação das quantidades \(\Delta\)H (entalpia), \(\Delta\)S (entropia) e \(\Delta\)Cp (capacidade calorífica) que modelam fenomenologicamente o comportamento termodinâmico em determinada temperatura, por relações próprias entre essas quantidades (Edelhoch e Osborne Jr 1976).
Assim, o valor de \(\Delta\)S pode ser obtido pela primeira derivada da relação empírica acima (@ref(eq:eqGibbsEmp)):
\[\begin{equation} \Delta S = -(\frac{\partial \Delta G}{\partial T})_p = -b-2cT-3dT^2 (\#eq:eqdSEmp) \end{equation}\]O valor de \(\Delta\)H, por sua vez, pode agora ser extraído da equação @ref(eq:eqGibbs) aqui repetida, juntamente com a equação @ref(eq:eqGibbsEmp):
\[\begin{equation} \Delta G = \Delta H - T * \Delta S (\#eq:eqGibbs) \end{equation}\] \[\begin{equation} \Delta H = \Delta G +T * \Delta S (\#eq:eqdH) \end{equation}\]Ou seja, o valor de \(\Delta\)Cp pode ser aproximado pela primeira derivada de \(\Delta\)H (equação @ref(eq:eqdHEmp)) sobre T. Ou seja:
\[\begin{equation} \Delta Cp = -2cT-6dT^2 (\#eq:eqdCpEmp) \end{equation}\]# Solução polinomial de parâmetros termodinâmicos para interação de insulina
# com receptor
T <- c(5.29, 10.07, 15.23, 20.21, 25.11, 30.29, 37.39) + 273 # dados de temperatura, em graus Kelvin
dG <- c(11.74, 12.17, 12.46, 12.73, 12.88, 12.98, 13.13) * -1000 # dados de -deltaG, em kcal/mol
# Ajuste a polinômio de 2o. grau
pol3 <- lm(dG ~ poly(T, 3, raw = TRUE)) # ajuste a polinômio de 3o. grau
Tref <- 298 # temperatura de referência, em graus Kelvin
# Cálculos
dG <- coef(pol3)[1] + coef(pol3)[2] * Tref + coef(pol3)[3] * Tref^2 + coef(pol3)[4] *
Tref^3 # deltaG
dS <- -coef(pol3)[2] - 2 * coef(pol3)[3] * Tref - 3 * coef(pol3)[4] * Tref^2 # deltaS
dH <- coef(pol3)[1] - coef(pol3)[3] * Tref^2 - 2 * coef(pol3)[4] * Tref^3 # deltaH
dCp <- -2 * coef(pol3)[3] * Tref - 6 * coef(pol3)[4] * Tref^2 # deltaCp
# Parâmetros em 298 K
cat("valor de deltaG: ", dG, "cal/mol", "\n")valor de deltaG: -12868.43 cal/mol
cat("Valor de deltaS: ", dS, "cal/mol/K", "\n")Valor de deltaS: 27.29257 cal/mol/K
cat("Valor de deltaH: ", dH, "cal/mol", "\n")Valor de deltaH: -4735.248 cal/mol
cat("valor de deltaCp: ", dCp, "cal/mol/K", "\n")valor de deltaCp: -537.5956 cal/mol/K
9.6 Estabilidade Termodinâmica de Biopolímeros
O que resulta em:
\[\begin{equation} f_N = 1 - f_D (\#eq:eqSfD) \end{equation}\]Onde Si representa o sinal no ponto i.
E, portanto,
\[\begin{equation} \Delta G_D = -RT*ln\;K_D (\#eq:eqdGD) \end{equation}\]Tm <- 85
dHm <- 180
dCp <- 3
x <- 0:80
curve(dHm * (1 - x/Tm) + dCp * ((x - Tm - x * log(x/Tm))), xlim = c(0, 80)) # Nicholson1996; Sholz2009
9.7 Relação Quantitativa Estrutura-Função (QSAR) e Ajuste Multilinear
|Onde pIC\(_{50}\) representa a atividade biológica aferida (-log IC\(_{50}\)), S indexa valores de solubilidade, e W refere-se a parâmetro de largura do primeiro átomo do grupo substituinte. Esses dados são tabelados abaixo:
grupo <- c("H", "Cl", "SCH3", "OCH3", "CN", "CHO", "Br", "CH3", "CCH") # grupos substituintes em TIBO
S <- c(3.53, 4.24, 4.09, 3.45, 2.96, 2.89, 4.39, 4.03, 3.8) # parâmetro de solubilidade
W <- c(1, 1.8, 1.7, 1.35, 1.6, 1.6, 1.95, 1.6, 1.6) # parâmetro de largura de grupo
pIC50 <- c(7.36, 8.37, 8.3, 7.47, 7.25, 6.73, 8.52, 7.87, 7.53) # atividade biológica de TIBO
tab.tibo <- data.frame(grupo, S, W, pIC50)
knitr::kable(tab.tibo, caption = "dados multivariáveis de atividade biológica de TIBO e parâmetros preditivos.",
"pipe") # tabela| grupo | S | W | pIC50 |
|---|---|---|---|
| H | 3.53 | 1.00 | 7.36 |
| Cl | 4.24 | 1.80 | 8.37 |
| SCH3 | 4.09 | 1.70 | 8.30 |
| OCH3 | 3.45 | 1.35 | 7.47 |
| CN | 2.96 | 1.60 | 7.25 |
| CHO | 2.89 | 1.60 | 6.73 |
| Br | 4.39 | 1.95 | 8.52 |
| CH3 | 4.03 | 1.60 | 7.87 |
| CCH | 3.80 | 1.60 | 7.53 |
R permite fazê-lo por ao menos duas formas: função interna de ajuste linear (lm) ou álgebra matricial.9.7.1 Ajuste linear múltiplo por função lm:
lm.tibo <- lm(tab.tibo$pIC50 ~ tab.tibo$S + tab.tibo$W) # comando para ajuste multilinear;
# Alternativamente, lm.tibo <- lm(cbind(S,W)~pIC50)
summary(lm.tibo)
Call:
lm(formula = tab.tibo$pIC50 ~ tab.tibo$S + tab.tibo$W)
Residuals:
Min 1Q Median 3Q Max
-0.27636 -0.15649 0.02922 0.08911 0.24761
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 3.5903 0.5435 6.606 0.000579 ***
tab.tibo$S 0.9571 0.1519 6.300 0.000746 ***
tab.tibo$W 0.3619 0.3020 1.199 0.275888
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 0.2045 on 6 degrees of freedom
Multiple R-squared: 0.912, Adjusted R-squared: 0.8826
F-statistic: 31.07 on 2 and 6 DF, p-value: 0.0006826
R (*dataframe $ vetor). Essa é maneira mais simples, pois independe de pacotes extras (como o dplyr), embora seja menos legível.9.7.2 Ajuste linear múltiplo por matrizes:
\[X = \begin{bmatrix} 1 & S_{1} & W_{1} \\ 1 & S_{2} & W_{2}\\ 1 & S_{3} & W_{3}\\ ... & ... \end{bmatrix} \]
# Criação das matrizes A e b
A <- matrix(c(rep(1, 9), S, W), nrow = 9, byrow = FALSE) # cria matriz com valor unitário necessário antes da variável independente
b <- as.matrix(pIC50, nrow = 1, byrow = FALSE) # vetor b
# Solução matricial do ajuste linear
beta <- solve(t(A) %*% A) %*% t(A) %*% b
beta [,1]
[1,] 3.5902556
[2,] 0.9571092
[3,] 0.3619292
Esse procedimento matricial multilinear também pode ser aplicado em outros tipo de análise multivariável, como experimento fatorial e metodologia de superfície de resposta. Isso decorre da própria natureza desses sistemas, quando lineares. Veja as aplicações abaixo. Mesmo para metodologia de superfície de resposta quadrática (onde os parâmetros variam com o quadrado das variáveis preditoras), também é possível a solução matricial (equação @ref(eq:linMatr)).
9.8 Rendimento de Reação & Planejamento Fatorial 2\(^{2}\)
# Dados do experimento
temp <- c(40, 60, 40, 60)
catalis <- c("A", "A", "B", "B")
rendim <- c(59, 90, 54, 68)
# Tabela do planejamento fatorial
tab.fat <- data.frame(temp, catalis, rendim)
knitr::kable(tab.fat, caption = "Dados de experimento fatorial (Neto e cols, 2010).",
"pipe") # tabela| temp | catalis | rendim |
|---|---|---|
| 40 | A | 59 |
| 60 | A | 90 |
| 40 | B | 54 |
| 60 | B | 68 |
\[X = \begin{bmatrix} 1 & -1 & -1 & 1 \\ -1 & -1 & 1 & 1 \\ -1 & 1 & -1 & 1 \\ 1 & 1 & 1 & 1 \\ \end{bmatrix} \]
# Criação da matriz de planejamento codificada
X <- matrix(c(1, -1, -1, 1, 1, 1, -1, -1, 1, -1, 1, -1, 1, 1, 1, 1), nrow = 4, byrow = TRUE)
# Criação da matriz de rendimento
Y <- as.matrix(rendim)
# Determinação dos coeficientes beta:
beta <- t(X) %*% Y/c(4, 2, 2, 2)
beta [,1]
[1,] 67.75
[2,] 22.50
[3,] -13.50
[4,] -8.50
\[\begin{equation} \begin{pmatrix} M \\ T \\ C \\ TC \\ \end{pmatrix} = \begin{pmatrix} 67,75 \\ 22,50 \\ -13,50 \\ -8,50 \\ \end{pmatrix} (\#eq:fator22) \end{equation}\]
Onde M representa a média global da resposta, T e C os efeitos principais (temperatura e catalisador), e TC o efeito da interação. Em síntese, os resultados sugerem que 1) a temperatura favoreceu o rendimento, especialmente para o catalisador A, 2) há redução do rendimento quando se substitui o catalisador A pelo B, e c) os maiores rendimentos são obtidos com o catalisador A na temperatura mais alta. Expressando-se esses resultados na função linear múltipla:
\[\begin{equation} y=67,75+22,5*T-13,5*C-8,5*T*C (\#eq:eqFator) \end{equation}\]beta <- (solve(t(X) %*% X) %*% t(X) %*% Y) * c(1, 2, 2, 2)
beta [,1]
[1,] 67.75
[2,] 22.50
[3,] -13.50
[4,] -8.50
9.9 Metodologia de Superfície de Resposta (MSR)
Exemplificando para uma superfície de resposta linear (Neto, Scarminio, e Bruns 2010), num ensaio em que se deseja verificar o melhor rendimento (rend, %) de uma reação variando-se 3 níveis de concentração de reagente (conc, %) e três velocidades de agitação magnética (agit, rpm), pode-se como dantes elaborar a matriz de contrastes a partir das informações da tabela que segue:
conc <- c(45, 55, 45, 55, 50, 50, 50)
agit <- c(90, 90, 110, 110, 100, 100, 100)
x1 <- c(-1, 1, -1, 1, 0, 0, 0)
x2 <- c(-1, -1, 1, 1, 0, 0, 0)
rendim <- c(69, 59, 78, 67, 68, 66, 69)
tab.msr <- data.frame(conc, agit, x1, x2, rendim)
knitr::kable(tab.msr, caption = "Dados de experimento de metodologia de superfície de resposta linear (Neto e cols, 2010).",
"pipe") # tabela| conc | agit | x1 | x2 | rendim |
|---|---|---|---|---|
| 45 | 90 | -1 | -1 | 69 |
| 55 | 90 | 1 | -1 | 59 |
| 45 | 110 | -1 | 1 | 78 |
| 55 | 110 | 1 | 1 | 67 |
| 50 | 100 | 0 | 0 | 68 |
| 50 | 100 | 0 | 0 | 66 |
| 50 | 100 | 0 | 0 | 69 |
# Criação da matriz de coeficientes de contraste
X <- matrix(c(1, 1, 1, 1, 1, 1, 1, -1, 1, -1, 1, 0, 0, 0, -1, -1, 1, 1, 0, 0, 0),
nrow = 7, byrow = FALSE)
# Criação da matriz de rendimento
Y <- as.matrix(rendim)
# Determinação dos coeficientes beta:
beta <- solve(t(X) %*% X) %*% t(X) %*% Y
beta [,1]
[1,] 68.00
[2,] -5.25
[3,] 4.25
9.9.1 Superfície Quadrática de Resposta
conc <- c(30, 40, 30, 40, 35, 35, 35, 28, 35, 42, 35)
agit <- c(115, 115, 135, 135, 125, 125, 125, 125, 139, 125, 119)
x1 <- c(-1, 1, -1, 1, 0, 0, 0, -sqrt(2), 0, sqrt(2), 0)
x2 <- c(-1, -1, 1, 1, 0, 0, 0, 0, sqrt(2), 0, -sqrt(2))
rendim <- c(86, 85, 78, 84, 90, 88, 89, 81, 80, 86, 87)
tab.msr2 <- data.frame(conc, agit, x1, x2, rendim)
knitr::kable(tab.msr2, caption = "Dados de experimento de metodologia de superfície quadrática de resposta (Neto e cols, 2010).",
"pipe") # tabela| conc | agit | x1 | x2 | rendim |
|---|---|---|---|---|
| 30 | 115 | -1.000000 | -1.000000 | 86 |
| 40 | 115 | 1.000000 | -1.000000 | 85 |
| 30 | 135 | -1.000000 | 1.000000 | 78 |
| 40 | 135 | 1.000000 | 1.000000 | 84 |
| 35 | 125 | 0.000000 | 0.000000 | 90 |
| 35 | 125 | 0.000000 | 0.000000 | 88 |
| 35 | 125 | 0.000000 | 0.000000 | 89 |
| 28 | 125 | -1.414214 | 0.000000 | 81 |
| 35 | 139 | 0.000000 | 1.414214 | 80 |
| 42 | 125 | 1.414214 | 0.000000 | 86 |
| 35 | 119 | 0.000000 | -1.414214 | 87 |
\[\begin{equation} \begin{pmatrix} 1 & -1 & -1 & 1 & 1 & 1 \\ 1 & 1 & -1 & 1 & 1 & -1 \\ 1 & -1 & 1 & 1 & 1 & -1 \\ 1 & 1 & 1 & 1 & 1 & 1 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & 0 & 0 & 0 & 0 & 0 \\ 1 & -\sqrt(2) & 0 & 2 & 0 & 0 \\ 1 & 0 & \sqrt(2) & 0 & 2 & 0 \\ 1 & \sqrt(2) & 0 & 2 & 0 & 0 \\ 1 & 0 & -\sqrt(2) & 0 & 2 & 0 \\ \end{pmatrix} (\#eq:msr2) \end{equation}\]
# Criação da matriz de coeficientes de contraste para a superfície quadrática
X <- matrix(c(rep(1, 11), -1, 1, -1, 1, 0, 0, 0, -sqrt(2), 0, sqrt(2), 0, -1, -1,
1, 1, 0, 0, 0, 0, sqrt(2), 0, -sqrt(2), 1, 1, 1, 1, 0, 0, 0, 2, 0, 2, 0, 1, 1,
1, 1, 0, 0, 0, 0, 2, 0, 2, 1, -1, -1, 1, 0, 0, 0, 0, 0, 0, 0), nrow = 11, byrow = FALSE)
# Criação da matriz de rendimento
Y <- as.matrix(rendim)
# Determinação dos coeficientes beta:
beta <- solve(t(X) %*% X) %*% t(X) %*% Y
beta [,1]
[1,] 89.000000
[2,] 1.508883
[3,] -2.362437
[4,] -2.812500
[5,] -2.812500
[6,] 1.750000
R permite, por exemplo, a construção de um gráfico tridimensional que represente a função obtida, e sem a necessidade de pacote adicional: tal como segue:x <- seq(-1, 1, 0.1) # preditor x
y <- seq(-1, 1, 0.1) # preditor y
mrs <- function(x, y) {
89 + 1.51 * x - 2.36 * y - 2.81 * x^2 - 2.81 * y^2 + 1.75 * x * y
} # função aplicada aos preditores
z <- outer(x, y, mrs) # saída do gráfico 3D (resposta)
res <- persp(x, y, z, xlab = "x1", ylab = "x2", zlab = "z", shade = 0.4, theta = 30,
phi = 15, ticktype = "detailed") # plotagem de superfície da função z(x,y)
pontos <- trans3d(x1, x2, rendim, pmat = res) # comando para adição de pontos experimentais
points(pontos, pch = 19, col = 1) # adição dos pontos
R alguns pacotes para representação tridimensional de dados e funções (rgl, plot3D, scatterplot3d), como também para análise de planejamento fatorial (agricolae,afex,FMC), e de metodologia de superfície de resposta (rsm`).