View in NBViewer Open in binder Download notebook View source


4.3. Modelos redutíveis ao caso linear nos parâmetros e aplicações

using CSV
using Dates
using Plots
using Unitful
using UnitfulRecipes

Modelo exponencial

\[ \ln y = \ln \beta_0 e^{\beta_1 x} = \ln \beta_0 + \ln e^{\beta_1 x} = \ln\beta_0 + \beta_1 x. \] \[ \eta = \ln y, \qquad \tilde\beta_0 = \ln\beta_0, \]

obtemos o modelo linear nos parâmetros

\[ \eta = \tilde\beta_0 + \beta_1 x. \] \[ (x_i, \eta_i) = (x_i, \ln y_i). \]

Modelo de potência

\[ \ln y = \ln \beta_0 x^{\beta_1} = \ln\beta_0 + \ln x^{\beta_1} = \ln\beta_0 + \ln e^{\beta_1 \ln x} = \ln\beta_0 + \beta_1 \ln x. \] \[ \eta = \ln y, \quad \xi = \ln x, \quad \tilde\beta_0 = \ln\beta_0, \]

chegamos no modelo

\[ \eta = \tilde\beta_0 + \beta_1 \xi_i \] \[ (\xi_i, \eta_i) = (\ln x_i, \ln y_i). \]

Modelo racional

\[ \frac{1}{y} = \frac{\beta_1 + x}{\beta_0 x} = \frac{\beta_1}{\beta_0 x} + \frac{1}{\beta_0}. \] \[ \eta = \frac{1}{y}, \quad \xi = \frac{1}{x}, \quad \tilde\beta_0 = \frac{1}{\beta_0}, \quad \tilde\beta_1 = \frac{\beta_1}{\beta_0}. \] \[ \eta = \tilde\beta_0 + \tilde\beta_1 \xi. \] \[ (\xi_i, \eta_i) = \left(\frac{1}{x_i}, \frac{1}{y_i}\right). \]

A tilápia do Nilo

Dados

T. S. de Castro Silva, L. D. dos Santos, L. C. R. da Silva, M. Michelato, V. R. B. Furuya, W. M. Furuya, Length-weight relationship and prediction equations of body composition for growing-finishing cage-farmed Nile tilapia, R. Bras. Zootec. vol.44 no.4 Viçosa Apr. 2015):

Days of culture120406080100
Massa (g)28.6±4.288.6±1.4177.6±3.6313.8±12.8423.7±12.7774.4±23.6
Comprimento (cm)10.9±0.415.3±0.419.1±0.222.8±0.526.3±0.631.3±0.4

Alometria tilápia-do-Nilo

Modelo para o ajuste

Construção dos dados

comprimentos = [10.9, 15.3, 19.1, 22.8, 26.3, 31.3]u"cm"
massas = [28.6, 88.6, 177.6, 313.8, 423.7, 774.4]u"g"
@show comprimentos'
@show massas'
nothing
comprimentos' = Unitful.Quantity{Float64, 𝐋, Unitful.FreeUnits{(cm,), 𝐋, no
thing}}[10.9 cm 15.3 cm 19.1 cm 22.8 cm 26.3 cm 31.3 cm]
massas' = Unitful.Quantity{Float64, 𝐌, Unitful.FreeUnits{(g,), 𝐌, nothing}}
[28.6 g 88.6 g 177.6 g 313.8 g 423.7 g 774.4 g]
\[ x=\frac{\text{comprimento em } \texttt{cm}}{1\,\texttt{cm}}, \qquad y = \frac{\text{massa em } \texttt{g}}{1\,\texttt{g}} \]

Adimensionalização

x = comprimentos/u"cm"
y = massas/u"g"
@show x'
@show y'
nothing
x' = [10.9 15.3 19.1 22.8 26.3 31.3]
y' = [28.6 88.6 177.6 313.8 423.7 774.4]

Mudança de variáveis

ξ = log.(x)
6-element Vector{Float64}:
 2.388762789235098
 2.72785282839839
 2.9496883350525844
 3.126760535960395
 3.269568939183719
 3.4436180975461075
η = log.(y)
6-element Vector{Float64}:
 3.353406717825807
 4.484131857611035
 5.17953383055807
 5.748755840298932
 6.049025657632513
 6.652088535962367

