<div dir="ltr">Obrigado Thiago e Éder!<div><br></div><div>Thiago, quanto as suas observações:</div><div>Nessa primeira situação exemplificada por vc, o R utilizaria o ARMi = ARM[i-1]+a$P.ETP.</div><div>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)?</div><div>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.</div><div>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</div><div> a$ARMi[1] = cad</div><div> a$ARMf[1] = cad</div><div> a$ALT[1] = 0)</div><div> Essa interpretação não está correta?</div><div><br></div><div>Éder, </div><div><br></div><div>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.</div><div>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().</div><div><br></div><div>Mais uma vez, agradeço a todos pelas ajudas e sugestões!</div><div><br></div><div>Abs</div><div class="gmail_extra"><br clear="all"><div><div><div dir="ltr"><div>Yury Duarte<br></div>Engenheiro Agrônomo - ESALQ/USP<br></div></div></div>
<br><div class="gmail_quote">Em 18 de maio de 2016 17:11, Thiago V. dos Santos <span dir="ltr"><<a href="mailto:thi_veloso@yahoo.com.br" target="_blank">thi_veloso@yahoo.com.br</a>></span> escreveu:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Obrigado por postar um exemplo 100% reprodutível junto da pergunta (incluindo os dados).<br>
<br>
Pelo que entendi, a lógica das condições está certa. O problema, contudo, parece ser que certas variáveis parece nunca serem calculadas.<br>
<br>
Vamos seguir a lógica do programa usando o primeiro valor de i, que é igual a 2.<br>
<br>
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.<br>
<br>
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.<br>
<br>
Aí começa o problema:<br>
<br>
a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i-1])<br>
<br>
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?<br>
<br>
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.<br>
<br>
Veja a segunda linha da primeira condição:<br>
<span><br>
a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))<br>
<br>
</span>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)?<br>
<br>
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.<br>
Greetings,<br>
-- Thiago V. dos Santos<br>
<br>
PhD student<br>
Land and Atmospheric Science<br>
University of Minnesota<br>
<span><br>
<br>
On Wednesday, May 18, 2016 1:43 PM, Yury Duarte <<a href="mailto:yurynepomuceno@gmail.com" target="_blank">yurynepomuceno@gmail.com</a>> wrote:<br>
<br>
<br>
<br>
Boa tarde colegas programadores, como vão?<br>
<br>
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.<br>
Tenho essas condições que deve ser obedecida para execução dos cálculos:<br>
</span> * Se P - ETP < 0:<br>
<span><br>
NAc = (P - ETP) + NAc[i-1]<br>
<br>
ARM = CAD * exp(NAc/CAD)<br>
</span> * Se P - ETP >= 0:ARM = (P - ETP) + ARM[i-1]<br>
<span>NAc = CAD * Ln(ARM/CAD)<br>
<br>
</span> * ARM <= CAD<br>
<div><div>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.<br>
Segue o script no corpo do email e os dados de entrada em anexo.<br>
Agradeço de antemão a ajuda de todos!<br>
<br>
Abs<br>
<br>
#----------Remover Objetos----------#<br>
rm(list = ls())<br>
<br>
#----------Selecionar arquivo de interesse----------#<br>
a = read.table("x.txt", sep = "\t", header = T); head(a)<br>
<br>
<br>
#----------Iniciar o BH----------#<br>
a$P.ETP = a$RAIN-a$ETP.Penman<br>
cad = 100<br>
a$NAc = NA<br>
a$ARMi = NA<br>
a$ARMf = NA<br>
a$ALT = NA<br>
a$ETR = NA<br>
a$DEF = NA<br>
a$EXC = NA<br>
head(a)<br>
<br>
a$NAc[1] = 0<br>
a$ARMi[1] = cad<br>
a$ARMf[1] = cad<br>
a$ALT[1] = 0<br>
<br>
for(i in 2:length(a[,1])){<br>
if(a$P.ETP[i]<0){<br>
(a$NAc[i] = a$P.ETP[i]+a$NAc[i-1])<br>
a$ARMi[i] = (cad*exp(-1*((abs(a$NAc[i]))/cad)))<br>
}else{<br>
a$ARMf[i] = ifelse(a$ARMi[i] > cad, cad, a$ARMi[i])<br>
a$ARMi[i] = a$ARMf[i-1]+a$P.ETP[i]<br>
a$NAc[i] = cad*log((a$ARMf[i])/cad)<br>
}<br>
<br>
a$ALT[i] = a$ARMf[i] - a$ARMf[i-1]<br>
a$ETR[i] = if(a$P.ETP[i]<0){a$RAIN[i]+abs(a$ALT[i])} else{a$ETP.Penman[i]}<br>
a$DEF[i] = a$ETP.Penman[i] - a$ETR[i]<br>
a$EXC[i] = a$ARMi[i] - a$ARMf[i]<br>
}<br>
<br>
View(a)<br>
<br>
<br>
Yury Duarte<br>
Engenheiro Agrônomo - ESALQ/USP<br>
<br>
</div></div>_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" rel="noreferrer" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" rel="noreferrer" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e forne� c�igo m�imo reproduz�el.<br>
_______________________________________________<br>
R-br mailing list<br>
<a href="mailto:R-br@listas.c3sl.ufpr.br" target="_blank">R-br@listas.c3sl.ufpr.br</a><br>
<a href="https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br" rel="noreferrer" target="_blank">https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br</a><br>
Leia o guia de postagem (<a href="http://www.leg.ufpr.br/r-br-guia" rel="noreferrer" target="_blank">http://www.leg.ufpr.br/r-br-guia</a>) e fornea cdigo mnimo reproduzvel.</blockquote></div><br></div></div>