Escrevendo suas próprias funções
Explorando funções para cálculo de Seguros
11 de outubro de 2024
Escrevendo suas próprias funções
Explorando funções para cálculo de Seguros
É muito simples escrever sua própria função no R.
Por exemplo, considere a seguinte função:
\[S = \sum_{i=1}^n \frac{p_i \cdot x_i}{(1+d_i)^i} \qquad \mbox{para } x_i \in \mathbb{R}; \,\, p_i \in [0,1]; \,\, d_i \in \mathbb{R}_{+} \]
# Exemplo - função personalizada f = function(x,p,d){ n = length(x) s = sum( p*x/(1+d)^(1:n) ) return(s) }
f
no console:f
## function(x,p,d){ ## n = length(x) ## s = sum( p*x/(1+d)^(1:n) ) ## return(s) ## }
f(x=c(100,200,100), p=c(.4,.5,.3), d=0.05)
## [1] 154.7133
f( c(100,200,100), c(.4,.5,.3), 0.05)
, sem o nome dos argumentos, vamos ter o mesmo resultado acima. O R assume que os argumentos estão na ordem em que foram definidos na função.f = function(x,p,d=0.05)
d
, e o R irá usar o valor default.Essas propriedades são similares para funções do R.
Por exemplo, a função qnorm()
computa quantis para a distribuição normal.
qnorm(.95) # quantil 95% para normal(0,1)
## [1] 1.644854
qnorm(.95, mean=1, sd=2) # quantil 95% para normal(1,4)
## [1] 4.289707
\[h(n) = \begin{cases} 2\,.h(n-1) + 1 & \mbox{se } n \geq 2 \\ 1 & \mbox{se } n=1 \end{cases} \]
h = function(n){ if(n<=1) return(1) else return(2*h(n-1)+1) } h(4)
## [1] 15
beta = 0 # criando uma variavel global slope = function(X,Y){ # criando a funcao 'slope' beta = coefficients(lm(Y~X))[2] # variavel local return(as.numeric(beta)) } attach(cars) slope(speed,dist) ## [1] 3.932409 beta # continua com o valor original ## [1] 0
cat()
para imprimir comentários ou valores:slope = function(X,Y){ beta = coefficients(lm(Y~X))[2] cat("A inclinação da reta é ",beta,"\n") return(as.numeric(beta)) } slope(speed,dist)
## A inclinação da reta é 3.932409
## [1] 3.932409
lifecontingencies
:# Funções para cálculo de seguros require(lifecontingencies) data("demoFrance")
# carregando a tabela de vida francesa alive = demoFrance$TV88_90 head(alive) # l_x
## [1] 100000 99352 99294 99261 99236 99214
death = -diff(alive) # d_x head(death)
## [1] 648 58 33 25 22 20
\[S(x) = \exp \left( -ax - \frac{b}{\log c} [c^x -1] \right) \qquad \forall x \geq 0 \] para alguns parâmetros \(a \geq 0\), \(b \geq 0\) e \(c > 1\).
# função de sobrevivência de Makeham sMakeham = function(x,a,b,c){ ifelse( x<0, 1, exp(-a*x-b/log(c)*(c^x-1)) ) }
# função de probabilidade para idades inteiras dMakeham = function(x,a,b,c){ ifelse( x>floor(x), 0, sMakeham(x,a,b,c)-sMakeham(x+1,a,b,c) ) }
\[S(x) - S(x+1) = P(T_0>x) - P(T_0>x+1) = P(x<T_0 \leq x+1) \]
Podemos usar essa função dMakeham
para estimar os parâmetros \(a\), \(b\) e \(c\) usando Máxima Verossimilhança.
(para isso, precisamos remover as mortes ao nascer, e as mortes acima de 105 anos, por restrições da lei de Makeham)
death = death[-c(1,107:111)] # removendo algumas idades ages = 1:(length(death)) # função da log verossimilhança loglikMakeham = function(abc){ # abc: vetor com paramêtros - sum( log( dMakeham(ages,abc[1],abc[2],abc[3]))*death[ages] ) }
optim()
para obter estimadores de máxima verossimilhança para os parâmetros da função de mortalidade de Makeham.# estimador de máxima verossimilhança mlEstim = optim( c(1e-5,1e-4,1.1), loglikMakeham) abcml = mlEstim$par abcml
## [1] 4.022473e-04 4.366993e-06 1.123549e+00
sum( (ages+.5)*death )/sum(death)
## [1] 81.19984
integrate( sMakeham, 0, Inf, abcml[1], abcml[2], abcml[3])
## 81.15647 with absolute error < 9.2e-05
Lidando com erros (Seção 1.3.4)
Funções eficientes (Seção 1.3.5)
Integração Numérica (Seção 1.3.6)