我已经在R中创建了一个数据集,其结构如下:
> head(btc_data) Date btc_close eth_close vix_close gold_close DEXCHUS change1647 2010-07-18 0.09 NA NA NA NA 01648 2010-07-19 0.08 NA 25.97 115.730 NA -11649 2010-07-20 0.07 NA 23.93 116.650 NA -11650 2010-07-21 0.08 NA 25.64 115.850 NA 11651 2010-07-22 0.05 NA 24.63 116.863 NA -11652 2010-07-23 0.06 NA 23.47 116.090 NA 1
我试图使用k-means对观察值进行聚类。然而,我得到了以下错误信息:
> 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"
回答:
导致此错误信息的原因有很多,特别是在存在无效数据类型(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 <- mtcarsdf[1,1] <- NAkmeans(df, 3)Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)df[1,1] <- Infkmeans(df, 3)Error in do_one(nmeth) : NA/NaN/Inf in foreign function call (arg 1)df[1,1] <- NaNkmeans(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 NaNsum(sapply(df, is.na))[1] 2sum(sapply(df, is.infinite))[1] 1sum(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),]
你也可以重新分配这些值或进行插补,但这是一个完全不同的过程。
可能的问题II:日期:请看以下内容:
library(lubridate)df <- mtcarsdf$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 <- NULLkmeans(df, 3)K-means clustering with 3 clusters of sizes 9, 7, 16---- lengthy output omitted
或者你可以在传递给kmeans
之前自己将日期强制转换为数值类型:
df <- mtcarsdf$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