Foro de debate

Resolver fórmulas con R

Resolver fórmulas con R

de Mónica Mir Florit -
Número de respuestas: 11

Hola,

Estoy aprendiendo a usar el programa R y me ha surgido un problema. Quiero resolver una serie de fórmulas donde hay constantes y variables. Yo se resolver la fórmula fácilmente con el programa, el problema me surge cuando quiero cambiar el valor de las variables sin tener que reescribir toda la fórmula. Además, son varias fórmulas donde el resultado de unas sirve para resolver otras. Es decir, quiero saber si es posible hacer servir el programa de una manera similar que con el excel, que cambiando un valor, directamente se cambian los resultados de todas las formulas relacionadas con ese valor.

¿Alguien sabe cómo hacerlo?

¡Muchísimas gracias!

En respuesta a Mónica Mir Florit

Re: Resolver fórmulas con R

de David Elías -
Si mostras la fórmula, te puedo ayudar con más presición.

Mientras tanto... Cuando vos creas una funcion... Por ejemplo esta...

sumar2<- function( dato1)
{
  numero<- dato1 + 2
 return(numero)
}


Para usarla en R... después de cargar la función... vos harías...
sumar2(4)
Entonces al "4" le va a sumar "2" y te va a mostrar el resultado: 6.

Tu variable es "dato1", y tu constante es "2".
No tendrías que tener problema en poner otro dato1, y que te de el resultado.



En respuesta a David Elías

Re: Resolver fórmulas con R

de Mónica Mir Florit -
Muchas gracias David,

Si tengo estas fórmulas:

FORMULA !: x = y + z*k
("y" y "z" son variables i "k" es constante)

· Esta primera fórmula, con lo que me has explicado ya se como hacerlo. El problema es cuando luego tengo:

