2012-05-23 29 views
10

Sono stato sorpreso di scoprire che clara da library(cluster) consente NA. Ma la documentazione della funzione non dice nulla su come gestisce questi valori.clustering con valori NA in R

Quindi le mie domande sono:

  1. Come clara maniglie NAS?
  2. Può essere utilizzato in qualche modo per kmeans (non consentito)?

[Update] linee Così ho trovato di codice in clara funzione:

inax <- is.na(x) 
valmisdat <- 1.1 * max(abs(range(x, na.rm = TRUE))) 
x[inax] <- valmisdat 

che non mancanti sostituzione valore valmisdat. Non sono sicuro di aver compreso la ragione per usare questa formula. Qualche idea? Sarebbe più "naturale" trattare le NA per ogni colonna separatamente, magari sostituendole con media/mediana?

risposta

7

Sebbene non dichiarato esplicitamente, credo che NA siano gestiti nel modo descritto nella pagina di guida ?daisy. La sezione Dettagli trovi:

Nell'algoritmo margherita, valori mancanti in una fila di x non sono inclusi nelle differenze coinvolgono quella riga.

Dato internamente lo stesso codice sarà utilizzato da clara() è così che ho capito che NA s nei dati potranno essere trattati - solo che non prendono parte alla computazione. Questo è un modo abbastanza normale di procedere in questi casi ed è ad esempio utilizzato nella definizione del coefficiente di similarità generalizzato di Gower.

Aggiornamento Le C fonti per clara.c indicano chiaramente che questo (sopra) è il modo in NA s sono gestite da clara() (linee 350-356 in ./src/clara.c):

if (has_NA && jtmd[j] < 0) { /* x[,j] has some Missing (NA) */ 
     /* in the following line (Fortran!), x[-2] ==> seg.fault 
      {BDR to R-core, Sat, 3 Aug 2002} */ 
     if (x[lj] == valmd[j] || x[kj] == valmd[j]) { 
     continue /* next j */; 
     } 
    } 
+0

Stesse linee di codice per trattare i valori mancanti in 'daisy' come nella funzione' clara' (vedere l'aggiornamento della mia domanda). –

+0

@ danas.zuokas Non sono sicuro di quanto sia utile semplicemente tirare linee arbitrarie di codice dalle fonti che si pensa siano correlate alla domanda. Devi studiare sia il codice R che il codice C. 'valmisdat' è il valore usato per indicare i dati mancanti (' NA') nel codice C piuttosto che usare 'NA' direttamente. Se si guarda il codice C, si vedrà che chiaramente ignora solo i confronti in cui una variabile ha un valore mancante per uno o l'altro o entrambi i campioni per i quali viene calcolata la dissomiglianza. Vedere la risposta aggiornata per il puntatore al codice. –

+0

Grazie, Gavin! –

3

Non sono sicuro se kmeans in grado di gestire dati mancanti ignorando i valori mancanti in una riga.

Ci sono due passaggi in kmeans;

  1. calcolo della distanza tra un'osservazione e una media di cluster originale.
  2. aggiornamento della media del nuovo cluster in base alle distanze appena calcolate.

Quando abbiamo dati mancanti nella nostre osservazioni: Fase 1 possono essere gestiti regolando la distanza metrica appropriatamente come nel pacchetto clara/pam/daisy. Ma il passaggio 2 può essere eseguito solo se abbiamo un valore per ogni colonna di un'osservazione. Pertanto, l'imputazione potrebbe essere la migliore opzione successiva per kmeans per trattare i dati mancanti.

0

Osservando il codice di Clara c, ho notato che nell'algoritmo di Clara, quando mancano valori nelle osservazioni, la somma dei quadrati è "ridotta" proporzionale al numero di valori mancanti, che penso sia sbagliato! la riga 646 di clara.c è come "dsum * = (nobs/pp)" che mostra che conta il numero di valori non mancanti in ciascuna coppia di osservazioni (nobs), lo divide per il numero di variabili (pp) e lo moltiplica per la somma dei quadrati. Penso che debba essere fatto in altro modo, ad esempio "dsum * = (pp/nobs)".

+1

È possibile utilizzare un [modifica collegamento] (https://stackoverflow.com/posts/35925440/edit) per modificare la risposta precedente. – zero323

Problemi correlati