===== 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