FORMULA 2: m = n - x
(en este caso, la "n" es una variable y la "x" es el resultado de la anterior fórmula. Se puede hacer que esta fórmula coja el valor de "x" de la anterior fórmula? Y cuando vaya cambiando las variables "y" y "z" también me vaya cambiando el resultado de "m" directamente?

He puesto este ejemplo simplificado, ya que realmente las fórmulas que utilizo son un poco más complejas, pero yo creo que si entiendo esto ya podré hacer las fórmulas reales sin problemas.

Muchas gracias!


En respuesta a Mónica Mir Florit

Re: Resolver fórmulas con R

de David Elías -
OK. Pero como es tu script?
Eso quiero ver... ¿Tenés un script hecho o no?
En respuesta a David Elías

Re: Resolver fórmulas con R

de Mónica Mir Florit -
A que te refieres? Quieres ver todas las formulas?
En respuesta a Mónica Mir Florit

Re: Resolver fórmulas con R

de David Elías -
Vos me dijiste esto:

FORMULA !: x = y + z*k
("y" y "z" son variables i "k" es constante)

esa fórmula en R se escribe de esta forma....
#####################################
ECUACION<- function(y,z,k)
{
x<- y + z*k
return(x)
}

Carga lo anterior en R... y luego prueba este ejemplo

ECUACION(2,3,4)
# El resultado debe darte 14.
####################################

Si vos querés ingresar muchos valores de "y" y que te devuelva muchos valores de "x", debes indicar que "y" es un vector, y hacer un ciclo for dentro de la fórmula.

ECUACION2<- function(y,z,k)
{
cantidad<- length(y)
x<- c(1:cantidad)

for (m in 1:cantidad)
{
x[m]<- y[m] + z*k
return(x)
}
}
######################################

Probas luego de cargar la funcion este ejemplo...
ECUACION2(c(2,5),3,4)

Da como resultado 14 y 25.

Si te fijas... el primer valor es un vector... c(2,5)... que son dos valores de Y, para que haga con cada uno de ellos el cálculo con tu fórmula.
#######################




En respuesta a David Elías

Re: Resolver fórmulas con R

de Mónica Mir Florit -
Sí, esto lo tengo claro. Lo que quiero es utilizar resultados de las equaciones como valores para otras sin tener que escribir el numero. Mis equaciones son estas:

· S = 20*(1+kdt*SRT)/(SRT*(umt-kdt)-1)

donde las variables son: kdt=0.08, SRT=12.71, umt=3.49

y el resultado es S= 0.9526441

· Pxbh = Q*0.4*(bCOD-S)/(1+kdt*SRT)

donde las variables son: Q=22464, bCOD=224, S= 0.9526441(resultado anterior), kdt=0.08, SRT=12.71/p>

· Pxdead = 0.15*kdt*Q*0.4*(bCOD-S)*SRT/(1+kdt*SRT)

donde las variables son: kdt=0.08, Q=22464, bCOD=224, S=0.9526441, SRT=12.71

· Pxbio1=Pxbh+Pxdead+Pxbnit1

donde Pxbh y Pxdead son el resultado de las anteriores equaciones

Y así succesivamente...

Lo que quiero es saber si puedo hacer que el programa coja directamente los resultados de las equaciones para las próximas equaciones sin que yo tenga que ponerle el valor.

Gracias!

En respuesta a Mónica Mir Florit

Re: Resolver fórmulas con R

de Andrés Necochea -
Pero tal como te ha dicho David pues, algo como esto:

resultados <- function(kdt, SRT, umt, Q, bCOD)
{
  S <- 20*(1+kdt*SRT)/(SRT*(umt-kdt)-1)
 Pxbh <- Q*0.4*(bCOD-S)/(1+kdt*SRT)
 Pxdead <- 0.15*kdt*Q*0.4*(bCOD-S)*SRT/(1+kdt*SRT)
 Pxbio1<-Pxbh+Pxdead+Pxbnit1
 res <- c(S, Pxbh, Pxdead, Pxbio1)
 names(res) <- c("S", "Pxbh", "Pxdead", "Pxbio1")
 return(res)
}

existen formas más elegantes de imprimir el resultado, pero esto debería servirte.

Hay que señalar que debes llamar a tu función de la siguiente manera:
datos <- resultados(0.08, 12.71, 3.49, 22464, 224)

Y puedes obtener un resultado específico de la siguiente manera: datos$S o datos$Pxbh, etc

Lo mejor es guardar esto en un script, o sea, un archivo de texto plano (tipo block de notas) y lo cargas cuando necesites con la función source()

Aquí hay una explicación más detallada:
http://cran.r-project.org/doc/contrib/Lemon-kickstart/kr_scrpt.html

espero te sirva la explicación.

PD: Parece que falta definir la variable Pxbnit1.
En respuesta a Andrés Necochea

Re: Resolver fórmulas con R

de David Elías -

Hola,

Estoy aprendiendo a usar el programa R y me ha surgido un problema. Quiero resolver una serie de fórmulas donde hay constantes y variables. Yo se resolver la fórmula fácilmente con el programa, el problema me surge cuando quiero cambiar el valor de las variables sin tener que reescribir toda la fórmula.
Para no tener que escribir toda la fórmula, vas a tener que escribir las ecuaciones que vos tenés como funciones, como los ejemplos que te di. No hay otra forma. Te combiene también, ya que de esa forma podés poner varios números para que calcule el resultado.


 Además, son varias fórmulas donde el resultado de unas sirve para resolver otras. Es decir, quiero saber si es posible hacer servir el programa de una manera similar que con el excel, que cambiando un valor, directamente se cambian los resultados de todas las formulas relacionadas con ese valor.
Esto lo podés hacer agregando dentro de la función un parte que utilice la función "save" y la funcion "load". De esta forma, cada función va a guardar los resultados que haga, y la siguiente función los cargará como dato.

vamos con un ejemplo de una de tus funciones

FORMULA 1:  x = y + z*k
("y" y "z" son variables i "k" es constante)

#esa fórmula en R se escribe de esta forma....
####### COMIENZO FORMULA 1##############################
ECUACION1<- function(y,z,k)
{
cantidad<- length(y)   #Es la cantidad de elementos que querés calcular.

x<- c(1:cantidad)    # Es el objeto sobre el cual cargaremos las resultados de la ecuacion 1.

for (m in 1:cantidad)
      {
x[m]<- y[m] + z*k              # Le indico como debe realizar las operaciones, y donde guardar el resultado dentro del objeto "x".
      }

save(x, file="x.RData")           # Guarda el objeto "x" en el directorio donde estas trabajando, con el                                                                nombre "x.RData.
return(x)                               # Me muestra el objeto x.
}

########################  FIN FUNCION 1 ###########################

COMENTARIO TUYO SOBRE LA SEGUNDA ECUACION

FORMULA 2: m = n - x
(en este caso, la "n" es una variable y la "x" es el resultado de la anterior fórmula. Se puede hacer que esta fórmula coja el valor de "x" de la anterior fórmula? Y cuando vaya cambiando las variables "y" y "z" también me vaya cambiando el resultado de "m" directamente?


Con esta ideas, entonces armamos la segunda ecuacion, donde vamos a agregar un "load" para que cargue los valores de "x" que ya están guardados, así no los tenés que cargar.


##################### INICIO FURMULA 2###########################

ECUACION2<- function (m,n,x)
{
cantidad2<- length(x)

n<- c(1:cantidad2)

for (h in 1:cantidad2)

{
m[h]<- n[h] - x[h]
}

save(m, file="m.RData")

return(m)
}

################ FIN FUNCION 2 #############################


Una vez que tengas cargadas las funciones, las usas sin problema. 

> ECUACION1( c(2, 4), 3, 4)

[1] 14 16

> ECUACION2(c(3,2), c(2,5), x)

[1] -13 -14


Ya que estamos, por las dudas hago una explicación más...

ECUACION1(y,k,z)
ECUACION1(c(2, 4), 3, 4)

En este caso, y es un vector que tiene 2 numeros, el 2 y el 4, entonces, la ECUACION1 va a resolver para 2, y después para 4.
El valor de k es 3, y el valor de z es 4.

ECUACION(m,n,x)
ECUACION2(c(3,2), c(2,5), x)

En este caso, m vale 3 para el primer valor de x, y 2 para el segundo valor de x.
Acá vas a tener que tener cuidado en recordar cuantos valores de x usaste antes.

Últimas cosas para decirte....
1) Como usamos las funciones "save", vos podés usar "load" fuera de la funcion y el objeto se carga. Por ejemplo, si usaste la primer funcion, le hiciste save a los valores de "x", y te olvidaste que valores usaste o cuantos eran. Entonces... hacés...
              load("x.RData)
Y el objeto "x" ya está disponible para que lo llames haciendo:
> x 

2) Si vos querés encadenar más funciones.... toda función debe comenzar con "load" y terminar con "save". Excepto la primera (que no tendra "load", por que es la primera)... y depende de vos la última (si te interesa o no guardar los cálculos de la última función podrá tener o no un "save", pero si o si un "load" al comienzo.

3) Debés tener cuidado... por ejemplo en la función 2.... Por cada valor de "x" debés ingresar un valor de "m" y "n" por más que sea el mismo valor, por que la función (como yo te la hice) va a ir a buscar si o si un valor de "m" y "n".
Entonces... por ejemplo, que tenés 3 valores de "x" que ya calculaste que con la primer funcion... y para la segunda función querés esos valores de "x" pero con un solo valor de "m" y "n"... entonces, vas a tener que ponerlo así:

ECUACION2(m,n,x)
ECUACION2(c(3,3,3), c(5,5,5), x)

En cambio la primer función no tiene ese problema por que vos de entrada dijiste que van a ser constantes, entonces en el bucle for las constantes no tienen subindice.


Bueno... espero se entienda. Tratá de ser lo más explícito posible.
Nos vemos.
David Elías

En respuesta a David Elías

Re: Resolver fórmulas con R

de David Elías -
Donde está la mano... va esto: ( x )
Y después, por cualquier cosa... todos los archivos a los que les des "save" o "load" van entre comillas. Si falta alguna, agregala.
En respuesta a Andrés Necochea

Re: Resolver fórmulas con R

de Mónica Mir Florit -
Muchísimas gracias!! Ya lo he terminado!!!

Sí que es verdad que faltaba definir la variable Pxbnit1, pero para ello había unas cuantas fórmulas más por el medio y he pensado que con lo que había puesto ya se entendía y no hacía falta ponerlas todas.

Muchísimas gracias de nuevo! Me habéis ayudado un montón!
En respuesta a Andrés Necochea

Re: Resolver fórmulas con R

de Mónica Mir Florit -
Hola de nuevo!

Ya tengo escritas todas las fórmulas y los resultados me dan lo que toca. La función es esta:

resultats <- function(bCODBOD, BOD, VSS, COD, sBOD, sCOD, TSS, TKNpa, T, NH3Ne, DO, Q, TKN, MLSS, NO3Ne, RAS, tanoxic1, tanoxic2, rbCOD, SDNR1, SDNR2, tdanoxic, tanaerobic, IRp, P) {

 

bCOD <- bCODBOD*BOD

 

nbCOD <- COD-bCOD

 

nbVSS <- VSS*(1-((bCODBOD)*(BOD-sBOD)/(COD-sCOD)))

 

iTSS <- TSS-VSS

 

SF <- TKNpa

 

knt <- kn*kn0^(T-20)

 

kdnt <- kdn*kdn0^(T-20)

 

unmt <- unm*unm0^(T-20)

 

un <- (unmt*NH3Ne)/(knt+NH3Ne)*(DO/(ko+DO))-kdnt

 

kst <- ks*ks0^(T-20)

 

kdt <- kd*kd0^(T-20)

 

umt <- um*um0^(T-20)

 

SRTtheo <- 1/un

 

SRT <- SRTtheo*SF

 

S <- kst*(1+kdt*SRT)/(SRT*(umt-kdt)-1)

 

Pxbh <- Q*Y*(bCOD-S)/(1+kdt*SRT)

 

Pxdead <- fd*kdt*Q*Y*(bCOD-S)*SRT/(1+kdt*SRT)

 

Nox1 <- 0.8*TKN

 

Pxbnit1 <- Q*Yn*Nox1/(1+kdnt*SRT)

 

Pxbio1 <- Pxbh+Pxdead+Pxbnit1

 

Nox2 <- TKN-NH3Ne-0.12*Pxbio1/Q

 

Pxbnit2 <- Q*Yn*Nox2/(1+kdnt*SRT)

 

Pxbio2 <- Pxbh+Pxdead+Pxbnit2

 

Nox3 <- TKN-NH3Ne-0.12*Pxbio2/Q

 

Pxbnit3<- Q*Yn*Nox3/(1+kdnt*SRT)

 

Pxbio3 <- Pxbh+Pxdead+Pxbnit3

 

Pxvss <- Pxbio3+Q*nbVSS

 

Pxtss <- Pxbio3/0.88+Q*nbVSS+Q*(TSS-VSS)

 

MassMLVSS <- Pxvss*SRT

 

MassMLSS <- Pxtss*SRT

 

Vaerobic <- MassMLSS/MLSS

 

taerobic <- Vaerobic/Q

 

thaerobic <- taerobic*24

 

VSSfraction <- MassMLVSS/MassMLSS

 

MLVSS <- MLSS*VSSfraction

 

observedyield <- Pxtss/(Q*(bCOD-S))*bCODBOD

 

Xb <- SRT*Q/Vaerobic*(Y*bCOD/(1+kdt*SRT))

 

IR <- Nox3/NO3Ne-1-RAS

 

Noxfeed <- (IR*Q+RAS*Q)*NO3Ne

 

Vanoxic1 <- tanoxic1*Q

 

Vanoxic2 <- tanoxic2*Q

 

FMb1 <- Q*BOD/(Vanoxic1*Xb)

 

FMb2 <- Q*BOD/(Vanoxic2*Xb)

 

rbCODbCOD <- rbCOD/bCOD

 

SDNRt1 <- SDNR1*1.026^(T-20)

 

SDNRt2 <- SDNR2*1.026^(T-20)

 

NOr1 <- Vanoxic1*SDNRt1*Xb

 

NOr2 <- Vanoxic2*SDNRt2*Xb

 

Excesscap1 <- NOr1/Noxfeed

 

Excesscap2 <- NOr2/Noxfeed

 

Vanoxic <- tdanoxic*Q

 

Vanaerobic <- tanaerobic*Q

 

NO3reac <- NO3Ne*IRp/(1+IRp)

 

rbCODremov <- NO3reac*rbCODrem

 

rbCODava <- rbCOD-rbCODremov

 

biorem <- rbCODava/rbCODreq

 

Pbiomassg <- (Pxbh+Pxbnit3)*Pbac/Q

 

Premov <- Pbiomassg+biorem

 

Peff <- P-Premov

 

res <- c(bCOD, nbCOD, nbVSS, iTSS, SF, knt, kdnt, unmt, un, kst, kdt, umt, SRTtheo, SRT, S, Pxbh, Pxdead, Nox1, Pxbnit1, Pxbio1, Nox2, Pxbnit2, Pxbio2, Nox3, Pxbnit3, Pxbio3 , Pxvss, Pxtss, MassMLVSS, MassMLSS, Vaerobic, taerobic, thaerobic, VSSfraction, MLVSS, observedyield, Xb, IR, Noxfeed, Vanoxic1, Vanoxic2, FMb1, FMb2, rbCODbCOD, SDNRt1, SDNRt2, NOr1, NOr2, Excesscap1, Excesscap2, Vanoxic, Vanaerobic, NO3reac, rbCODremov, rbCODava, biorem, Pbiomassg, Premov, Peff)

 

names(res) <- c("bCOD", "nbCOD", "nbVSS", "iTSS", "SF", "knt", "kdnt", "unmt", "un", "kst", "kdt", "umt", "SRTtheo", "SRT", "S", "Pxbh", "Pxdead", "Nox1"," Pxbnit1", "Pxbio1", "Nox2", "Pxbnit2", "Pxbio2", "Nox3", "Pxbnit3", "Pxbio3" , "Pxvss", "Pxtss", "MassMLVSS", "MassMLSS", "Vaerobic", "taerobic", "thaerobic", "VSSfraction", "MLVSS", "observedyield", "Xb", "IR", "Noxfeed", "Vanoxic1", "Vanoxic2", "FMb1", "FMb2", "rbCODbCOD", "SDNRt1", "SDNRt2", "NOr1", "NOr2", "Excesscap1", "Excesscap2", "Vanoxic", "Vanaerobic", "NO3reac", "rbCODremov", "rbCODava", "biorem", "Pbiomassg", "Premov", "Peff")

 

return(res) }

 

Donde por ejemplo, los valores de las variables podrían ser estas:
resultats(1.6, 140, 60, 300, 70, 132, 70, 1.5, 12, 0.5, 2, 22464, 35, 3000, 6, 0.6, 0.104, 0.0625, 80, 0.22, 0.31, 0.0625, 0.0625, 2, 6)

(las constantes (kn, kdn, unm...) las tengo guardadas en el programa)

Lo que quiero preguntaros es a ver si es posible coger el valor de las variables, por ejemplo, de una data.frame. Es decir, si yo tuviera algo así:

Variable
Valor
Q
22464
T
12
BOD
140
...
...

Y para llamar la función indicarle dónde ir a buscar cada valor de la variable en la tabla. De esta manera, en el momento de cambiar el valor de las variables sería más fácil.
No sé si me he explicado bien...

Gracias!