Ajuste

A = [ones(length(ξ)) ξ]
6×2 Matrix{Float64}:
 1.0  2.38876
 1.0  2.72785
 1.0  2.94969
 1.0  3.12676
 1.0  3.26957
 1.0  3.44362
β̃ = A\η
2-element Vector{Float64}:
 -3.9870885208722124
  3.093303670320135
β₀, β₁ = exp(β̃[1]), β̃[2]
(0.018553654135861745, 3.093303670320135)

Visualização do ajuste

plot(ξ, η, seriestype = :scatter, xlims=(2,4), ylims=(0,7), xticks=2:0.5:4,
    xaxis = "logaritmo do (comprimento em cm)/cm", yaxis="logaritmo da (massa em g)/g",
    label="dados", title="Dados e ajuste do modelo de potência em escalas logarítmicas", 
    titlefont=12, legend=:topleft)
plot!([(2, β̃[1] + β̃[2]*2), (4,β̃[1] + β̃[2]*4)], label="modelo ajustado")
plot(x, y, seriestype = :scatter, xlims=(10,32), ylims=(0,800), xticks=10:2:32,
    xaxis = "comprimento/cm", yaxis="massa/g",
    label="dados", title="Dados e ajuste do modelo de potência", 
    titlefont=12, legend=:topleft)
plot!(10:32, β₀*(10:32).^β₁, label="modelo ajustado")

Dimensões

\[ \textrm{massa} = y \;\texttt{g} = \beta_0 x^{\beta_1} \;\texttt{g} = \beta_0 \left(x \texttt{cm}\right)^{\beta_1} \;\texttt{g}\;\texttt{cm}^{-\beta_1} = \beta_0 \left(\mathrm{comprimento}\right)^{\beta_1} \;\texttt{g}\;\texttt{cm}^{-\beta_1} = a \left(\mathrm{comprimento}\right)^p, \]

onde

\[ p = \beta_1, \quad a = \beta_0\;\texttt{g}\;\texttt{cm}^{-\beta_1} \]

Visualização com variáveis dimensionais

p = β₁
a = β₀ * u"g" / u"cm"^p
modelos(l) = a * l^p
modelos (generic function with 1 method)
plot(comprimentos, massas, seriestype = :scatter, xlims=(10,32), ylims=(0,800), xticks=10:2:32,
    xaxis = "comprimento", yaxis="massa",
    label="dados", title="Dados e ajuste do modelo de potência", 
    titlefont=12, legend=:topleft)
plot!((10:32)u"cm", modelos, label="modelo ajustado")

Decaimento radioativo do Plutônio-241

\[ \frac{\text{d} x}{\text{d} t} = - \lambda x. \] \[ Ce^{-\lambda \tau_{1/2}} = \frac{C}{2} \quad \Longleftrightarrow \quad \tau_{1/2} = \frac{\ln(2)}{\lambda}. \]

R. Wellum, A. Verbruggen e R. Kessel, "A new evaluation of the half-life of \({}^{241}\texttt{Pu}\)", J. Anal. At. Spectrom. 24 (2009), 801–807.

\[ r = \frac{\frac{\displaystyle n({}^{241}\texttt{Pu})}{\displaystyle n({}^{240}\texttt{Pu})}}{\frac{\displaystyle n({}^{240}\texttt{Pu})}{\displaystyle n({}^{239}\texttt{Pu})}}, \] \[ \ln r = \ln\left(\frac{\frac{x_{241}}{x_{240}}}{\frac{x_{240}}{x_{239}}}\right) = \ln x_{241} + \ln x_{239} - 2\ln x_{240} \]

e

