===== Dia 4 =====
**Montando função de verossimilhança:** um exemplo para dados censurados
## Verossimilhança para o parâmetro de média da normal
## (assumindo variância conhecida igual a 16)
## i) Assumindo só ter observações completas
dat <- c(23, 24, 27, 20, 32, 26, 28)
## um primeira forma de escrever a função
f1 <- function(mu) {
sum(dnorm(dat, mean=mu, sd = 4, log=TRUE))
}
f1(25)
mu.vals <- seq(20, 32, length=100)
plot(mu.vals, sapply(mu.vals, f1), type="l")
## algumas opções no gráfico
plot(mu.vals, sapply(mu.vals, f1), type="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## agora mais geral colocando os dados como um argumento da função
## para permitir receber outros conjuntos de dados
f1 <- function(mu, dados) {
sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
}
f1(25, dados=dat)
plot(mu.vals, sapply(mu.vals, f1, dados=dat), type="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## agora vetorizando a função para permitir receber vários valores de mu
f1 <- function(par, dados) {
lVero <- function(mu) sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
sapply(par, lVero)
}
f1(25, dados = dat)
plot(mu.vals, f1(mu.vals, dados=dat), type="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## Estimador de MV de mu
## a) solução analitica
mean(dat)
abline(v=mean(dat), col=3, lwd=4) # ver o gráfico
## embora nao necessario até aqui, a solucao numerica pode ser obtida com:
mu.est1 <- optimize(f1,c(10,50), dados = dat, maximum=T)
mu.est1
abline(v=mu.est1$max) ## ver o gráfico
## Introduzindo agora as informações censuradas
f2 <- function(par, dados) {
sapply(par,
function(mu){
## obs sem censura
semC <- sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
## obs com censura a direita
Cdir <- sum(pnorm(c(30, 30), mean=mu, sd=4, low=F, log=TRUE))
logL <- semC + Cdir
return(logL)
}
)
}
## veja como mudou a curva
lines(mu.vals, f2(mu.vals, dados=dat), col=2)
mu.vals <- seq(20, 35, length=100)
## fazendo num novo gráfico
plot(mu.vals, f2(mu.vals, dados=dat), ty="l")
## agora escrevendo a função de forma mais geral com um argumento
## para receber os pontos de censura
f2 <- function(par, dados, cenD) {
sapply(par,
function(mu){
## obs sem censura
semC <- sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
## obs com censura a direita
Cdir <- sum(pnorm(cenD, mean=mu, sd=4, low=F, log=TRUE))
logL <- semC + Cdir
return(logL)
}
)
}
plot(mu.vals, f2(mu.vals, dados=dat, cenD=rep(30, 2)), ty="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## e a estimativa de MV é agora obtida somente por maximização numérica
mu.est2 <- optimize(f2,c(10,50), dados=dat, cenD=rep(30, 2), maximum=T)
mu.est2
abline(v=mu.est2$max)
## Agora definindo uma função geral que aceita diferentes tipos de censura
## (a direita, esquerda ou intervalar)
fcens <- function(par, dados=NULL, cenD=NULL, cenE=NULL, cenI=NULL) {
sapply(par,
function(mu){
## obs sem censura
if(is.null(dados)) lVero1 <- 0
else lVero1 <- sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
## obs com censura a direita
if(is.null(cenD)) lVero2 <- 0
else lVero2 <- sum(pnorm(cenD, mean=mu, sd=4, lower=F, log=TRUE))
## obs com censura a esquerda
if(is.null(cenE)) lVero3 <- 0
else lVero3 <- sum(pnorm(cenE, mean=mu, sd=4, log=TRUE))
## obs com censura intervalar
if(is.null(cenI)) lVero4 <- 0
else lVero4 <- sum(apply(cenI, 1,
function(int)
log(diff(pnorm(int, mean=mu, sd=4)))))
logL <- lVero1 + lVero2 + lVero3 + lVero4
return(ifelse(logL==0, NULL, logL))
}
)
}
plot(mu.vals, fcens(mu.vals, dados=dat, cenD=rep(30, 2),
cenI= cbind(rep(28, 3), rep(30,3))), ty="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## escrevendo a função com um único argumento para censura:
## censura deve estar em uma matrix com
## [-Inf, x] para censura a esquerda
## [x, Inf] para censura a direita
## [x1, x2] para censura intervalar
fcens <- function(par, dados=NULL, censurados=NULL) {
sapply(par,
function(mu){
## obs sem censura
if(is.null(dados)) lVero1 <- 0
else lVero0 <- sum(dnorm(dados, mean=mu, sd = 4, log=TRUE))
## obs com censura a direita
if(is.null(censurados)) lVero1 <- 0
else lVero1 <- sum(apply(censurados, 1,
function(xc)
log(diff(pnorm(xc, mean=mu, sd=4)))))
logL <- lVero0 + lVero1
return(ifelse(logL==0, NULL, logL))
}
)
}
## note que o gráfico não se altera
lines(mu.vals, fcens(mu.vals, dados=dat, cen = censMat), col=2)
plot(mu.vals, fcens(mu.vals, dados=dat, cen = censMat), ty="l", xlab=expression(mu),
ylab=expression(l(mu)), main=expression(paste("log-verossimilhança de ", mu)))
## No exemplo
censMat <- rbind(c(30, Inf), c(28, 30))
censMat
## aora replicando as censuras (duas do primeiro tipo de 3 do segundo)
censMat <- censMat[c(rep(1, 2), rep(2, 3)),]
censMat
## e a estimativa de MV por maximização numérica pode ser obtida como antes
mu.est3 <- optimize(fcens,c(10,50), dados=dat, censurados=censMat, maximum=T)
mu.est3
abline(v=mu.est3$max)
## as 3 estimativas obtidas foram portanto
c(mu.est1$max, mu.est2$max, mu.est3$max)
**Exemplo de simulação: ** teste aleatorizado para comparação de médias de duas amostras
## Exemplo do teste-t
mandibulas <- data.frame(
femeas = c(120, 107, 110, 116, 114, 111, 113, 117, 114, 112),
machos = c(110, 111, 107, 108, 110, 105, 107, 106, 111, 111)
)
with(mandibulas, t.test(femeas, machos))
## uma alternativa ao teste t: teste aleatorizado
## jutando todos os dados (sob H0)
todos <- unlist(mandibulas)
## inicialmente mostrando uma forma não eficiente de fazer (for() deve ser evitado)
Nsim <- 999
dm <- numeric(Nsim)
for(i in 1:Nsim){
st <- sample(todos)
dm[i] <- mean(st[1:10]) - mean(st[11:20])
}
## outra forma
dm <- replicate(Nsim, function(dados){
st <- sample(dados)
return(mean(st[1:10]) - mean(st[11:20]))})
hist(dm, prob=T)
lines(density(dm))
rug(dm)
## acrescentando a diferença real ao gráfico das simuladas
dreal <- with(mandibulas, mean(machos) - mean(femeas))
dreal
abline(v=dreal, col=2)
## p-valor estimado (pelas simulações)
pvalor <- sum(dm < dreal)/(Nsim+1) ## p/ teste unilateral
pvalor
2* pvalor # p/ teste bilateral