2014-01-24 11 views
6

Ich bin neu in R und arbeite an einem Datensatz mit nominalen, ordinalen und metrischen Daten. Deshalb benutze ich den Abstand. Im nächsten Schritt benutze ich diese Distanz mit hclust(x, method="complete"), um Cluster basierend auf dieser Distanz zu erstellen.Wie gewichte ich Variablen mit Gower-Abstand in r

Jetzt möchte ich wissen, wie ich verschiedene Variablen in der Gower-Distanz verschiedene Gewichte setzen kann. Die Dokumentation sagt:

daisy(x, metric = c("euclidean", "manhattan", "gower"), stand = FALSE, type = list(), weights = rep.int(1, p)) 

So gibt es einen Weg, aber ich bin nicht sicher über die Syntax (weights = ...). Die Dokumentation von weights und rep.int, hat nicht geholfen. Ich fand auch keine andere hilfreiche Erklärung.

Ich wäre sehr froh, wenn jemand helfen kann.

+2

Vergessen Sie nicht, Sie arbeiten mit 'Bibliothek (Cluster)' zu erwähnen. – tonytonov

+0

richtig, danke. – user3231946

Antwort

5

nicht sicher, ob dies ist, was Sie bekommen an, aber ...

Angenommen, Sie 5 Variablen, z.B. 5 Spalten in Ihrem Datenrahmen oder Matrix. Dann wäre weights ein Vektor von length=5, der die Gewichte für die entsprechenden Spalten enthält.

Die Notation weights=rep.int(1,p) in der Dokumentation bedeutet einfach, dass der Standardwert von Gewichtungen ein Vektor der Länge p ist, der alle 1 hat, z. Die Gewichte sind alle gleich 1. An anderer Stelle in der Dokumentation wird erklärt, dass p die Anzahl der Spalten ist.

Beachten Sie auch, dass daisy(...) eine Unähnlichkeitsmatrix erzeugt. Dies verwenden Sie in hclust(...). Also, wenn x ist ein Datenrahmen oder eine Matrix mit fünf Spalten für Ihre Variablen, dann:

d <- daisy(x, metric="gower", weights=c(1,2,3,4,5)) 
hc <- hclust(d, method="complete") 

EDIT (Antwort auf OP Kommentare)

Der folgende Code zeigt, wie das Clustering auf die Gewichte abhängt.

clust.anal <- function(df,w,h) { 
    require(cluster) 
    d <- daisy(df, metric="gower", weights=w) 
    hc <- hclust(d, method="complete") 
    clust <- cutree(hc,h=h) 
    plot(hc, sub=paste("weights=",paste(wts,collapse=","))) 
    rect.hclust(hc,h=0.8,border="red") 

} 

df <- read.table("ExampleClusterData.csv", sep=";",header=T) 
df[1] <- factor(df[[1]]) 
df[2] <- factor(df[[2]]) 
# weights increase with col number... 
wts=c(1,2,3,4,5,6,7) 
clust.anal(df,wts,h=0.8) 

# weights decrease with col number... 
wts=c(7,6,5,4,3,2,1) 
clust.anal(df,wts,h=0.8) 

+0

Vielen Dank für Ihre Antwort! Ich habe jetzt das Problem, dass ich mit dieser Syntax keine Unterschiede im Dendrogramm sehen kann. Ich habe sogar extreme Gewichte benutzt, um Unterschiede zu sehen. Versteh ich es richtig, dass der Vektor in 'Gewichtungen = c (1,2,3,4,5)' die Gewichte für jede Spalte sind? Also Gewicht 1 für Spalte 1, Gewicht 2 für Spalte 2 usw. Ich habe es ein paar Mal versucht, und ich habe gelernt, dass die Gewichte keine ungerade Zahl sein können, und sie können nicht höher sein als die Anzahl der Spalten. Sonst bekomme ich _type $ Gewichte müssen 1 sein: ncol (x) _ – user3231946

+0

Der Vektor als Gewichte übergeben müssen Länge = Anzahl der Spalten in x, ja. Aber es gibt keine Beschränkung auf ungerade, gerade. Um furtehr zu gehen, würde ich dein Dataset brauchen. Kannst du einen Link posten? – jlhoward

+0

Leider kann ich die echten Daten nicht ausgeben. Ich habe ein gutes Beispiel erstellt http://bit.ly/1gferLt Vielen Dank für die Mühe! – user3231946