2017-09-01 5 views
3

Ich habe eine Datenmenge, die ich in R. erstellt haben, es ist wie folgt strukturiert:K-Means-Clustering in R Fehler

> head(btc_data) 
      Date btc_close eth_close vix_close gold_close DEXCHUS change 
1647 2010-07-18  0.09  NA  NA   NA  NA  0 
1648 2010-07-19  0.08  NA  25.97 115.730  NA  -1 
1649 2010-07-20  0.07  NA  23.93 116.650  NA  -1 
1650 2010-07-21  0.08  NA  25.64 115.850  NA  1 
1651 2010-07-22  0.05  NA  24.63 116.863  NA  -1 
1652 2010-07-23  0.06  NA  23.47 116.090  NA  1 

Ich versuche, die Beobachtungen clustern mit k-Mittel. Allerdings erhalte ich folgende Fehlermeldung:

> km <- kmeans(trainingDS, 3) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 
In addition: Warning message: 
In storage.mode(x) <- "double" : NAs introduced by coercion 

Was bedeutet das? Werte ich die Daten falsch vor? Was kann ich tun, um es zu beheben? Ich kann die NAs nicht fallen lassen, weil ich aus 4500 anfänglichen Beobachtungen, wenn ich complete cases betreibe, nur noch 100 Beobachtungen übrig habe.

Im Wesentlichen hoffe ich, dass 3 Cluster basierend auf der change Spalte bilden, die Werte von -1,0,1 hat. Ich möchte dann die Komponenten jedes Clusters analysieren, um die stärksten Prädiktoren für Veränderungen zu finden. Welche anderen Algorithmen wären dafür am nützlichsten?

Ich habe auch versucht, alle die NA entfernen Werte den folgenden Code verwenden, aber ich habe immer die gleiche Fehlermeldung erhalten:

> complete_cases <- btc_data[complete.cases(btc_data), ] 
> km <- kmeans(complete_cases, 3, nstart = 20) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 
In addition: Warning message: 
In storage.mode(x) <- "double" : NAs introduced by coercion 

> sum(!sapply(btc_data, is.finite)) 
[1] 8008 
> sum(sapply(btc_data, is.nan)) 
[1] 0 
> 
> sum(!sapply(complete_cases, is.finite)) 
[1] 0 
> sum(sapply(complete_cases, is.nan)) 
[1] 0 

Hier ist das Format der Daten:

> sapply(btc_data, class) 
     Date btc_close eth_close vix_close gold_close DEXCHUS  change 
    "Date" "numeric" "numeric" "numeric" "numeric" "numeric" "factor" 
+0

'> Summe (sapply (btc_data, is.finite)!) [1] 8008 > sum (! Sapply (btc_data, is.nan)) [1] 18193' – zsad512

+0

@coffeinjunky Ich habe die Frage bearbeitet .... auch, ich weiß nicht, warum die 'Summe' für komplette Fälle' 721' ist, besonders seit es gibt nur 103 Beobachtungen ... wenn ich das IF manuell inspiziere, gibt es keine NA – zsad512

+0

Ok- Ich entfernte das '!' und editierte die Quest Ion ... was du sagst ist, dass die 'knn' auf 'complete_cases' funktionieren sollte, aber ich bekomme immer noch dieselbe Fehlermeldung – zsad512

Antwort

2

Es Es gibt eine Vielzahl von Gründen für diese Fehlermeldung, insbesondere bei ungültigen Datentypen (NA, NaN, Inf) oder Datumsangaben. Gehen wir durch sie:

Aber zunächst wollen wir prüfen, ob sie mit dem mtcars-Datensatz funktioniert, da ich es verwenden werden:

kmeans(mtcars, 3) 
K-means clustering with 3 clusters of sizes 9, 7, 16 
--- lengthy output omitted 

Wahrscheinlich Problem 1: ungültige Datentypen: NA/NaN/Inf

df <- mtcars 
df[1,1] <- NA 
kmeans(df, 3) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 

df[1,1] <- Inf 
kmeans(df, 3) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 

df[1,1] <- NaN 
kmeans(df, 3) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 

Sie können diese Werte folgendermaßen überprüfen:

df[1:3,1] <- c(NA, Inf, NaN) # one NA, one Inf, one NaN 
sum(sapply(df, is.na)) 
[1] 2 
sum(sapply(df, is.infinite)) 
[1] 1 
sum(sapply(df, is.nan)) 
[1] 1 

Um diese zu beseitigen, können wir die entsprechenden Beobachtungen entfernen. Aber beachten Sie, dass complete.cases nicht Inf nicht entfernt:

complete_df <- df[complete.cases(df),] 
sum(sapply(complete_df, is.infinite)) 
[1] 1 

Verwenden Sie stattdessen z.B.

Sie können diese Werte auch neu zuweisen oder sie imputieren, aber dies ist ein ganz anderer Vorgang.

Wahrscheinlich Problem II: Daten: Siehe folgendes:

library(lubridate) 
df <- mtcars 
df$date <- seq.Date(from=ymd("1990-01-01"), length.out = nrow(df), by=1) 
kmeans(df, 3) 
Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1) 
In addition: Warning message: 
In kmeans(df, 3) : NAs introduced by coercion 

Sie können ohne die Daten dieses Problem umgehen, oder indem Sie die Daten, um etwas anderes umzuwandeln, beispielsweise

df$newdate <- seq_along(df$date) 
df$date <- NULL 
kmeans(df, 3) 
K-means clustering with 3 clusters of sizes 9, 7, 16 
---- lengthy output omitted 

Oder Sie können versuchen, die Daten zu zwingen, sich auf numerische, bevor Sie es kmeans passieren:

df <- mtcars 
df$date <- seq.Date(from=ymd("1990-01-01"), length.out = nrow(df), by=1) 
df$date <- as.numeric(df$date) 
kmeans(df, 3) 
K-means clustering with 3 clusters of sizes 9, 16, 7 
--- lengthy output omitted 
+0

Ich verstehe, aber 2 Dinge - die Daten sind zwei kleine, wenn ich die NAs entfernen. Noch wichtiger ist, dass ich 'complete_cases' ausgeführt habe und dann die 'knn' gemacht habe, aber ich bekomme immer noch denselben Fehler. – zsad512

+0

Wenn Sie nicht (genug) Daten haben, können wir Ihnen nicht wirklich helfen. Das einzige, was Sie versuchen könnten, ist, Ihre Daten einzugeben, statt sie zu entfernen. Was Ihren zweiten Punkt betrifft, kann ich dazu nichts sagen, da Sie diesen Code oder diese Fehlermeldung nicht gepostet haben. – coffeinjunky

+0

Ich habe meine Frage aktualisiert. – zsad512