Rstudio

andre90001
Ciao a tutti

Un esercizio richiede di costruire una funzione per categorizzare una variabile continua usando i quantili: mi sembra quindi di capire che devo ricreare una funzione che riproduca "cut". Ho pensato di utilizzare in combinazione quantile insieme al comando levels ma non sono in grado di creare gli intervalli dentro levels.
Spero di essermi spiegato bene, purtroppo sono ancora un principiante in questo linguaggio.
Grazie

Risposte
dasalv12
Una soluzione costruita con le funzione base di R potrebbe essere questa:


num <- 1:100
#####################
lalivella <- function(X)
#####################  
{
  quant <- quantile(X, seq(0, 1, 0.1))
  for (i in 1:10) {
    X[X >= quant[i] & X < quant[i+1]] <- i
    }
   X[X >= quant[10] & X <= quant[11]] <- 10
  X
  
}

cbind(num, lalivella(num))


La funzione levels() invece non ti serve.

andre90001
Sì, mi sembra una soluzione accettabile. Ho solo un dubbio sui segni nel ciclo for, che non mi rendono "uguale" alla funzione cut (insisto sul cut solo perché mi è stato dato come suggerimento il "riprodurre la funzione cut"). Proporrei una modifica del genere (a parte i nomi e l'aggiunta di qualche variabile che serve a me dato che sono ancora agli inizi :-) )
mycut<-function(x,q=10)
{
  d<-vector()
  quant<-quantile(x,seq(0,1,1/q))
  d[x<=quant[1]]<-1
  for (i in 1:q) {
    d[x>quant[i]&x<=quant[i+1]]<-i
  }
  d[x>=quant[q]&x<=quant[q+1]]<-q
  return(d)
}


è un dubbio legittimo o mi sbaglio?

dasalv12
La scelta di avere l'intervallo chiuso a dx o a sx è una scelta arbitraria (peraltro prevista anche dalla funzione cut() con la condizione right = F/T). In ogni caso nessuna delle nostre due funzioni equivale alla funzione cut() per il semplice motivo che le nostre si attengono rigorosamente agli intervalli creati dalla funzione quantile(), mentre cut() usa un trucchetto: in pratica "apre" il minimo della distribuzione diminuendolo di un infinitesimo. Esempio: nella serie 1:100, cut() ha come primo intervallo (0.9, 11], in questo modo può impostare l'intervallo chiuso a dx in tutti gli intervalli a differenza delle nostre funzioni.

#####################
mylivellacut <- function(X)
#####################  
{
  quant <- quantile(X, seq(0, 1, 0.1))
  X[X >= quant[1] & X <= quant[2]] <- 1
  for (i in 2:10) {
    X[X > quant[i] & X <= quant[i+1]] <- i
  }
  
  X
  
}

num <- 1:101

table(cut(num, 10))
table(mylivellacut(num))



Rispondi
Per rispondere a questa discussione devi prima effettuare il login.