Home Forum Fuoritema problemi con la condizione if

Questo argomento contiene 1 risposta, ha 2 partecipanti, ed è stato aggiornato da Davide Massidda Davide Massidda 1 anno, 4 mesi fa.

Stai vedendo 2 articoli - dal 1 a 2 (di 2 totali)
  • Autore
    Articoli
  • #6773

    DANIEL
    Partecipante

    Buongiorno,

    volevo calcolare attraverso un ciclo while gli z-score per valutare se un certo elemento era un possibile outlier o meno…. Il problema è che non riesco a capire cosa sbaglio nello scrivere la condizionale if all’interno del ciclo while

    il codice è:
    infile=read.table("anagrafica.txt",header=TRUE)
    data=data.frame(infile)
    str(data)
    data.maschi=subset(data,subset=SESSO=="M")
    data.femmine=subset(data,subset=SESSO=="F")
    altezza.maschi=data.maschi$ALTEZZA
    altezza.maschi=sort(altezza.maschi)
    altezza.femmine=data.femmine$ALTEZZA
    altezza.femmine=sort(altezza.femmine)
    media_altezza.maschi=mean(altezza.maschi)
    media_altezza.femmine=mean(altezza.femmine)
    deviazione_standard.maschi=sd(altezza.maschi)
    deviazione_standard.femmine=sd(altezza.femmine)
    i=0
    vettore_z_score=c()
    vettore_outlier=c()
    while (i<=length(altezza.maschi)){
      osservazione=altezza.maschi[i]
      z_score=(osservazione-media_altezza.maschi)/deviazione_standard.maschi
      vettore_z_score[i]=z_score
      if (z_score< -3 || z_score > 3){
        vettore_outlier[i]=altezza.maschi[i]
      }
      i=i+1
    }    
    print(vettore_z_score)
    print(vettore_outlier)

    L’errore che R mi segnala è:

    Error in if (z_score < -3 || z_score > 3) { : 
      missing value where TRUE/FALSE needed

    Qualcuno gentilmente mi può aiutare a capire dove sbaglio?

    Ringrazio anticipatamente

    • Questo argomento è stato modificato 1 anno, 4 mesi fa da Davide Massidda Davide Massidda.
    #6775
    Davide Massidda
    Davide Massidda
    Moderatore

    Ciao,
    la verità è che non riesco proprio a comprendere la necessità di utilizzare un ciclo. Per fortuna R è un linguaggio ad alto livello, che non richiede di esplicitare l’uso di cicli per ogni minimo calcoletto che dobbiamo fare.
    Non sarebbe più semplice una cosa del genere?

    data = read.table("anagrafica.txt",header=TRUE)
    str(data)
    
    pos.M = data$ALTEZZA[data$SESSO=="M"]
    pos.F = data$ALTEZZA[data$SESSO=="F"]
    
    media.M = mean(data$ALTEZZA[pos.M])
    media.F = mean(data$ALTEZZA[pos.F])
    
    devst.M = sd(data$ALTEZZA[pos.M])
    devst.F = sd(data$ALTEZZA[pos.F])
    
    z.M = (data$ALTEZZA[pos.M] - media.M) / devst.M
    z.F = (data$ALTEZZA[pos.F] - media.F) / devst.F
    
    outlier.M = abs(z.M) > 3
    outlier.F = abs(z.F) > 3
    
    z.M[outlier.M]
    z.F[outlier.F]

    Il codice per la verità poteva essere scritto in maniera moooooooooolto più compatta, ma perlomeno in questo modo sono evidenti i passaggi che vengono eseguiti.

Stai vedendo 2 articoli - dal 1 a 2 (di 2 totali)

Devi essere loggato per rispondere a questa discussione.