我有一个混合类型数据集,一个连续变量和8个分类变量,所以我想尝试kamila群集。当我使用一个cont时它会出错。变量,但当我使用两个续时。它正在起作用的变量。
library(kamila)
data <- read.csv("mixed.csv",header=FALSE,sep=";")
conInd <- 9
conVars <- data[,conInd]
conVars <- data.frame(scale(conVars))
catVarsFac <- data[,c(1,2,3,4,5,6,7,8)]
catVarsFac[] <- lapply(catVarsFac, factor)
kamRes <- kamila(conVars, catVarsFac, numClust=5, numInit=10,calcNumClust = "ps",numPredStrCvRun = 10, predStrThresh = 0.5)
kamila中的错误(conVar = conVar [testInd,],catFactor = catFactor [testInd,: 输入数据集必须是数据框
答案 0 :(得分:1)
我认为问题在于该函数假设您同时拥有两种数据类型中的至少两种(即> = 2个连续变量,而> = 2个类别变量)。看起来您提供了一个列索引(conInd = 9,仅列9),因此数据中只有一个连续变量。尝试将另一个连续变量添加到您的连续数据中。
我遇到了同样的问题(分类问题),这种方法为我解决了这个问题。
我认为程序中错误的最终原因是在源代码的170行附近。这是相关的代码段...
numObs <- nrow(conVar)
numInTest <- floor(numObs/2)
for (cvRun in 1:numPredStrCvRun) {
for (ithNcInd in 1:length(numClust)) {
testInd <- sample(numObs, size = numInTest, replace = FALSE)
testClust <- kamila(conVar = conVar[testInd,],
catFactor = catFactor[testInd, ],
numClust = numClust[ithNcInd],
numInit = numInit, conWeights = conWeights,
catWeights = catWeights, maxIter = maxIter,
conInitMethod = conInitMethod, catBw = catBw,
verbose = FALSE)
当代码将数据划分为训练集时,它是从一列data.frame中选择行,但是在这种情况下,默认情况下会返回向量。因此,即使您确实提供了data.frame,您最终还是得到“不是data.frame”。这就是错误的来源。
如果您无法挖掘出另一个变量来添加到数据中,则可以编辑代码,以便在cvRun for循环中对kamila的调用将data.frame()函数包装在任何子集的conVar或catFactor周围,例如
testClust <- kamila(conVar = data.frame(conVar[testInd,]),
catFactor = data.frame(catFactor[testInd,], ... )
,然后将其另存为自己的函数my_kamila,您可以使用它代替。
希望这会有所帮助。