\[\frac{\text{d} \ln r}{\text{d} t} = \frac{\dot r}{r} = p, \qquad \frac{\text{d} \ln x_k}{\text{d} t} = \frac{\dot x_k}{x_k} = \lambda_k \] \[ p = \lambda_{241} + \lambda_{239} - 2\lambda_{240}. \]
println(readdir())
["0401-Minimos_quadrados_ajuste.md", "0402-Exemplos_ajuste_linear.md", "040
3-Minimos_quadrados_nao_linear.md", "0403-Modelos_redutiveis_linear_aplicac
oes.md", "0404-Exemplos_ajuste_naolinear.md", "0404-Minimos_quadrados_nao_l
inear.md", "0405-Ajuste_em_redes_neurais.md", "0405-Exemplos_ajuste_naoline
ar.md", "0406-Ajuste_em_redes_neurais.md", "0406-Redes_neurais.md", "0407-A
juste_em_redes_neurais.md", "images"]
println(readlines("../../../_assets/attachments/data/decaimento_plutonio241.csv"))
["Data(ano/mês/dia),Fração das frações", "1976-01-13,6.5066", "1976-01-19,6
.4965", "1976-09-27,6.2857", "1976-10-04,6.282", "1977-03-08,6.1526", "1977
-03-22,6.1435", "1977-11-23,5.9406", "1978-12-05,5.6599", "1981-06-02,5.013
3", "1993-12-13,2.7387", "1994-08-25,2.6498", "1996-10-28,2.38517", "2006-1
1-13,1.47161"]
for (i,l) in enumerate(eachline("../../../_assets/attachments/data/decaimento_plutonio241.csv"))
    a, b = split(l, ',')
    if i == 1
        println("$a\t$b")
    else
        println("$a\t\t$(parse(Float64, b))")
    end
end
Data(ano/mês/dia)	Fração das frações
1976-01-13		6.5066
1976-01-19		6.4965
1976-09-27		6.2857
1976-10-04		6.282
1977-03-08		6.1526
1977-03-22		6.1435
1977-11-23		5.9406
1978-12-05		5.6599
1981-06-02		5.0133
1993-12-13		2.7387
1994-08-25		2.6498
1996-10-28		2.38517
2006-11-13		1.47161
csv_data = CSV.File("../../../_assets/attachments/data/decaimento_plutonio241.csv")
13-element CSV.File:
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1976-01-13"), Fração das frações
 = 6.5066)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1976-01-19"), Fração das frações
 = 6.4965)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1976-09-27"), Fração das frações
 = 6.2857)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1976-10-04"), Fração das frações
 = 6.282)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1977-03-08"), Fração das frações
 = 6.1526)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1977-03-22"), Fração das frações
 = 6.1435)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1977-11-23"), Fração das frações
 = 5.9406)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1978-12-05"), Fração das frações
 = 5.6599)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1981-06-02"), Fração das frações
 = 5.0133)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1993-12-13"), Fração das frações
 = 2.7387)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1994-08-25"), Fração das frações
 = 2.6498)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("1996-10-28"), Fração das frações
 = 2.38517)
 CSV.Row: (Data(ano/mês/dia) = Dates.Date("2006-11-13"), Fração das frações
 = 1.47161)
data = [csv_data[j][1] for j in 1:length(csv_data)]
13-element Vector{Dates.Date}:
 1976-01-13
 1976-01-19
 1976-09-27
 1976-10-04
 1977-03-08
 1977-03-22
 1977-11-23
 1978-12-05
 1981-06-02
 1993-12-13
 1994-08-25
 1996-10-28
 2006-11-13
r = [csv_data[j][2] for j in 1:length(csv_data)]
13-element Vector{Float64}:
 6.5066
 6.4965
 6.2857
 6.282
 6.1526
 6.1435
 5.9406
 5.6599
 5.0133
 2.7387
 2.6498
 2.38517
 1.47161
plot(data, r, seriestype = :scatter, xlims=(data[1]-Dates.Year(1), data[end]+Dates.Year(1)), ylims=(0,7), xticks=data,
    xaxis = "Data (ano/mês/dia)", yaxis="fração das frações", xrotation=45,
    label="dados", title="Dados amostrais da fração das frações de isótopos de Plutônio", 
    titlefont=12, legend=:topright)
t = (Dates.date2epochdays.(data) .- Dates.date2epochdays(data[1]) .+ 1)./365.25
13-element Vector{Float64}:
  0.0027378507871321013
  0.019164955509924708
  0.7091033538672142
  0.7282683093771389
  1.1526351813826146
  1.1909650924024642
  1.864476386036961
  2.8966461327857633
  5.388090349075975
 17.919233401779604
 18.61738535249829
 20.79397672826831
 30.836413415468858
