2017-09-01 136 views
3

K均值聚類我有在R.已經創建它的結構如下數據集:中的R錯誤

> 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 

我試圖集羣中使用k均值的意見。但是,我收到以下錯誤消息:

> 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 

這是什麼意思?我是否錯誤地預處理了數據?我能做些什麼來解決它?我不能刪除NA,因爲在4500次最初的觀察中,如果我運行complete cases我只剩下100個觀察值。

本質上,我希望根據change列的值爲-1,0,1形成3個簇。然後,我希望分析每個羣集的組成部分,找出變化的最強預測因素。還有哪些其他算法對此更有用?

我也試圖消除所有的NA值使用下面的代碼,但我仍然得到同樣的錯誤信息:

> 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 

下面是數據的格式:

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

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

+0

@coffeinjunky我編輯了這個問題....另外,我不知道爲什麼'sum'對於完整的情況是'721',特別是只有103個觀察結果...當我手動檢查df時,沒有NA的 – zsad512

+0

好的 - 我刪除了'!'並編輯了任務離子...你要說的是'knn'應該在'complete_cases'上工作,但我仍然得到相同的錯誤信息 – zsad512

回答

2

有是獲取此錯誤消息的各種原因,尤其是在存在無效數據類型(NA,NaN,Inf)或日期的情況下。讓我們通過他們:

但首先,讓我們來檢查它的工作原理與mtcars數據集,因爲我將使用它:

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

可能出現的問題1:無效的數據類型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) 

您可以使用以下方式檢查這些值:

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 

要擺脫這些,我們可以刪除相應的觀察值。但是請注意,complete.cases不會刪除Inf

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

相反,使用例如

df[apply(sapply(df, is.finite), 1, all),] 

您也可以重新分配這些值或對它們進行推測,但這是一個完全不同的過程。

可能出現的問題二:日期:請參閱以下內容:

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 

您可以排除的日期或通過轉換日期別的東西,例如解決這個問題

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 

或者你可以試着將其轉換日期爲數字自己,你把它傳遞給kmeans前:

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

我明白,但有兩件事 - 當我刪除NA時,數據是兩個小數。更重要的是,我運行'complete_cases',然後執行了'knn',但我仍然得到相同的錯誤。 – zsad512

+0

如果您沒有足夠的數據,我們可以提供的幫助並不多。您唯一可以嘗試的是輸入您的數據,而不是將其刪除。關於你的第二點,我不能評論,因爲你沒有發佈該代碼或錯誤消息。 – coffeinjunky

+0

我更新了我的問題。 – zsad512