2017-09-01 101 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