plot(t, r, seriestype = :scatter, xlims=(t[1], t[end]+1), ylims=(1,7), xticks=t,
    xaxis = ("log(anos decorridos)", :log10), yaxis=("log(fração das frações)", :log10), xrotation=45,
    label="dados", title="Dados amostrais da fração das frações de isótopos de Plutônio", 
    titlefont=12, legend=:topright)

Ajuste

ρ = log.(r)
A = [ones(length(t)) t]
13×2 Matrix{Float64}:
 1.0   0.00273785
 1.0   0.019165
 1.0   0.709103
 1.0   0.728268
 1.0   1.15264
 1.0   1.19097
 1.0   1.86448
 1.0   2.89665
 1.0   5.38809
 1.0  17.9192
 1.0  18.6174
 1.0  20.794
 1.0  30.8364
β̃ = A\ρ
C = exp(β̃[1])
p = -β̃[2]
@show C, p
nothing
(C, p) = (6.504114523362512, 0.048222454056244105)
plot(t, r, seriestype = :scatter, xlims=(t[1], t[end]+1), ylims=(1,7), xticks=t,
    xaxis = ("log(dias decorridos)", :log10), yaxis=("log(fração das frações)", :log10), xrotation=45,
    label="dados", title="Dados amostrais da fração das frações de isótopos de Plutônio", 
    titlefont=12, legend=:bottomleft)
tt = t[1]:1:t[end]
plot!(tt, C*exp.(-p*tt), xaxis=:log10, yaxis=:log10, label="modelo ajustado")
plot(t, r, seriestype = :scatter, xlims=(t[1], t[end]+1), ylims=(1,7),
    xaxis = "anos decorridos", yaxis="fração das frações", xrotation=45,
    label="dados", title="Dados amostrais e modelo da fração das frações", 
    titlefont=12, legend=:topright)
tt = t[1]:1:t[end]+1
plot!(tt, C*exp.(-p*tt), label="modelo ajustado")

Meia-vida do Plutônio-241

\[ \tau_{1/2}({}^{241}\texttt{Pu}) \approx 14.32 \text{ anos.} \]
λ_239 = log(2)/24110
λ_240 = log(2)/6563
λ = p +2λ_240 - λ_239
τ_meia = log(2)/λ
14.319763113242617

Exercícios

  1. Transforme o modelo \(y = \frac{\beta_0}{\beta_1 + x}\) em uma expressão que seja linear nos parâmetros.

  2. O modelo bidimensional \(z=\beta_0 x^{\beta_1} y^{\beta_2}\) pode ser transformado em uma expressão linear do tipo \(\zeta = \tilde\beta_0 + \tilde\beta_1\xi + \tilde\beta_2 \eta\), para variáveis e parâmetros apropriados. Use isso para ajustar os parâmetros \(\beta_0\), \(\beta_1\), \(\beta_2\) para que o modelo original em \(z\) melhor aproxime os dados da seguinte tabela.

xyz
110.82
121.72
132.85
211.01
222.44
233.95
311.38
323.07
334.86
  1. Em certos processos químicos ou bioquímicos envolvendo catalisadores ou enzimas, da forma \(E + S \rightleftharpoons ES \rightarrow E + P\), a taxa \(\nu\) de reação da concentração \(S\) de um reagente (substrato) é comumente modelada pela relação (modelo de Michaelis-Menten)

\[ \nu = \frac{\displaystyle \nu_m S}{\displaystyle K_M + S}, \]

onde \(\nu_m>0\) é a a taxa máxima de reação (associada a uma concentração muito alta do substrato) e \(K_M>0\) é um parâmetro de (semi)saturação. Usando os dados do arquivo dados/reacao_enzimatica_figado_porco.csv, da ação de uma enzima presente no fígado de porcos, faça um ajuste aos dados com a curva do tipo acima, encontrando valores para \(\nu_m\) e \(K_M\).

  1. O arquivo dados/evolucao_isotopos_plutonio.csv contém uma outra tabela com a evolução das frações de alguns isótopos de Plutônio 241. Use esses dados para fazer o ajuste exponencial e calcular a meia-vida do isótopo 241.