Foro de debate

Ayuda con código

Ayuda con código

de Benito Núñez Quintanilla -
Número de respuestas: 9
Hola a todos estoy tratando de programar en R para un trabajo sobre estadística y me aparece siempre en el código:
serie es un vector de longitud 5730.

 for(i in 1:5729){
+     hmaxint<-serie[i+1]
+     for(j in i+2:5729){
+         if(serie[j]>hmaxint){
+             k[i]<-k[i]+1 
+             hmaxint<-serie[j]}
+     }
+ }

El error :Error en if (serie[j] > hmaxint) { : 
  valor ausente donde TRUE/FALSE es necesario.
¿Alguien puede decirme porque pasa esto? 
En respuesta a Benito Núñez Quintanilla

Re: Ayuda con código

de Benito Núñez Quintanilla -
Por aclarar un poco, lo que pretendo es contar cuantos valores, serie[j], existen por encima de serie[i] tales que para todo k, i<k<j, serie[k]<serie[j]. Ya se que no está recomendado el uso de for e if pero no se me ocurría otra forma de hacerlo.
Gracias. 
En respuesta a Benito Núñez Quintanilla

Re: Ayuda con código

de Manuel Muñoz Márquez -
Hola Benito:

Un par de cosas:
* Esto por si acaso, dado que en el primer bucle usas serie[i+1], serie debe ser un vector de 5730 elementos.
* El auténtico desliz está en
for(j in i+2:5729)
que debería ser
for(j in (i+2):5729)
ya que el operador : tiene prioridad y por tanto, en el primer caso, estás accediendo a elementos de serie que no existen.

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Ayuda con código

de Benito Núñez Quintanilla -
Muchísimas gracias, el vector serie sí que tiene 5730 elementos, de hecho mi primera opción fue poner for(i in 1:length(serie)-1), pero claro me daba un error (error inesperado en for) ahora creo que a lo mejor lo correcto sería for(i in 1: (length(serie)-1)). Voy a seguir probando, y de nuevo mil gracias.
En respuesta a Benito Núñez Quintanilla

Re: Ayuda con código

de Manuel Muñoz Márquez -
¿Has probado a poner los paréntesis que te indiqué?. A mí me funciona con los paréntesis.
En respuesta a Manuel Muñoz Márquez

Re: Ayuda con código

de Benito Núñez Quintanilla -
Sí he probado los paréntesis y funcionaba, muchas gracias, aunque tardaba mucho. Luego he tratado de poner este código bien (con paréntesis):

index<-length(datos)-1

for(i in 1:index){

  if(datos[i]>datos[i+1]){

 hmaxint<-datos[i+1]

 for(j in (i+2):index){

 if(datos[j]>hmaxint){

 hmaxint<-datos[j]

 if(datos[i]>hmaxint){

 k[i]<-k[i]+1

}}}}}

Y ahora obtengo un: Error en if (datos[j] > hmaxint) { : 

  valor ausente donde TRUE/FALSE es necesario.

Así que he creado otro vector que duplicase "datos" (serie<-datos) para que no me diese el error.

 > for(i in 1:index){

+ serie<-datos

+ if(datos[i]>datos[i+1]){

+ hmaxint<-datos[i+1]

+ for(j in (i+2):index){

+ if(serie[j]>hmaxint){

+ hmaxint<-serie[j]

+ if(datos[i]>hmaxint){

+ k[i]<-k[i]+1

+ }}}

+ }

+ }

Pero me sigue apareciendo Error en if (serie[j] > hmaxint) { : 
  valor ausente donde TRUE/FALSE es necesario
Gracias por la ayuda.
En respuesta a Benito Núñez Quintanilla

Re: Ayuda con código

de Manuel Muñoz Márquez -
Con la primera opción que has puesto a mí me funciona, la segunda no la he probado.

El error que te aparece es sin duda debido a que estás accediendo a un elemento de serie que no existe. Para ver donde está el problema te sugiero que al inicio de cada bucle pongas una instrucción del tipo:
cat('i:', i, '\n')
con el índice del bucle para ver su valor. Así podrás identificar el valor al que estás intentando acceder.

Saludos.

En respuesta a Manuel Muñoz Márquez

Re: Ayuda con código

de Benito Núñez Quintanilla -
Hola de nuevo, he hecho como decías y el error se produce en cuando en la última iteración del bucle for(j in (i+2):index) trata de acceder al valor de x[j] 5731, que claro no existe ( lo pego:
j: 5729 
j: 5729 
j: 5731 
Error en if (serie[j] > hmaxint) { : 
  valor ausente donde TRUE/FALSE es necesario
Así que por algún motivo sigue el bucle más allá de la longitud de index (> index
[1] 5729
)
Funciona en todo caso, pero ¿porqué hace esto?
De nuevo gracias mil.
En respuesta a Benito Núñez Quintanilla

Re: Ayuda con código

de Manuel Muñoz Márquez -
Hola:

Cuando i = 5728 j está en (i+2):5729, es decir, en 5730:5729, lo que quiere decir que j va a tomar el valor 5730 y luego el 5729. Cuando el valor inicial es mayor que el final la cuenta es regresiva desde el inicio hasta el final. Para i = 5729, j va de 5731 a 5729.

Conclusión, el contador para i debe acabar antes.

Saludos.
En respuesta a Manuel Muñoz Márquez

Re: Ayuda con código

de Benito Núñez Quintanilla -
Lo he modificado tal como indicas haciendo que i vaya de 1 a 5728, y ya no da error. Muchísimas gracias no sabes lo que te lo agradezco, el código es para generar el grado de cada nodo de una serie temporal transformada en un grafo de acuerdo con lo que se llama "algoritmo de visibilidad horizontal" (detalles en: http://www.dmae.upm.es/WebpersonalBartolo/papers/eplVisibilityHurst.pdf) así que lo convertiré en función y pretendo hacer mi pequeña (mínima más bien) contribución al universo R. De nuevo gracias.
Saludos.