lageIBUSP / notaR

Repositório para o código do notaR 4.0
2 stars 2 forks source link

Codigo passa no teste na máquina local mas não no servidor notaR na LAGE #89

Closed piklprado closed 2 months ago

piklprado commented 1 year ago

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:

image

Informações da minha seção de R

R version 4.2.2 (2022-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Arch Linux

Matrix products: default
BLAS:   /usr/lib/libblas.so.3.11.0
LAPACK: /usr/lib/liblapack.so.3.11.0

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats4    stats     graphics  grDevices utils     datasets  methods  
[8] base     

other attached packages:
[1] bbmle_1.0.25

loaded via a namespace (and not attached):
[1] MASS_7.3-58.1       compiler_4.2.2      Matrix_1.5-3       
[4] tools_4.2.2         mvtnorm_1.1-3       bdsmatrix_1.3-6    
[7] grid_4.2.2          numDeriv_2016.8-1.1 lattice_0.20-45 
piklprado commented 1 year 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)
Lobz commented 3 months ago

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 
Lobz commented 3 months ago

Vamos experimentar atualizar o servidor, pode ser alguma biblioteca de c que está desatualizada

Lobz commented 2 months ago

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.