Closed piklprado closed 2 months ago
## Codigo da resposta Jennifer
esa = read.csv("esaligna.csv")
biom1 = lm(total ~ I(dap^2*ht), data = esa)
beta0 = summary(biom1)$coefficients[1,1]
beta1 = summary(biom1)$coefficients[2,1]
sigma = summary(biom1)$sigma
neglogLik.biom1 = function(b0, b1, e){
m = b0+ b1*(esa$dap^2)*esa$ht
-sum(dnorm(esa$total, mean = m, sd = e, log = TRUE))
}
biom1.start = list(b0 = beta0, b1 = beta1, e = sigma)
biom1.mle = mle2(neglogLik.biom1, start = biom1.start)
comp.est = data.frame(classica = c(beta0, beta1, sigma), MLE = summary(biom1.mle)@coef[,1])
## Codigos do notaR
## Preparacao para os testes
require(bbmle)
esa.206<-read.csv("esaligna.csv")
biom1.206 = lm( total ~ I(dap^2*ht), data=esa.206)
neglogLik.biom1.206 <- function(b0, b1, sigma)
{
media = b0 + b1 * (esa.206$dap^2 * esa.206$ht)
-sum(dnorm(esa.206$total, mean=media, sd=sigma, log=TRUE))
}
cf.206 = unname(coef(biom1.206))
biom1.start.206 = list(b0=cf.206[1], b1=cf.206[2], sigma=summary(biom1.206)$sigma)
biom1.mle.206 <- mle2( neglogLik.biom1.206, start=biom1.start.206 )
est.lin.206 <- c(coef(biom1.206), summary(biom1.206)$sigma)
names(est.lin.206) <- c("b0","b1","sigma")
comp.est.206 <- data.frame(inf.classica=est.lin.206,inf.MLE=coef(biom1.mle.206))
## teste em que nao esta passando: no meu computador passa
all.equal(coef(biom1.mle),coef(biom1.mle.206), tolerance =1e-3, check.attributes=FALSE)
## Teste seguinte: tb passa no meu computador
all.equal(AIC(biom1.mle),AIC(biom1.mle.206), tolerance = 1e-3)
Rodei esses códigos no servidor e no meu local e de fato deu resultados diferentes.
No notar.ib.usp.br:
> coef(biom1.mle)
b0 b1 e
11.51744130 0.02637721 24.81041675
> coef(biom1.mle.206)
b0 b1 sigma
11.5174413 0.0263761 24.7625211
No meu local:
> coef(biom1.mle)
b0 b1 e
11.51744130 0.02637721 24.81041459
> coef(biom1.mle.206)
b0 b1 sigma
11.51744130 0.02637721 24.81041675
Vamos experimentar atualizar o servidor, pode ser alguma biblioteca de c que está desatualizada
A única diferença entre esses códigos está na ordem das operções no cálculo da média, onde a aluna fez a multiplicação como b1 * dap² * ht
e o código de comparação fez na ordem b1 * (dap² * ht)
. No servidor onde o notaR está hospedado, essa diferença na ordem de operações gera uma pequena diferença numérica que leva a essa pequena variação no cálculo de sigma. Em outros computadores, essa diferença não aparece.
Considerando que estamos comparando instalações indênticas, provavelmente a origem da discrepância está em algum elemento de hardware do servidor que leva a otimizações diferentes nos cálculos vetoriais. Minha recomendação é diminuir o grau de precisão na comparação entre os resultados.
O código da Jennifer para o exercício 206.1 não passava na condição 16 no servidor do notaR, devido a diferença nas últimas casas decimais. Mudei a condição para comparar resultados com menor precisão,e tb a dividi em duas condições. A primeira condição (16) ficou:
all.equal(coef(biom1.mle),coef(biom1.mle.206), tolerance =1e-3, check.attributes=FALSE)
Esta condição estava junto com a verificação do AIC neste objeto, mas separei na condição seguinte:
all.equal(AIC(biom1.mle),AIC(biom1.mle.206), tolerance = 1e-3)
Depois dessas mudanças, o código dela passa nos dois testes em minha máquina, mas segue não passando no primeiro teste, no servidor do notaR. Não cosnegui descobrir o que pode ser, nem se indica algum bug mais geral. Os códigos vão a seguir, e a tela do notaR é esta:
Informações da minha seção de R