[R-br] Script com for() e if {} else{}

Yury Duarte yurynepomuceno em gmail.com
Quinta Maio 19 12:16:00 BRT 2016


Obrigado Thiago e Éder!

Thiago, quanto as suas observações:
Nessa primeira situação exemplificada por vc, o R utilizaria o ARMi =
ARM[i-1]+a$P.ETP.
Como foi definido que o primeiro valore de ARMi e ARMf seriam iguais a cad,
não seria correto o R utilizar o valor de cad (100) e somar o valor de
P.ETP (8,99)?
O mesmo ocorre na situação que você mencionou do NAc, onde seu primeiro
valor foi discriminado como sendo 0 para a primeira linha do data.frame.
Como o for() se inicia apenas para a segunda linha, imaginei que quando o R
começasse a correr, os primeiros valores de [i-1] seriam os valores que
foram atribuídos imediatamente antes de iniciar o for() (a$NAc[1] = 0
                                     a$ARMi[1] = cad
                                     a$ARMf[1] = cad
                                     a$ALT[1] = 0)
 Essa interpretação não está correta?

Éder,

agradeço pela reorganização do código, acabei de roda-lo e os valores
parecem estar corretos. Irei compara-los com uns cálculos que tinha feito à
mão para conferir os outputs desse script.
Acho que o fato de não ter considerado o ARMf dentro da primeira condição
do if() else() pode ter sido uma das fontes de erro no código que colei
aqui na lista. Vou comparar melhor os dois códigos. Ainda preciso melhorar
minhas skills no comando for().

Mais uma vez, agradeço a todos pelas ajudas e sugestões!

Abs

Yury Duarte
Engenheiro Agrônomo - ESALQ/USP

Em 18 de maio de 2016 17:11, Thiago V. dos Santos <thi_veloso em yahoo.com.br>
escreveu:

> Obrigado por postar um exemplo 100% reprodutível junto da pergunta
> (incluindo os dados).
>
> Pelo que entendi, a lógica das condições está certa. O problema, contudo,
> parece ser que certas variáveis parece nunca serem calculadas.
>
> Vamos seguir a lógica do programa usando o primeiro valor de i, que é
> igual a 2.
>
> Primeiro, o R vai avaliar se P.ETP é menor do que zero. Essa condição NÃO
> é verdadeira, pois ele vale 8.99, portanto o R pula o "core" desse if e vai
> para o else.
>
> O else implica que P.ETP é maior ou igual a zero, o que é verdade para a
> segunda linha dos dados (lembre-se do 8.99). Sendo assim, o R entra no
> "core" do else.
>
> Aí começa o problema:
>
> a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i-1])
>
> No código acima, você está pedindo para o R comparar o valor de ARMi com o
> valor de cad, mas o problema é que ARMi nessa linha é um NA, e portanto
> essa comparação sempre resulta em NA. Sendo assim, ARMf não será calculado
> e nem ARMi e NAc, que dependem de ARMf. Talvez você quisesse comparar o
> ARMi da linha anterior?
>
> Agora vamos avançar para a linha 5 dos dados, onde E.ETP é negativo e
> portanto o R entra no core da primeira condição.
>
> Veja a segunda linha da primeira condição:
>
> a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))
>
> No código acima, você pede para o R determinar o valor de ARMi usando o
> valor de NAc (que é sempre NA porque nunca foi calculado - veja o erro da
> primeira condição). Portanto, a resposta da exponencial também será NA.
> Talvez você quisesse pegar NAc da linha anterior (i-1)?
>
> A lógica do programa está certa, mas ele sempre calcula variáveis a partir
> de outras variáveis que são NA por razões diversas.
> Greetings,
>  -- Thiago V. dos Santos
>
> PhD student
> Land and Atmospheric Science
> University of Minnesota
>
>
> On Wednesday, May 18, 2016 1:43 PM, Yury Duarte <yurynepomuceno em gmail.com>
> wrote:
>
>
>
> Boa tarde colegas programadores, como vão?
>
> Estou tendo alguma dificuldade em acertar o script para executar o calculo
> do balanço hídrico de Thornthwaite & Mather, mas para uma escala diária.
> Tenho essas condições que deve ser obedecida para execução dos cálculos:
>     * Se P - ETP < 0:
>
> NAc = (P - ETP) + NAc[i-1]
>
> ARM = CAD * exp(NAc/CAD)
>     * Se P - ETP >= 0:ARM = (P - ETP) + ARM[i-1]
> NAc = CAD * Ln(ARM/CAD)
>
>     * ARM <= CAD
> Utilizei o comando for e o if else para estabelecer as condições e
> calcular cada variável para cada dia do período analisado. Entretanto, o
> script não está calculando as variáveis e retorna os vetores vazios.
> Segue o script no corpo do email e os dados de entrada em anexo.
> Agradeço de antemão a ajuda de todos!
>
> Abs
>
> #----------Remover Objetos----------#
> rm(list = ls())
>
> #----------Selecionar arquivo de interesse----------#
> a = read.table("x.txt", sep = "\t", header = T); head(a)
>
>
> #----------Iniciar o BH----------#
> a$P.ETP = a$RAIN-a$ETP.Penman
> cad = 100
> a$NAc = NA
> a$ARMi = NA
> a$ARMf = NA
> a$ALT = NA
> a$ETR = NA
> a$DEF = NA
> a$EXC = NA
> head(a)
>
> a$NAc[1] = 0
> a$ARMi[1] = cad
> a$ARMf[1] = cad
> a$ALT[1] = 0
>
> for(i in 2:length(a[,1])){
>       if(a$P.ETP[i]<0){
>         (a$NAc[i] = a$P.ETP[i]+a$NAc[i-1])
>         a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))
>     }else{
>       a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i])
>       a$ARMi[i] = a$ARMf[i-1]+a$P.ETP[i]
>       a$NAc[i] = cad*log((a$ARMf[i])/cad)
>     }
>
>   a$ALT[i] = a$ARMf[i] - a$ARMf[i-1]
>   a$ETR[i] = if(a$P.ETP[i]<0){a$RAIN[i]+abs(a$ALT[i])}
> else{a$ETP.Penman[i]}
>   a$DEF[i] = a$ETP.Penman[i] - a$ETR[i]
>   a$EXC[i] = a$ARMi[i] - a$ARMf[i]
>   }
>
> View(a)
>
>
> Yury Duarte
> Engenheiro Agrônomo - ESALQ/USP
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forne� c�igo
> m�imo reproduz�el.
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e fornea cdigo
> mnimo reproduzvel.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20160519/b3a639d5/attachment.html>


Mais detalhes sobre a lista de discussão R-br