ClassifyR是一个框架对于交叉验证的分类和要使用的函数的规则如下表所示。一个完整的示例展示了如何将现有的分类器合并到框架中。函数可以在强制参数集之后有任意数量的其他参数。
的实现k包中的最近邻算法类.它的功能有形式knn(训练,测试,cl, k = 1, l = 0, prob = FALSE,使用。all = TRUE)
.它接受矩阵
或者一个data.frame
变量作为输入,但是ClassifyR调用转换、特征选择和分类器函数DataFrame
的核心Bioconductor数据容器S4Vectors.它还期望训练数据是第一个参数,它的类是第二个参数,测试数据是第三个参数。因此,为DataFrame
创建参数的重新排序。
setMethod("kNNinterface", "DataFrame", function(measurementsTrain, classstrain, measurementsTest,…), verbose = 3) {splitDataset <- .splitDataAndOutcomes(measurementsTrain, classstrain) trainingMatrix <- as.matrix(splitDataset[["measurements"]]) test <- test[, isNumeric, drop = FALSE] if(!requireNamespace("class", quiet = TRUE)) stop("包'class'找不到。"if(verbose == 3) message("拟合k个最近邻分类器到数据和预测类。")class::knn(as.matrix(measurementsTrain), as.matrix(measurementsTest), measurementsTest,…)})
该函数仅在以下情况下发出进度消息详细的
是3。在介绍性小插图中解释了详细程度。.splitDataAndOutcomes
内部函数在吗ClassifyR这能确保结果不出来测量
当进行模型训练时。如果classesTrain
是因子向量,则函数没有作用。如果classesTrain
列的字符名是否在measurementsTrain
,该列将从表中删除,并作为一个单独的变量返回。的...
参数捕获要传递到的任何选项然而,
,例如k
(考虑的邻居数量)和l
例如,一个明确的决定需要最少的投票。该函数也是防御性的,它从输入表中删除任何非数字列。
ClassifyR也接受矩阵
和一个MultiAssayExperiment
作为输入。为这些输入提供方便的方法,将它们转换为DataFrame
.这样,才有了DataFrame
版本的kNNinterface
进行分类。
setMethod("kNNinterface", "matrix", function(measurementsTrain, classstrain, measurementsTest,…){kNNinterface(DataFrame(measurementsTest, check.names = FALSE), classstrain, DataFrame(measurementsTest, check.names = FALSE),…)})setMethod("kNNinterface", "MultiAssayExperiment", function(measurementsTrain, measurementsTest, targets = names(measurementsTrain), classstrain,…){tablesAndClasses <- .MAEtoWideTable(measurementsTrain, targets,classstrain) trainingTable <- tablesAndClasses[["dataTable"]] classes <- tablesAndClasses[["outcomes"]] testingTable <- .MAEtoWideTable(measurementsTest, targets) .checkVariablesAndSame(trainingTable, testingTable) kNNinterface(trainingTable, classes, testingTable,…)})
的矩阵
方法只涉及到输入矩阵的转置ClassifyR期望在行中存储特征,在列中存储样本(在生物信息学中习惯),并将它们转换为DataFrame
,它为a分派到kNNinterface方法DataFrame
,进行分类。
的转换MultiAssayExperiment
更复杂。ClassifyR有一个内部函数.MAEtoWideTable
它将MultiAssayExperiment
到一个广泛的DataFrame
.目标
指定转换中要包括哪些检测。默认情况下,它还可以过滤结果表,使其只包含数值变量。内部效度函数.checkVariablesAndSame
检查过滤后至少有一列,并且训练表和测试表具有相同数量的变量。
创建一个包含10个样本和10个特征的数据集,这两个类之间有明显的区别。运行免删减交叉验证。
classes <- factor(rep(c("Healthy", "Disease"),各= 5),levels = c("Healthy", "Disease")) measurements <- matrix(c(rnorm(50,10), rnorm(50,5)), ncol = 10) colnames(measurements) <- paste("Sample", 1:10) rownames(measurements) <- paste("mRNA", 1:10) library(ClassifyR) knnParams <- ModellingParams(selectParams = NULL, trainParams = trainParams (kNNinterface), predictParams = NULL) CVparams <- CrossValParams(" leave -k- out ", leave = 1) classified <- runTests(measurements, classes, CVparams,knnParams)分类
类ClassifyResult的对象。##特征:##特征值##分类器名称k最近邻##交叉验证省略1 ##特征:特征标识符长度为10的列表。##预测:10行的数据帧。##性能度量:尚未计算。
cbind(预测(分类),已知=实际结果(分类))
样本亚群已知## 1 mRNA 1 1疾病健康## 2 mRNA 2 2疾病健康## 3 mRNA 3 3健康健康## 4 mRNA 4 4疾病健康## 5 mRNA 5 5疾病健康## 6 mRNA 6 6疾病疾病## 7 mRNA 7 7健康疾病## 8 mRNA 8 8疾病疾病## 9 mRNA 9 9疾病疾病## 10 mRNA 10 10健康疾病
零
而不是指定一个函数PredictParams
因为一个函数负责训练和预测。对于这个简单的任务,分类器正确地预测了所有样本。
这个论点详细的是从小牛因此它们必须处理它,即使没有显式地使用它。在ClassifyR框架,详细的是一个数字,指示要打印的进度消息的数量。如果verbose为0,则不打印任何进度消息。如果是1,则每完成10个交叉验证,只打印一条消息。如果它是2,除了当它是1时打印的消息外,每次完成分类的一个阶段(转换、特征选择、训练、预测)时,都会打印一条消息。如果是3,除了为值1和2打印消息外,还从分类函数本身打印进度消息。
每个包含的转换、选择、训练和预测函数的一个版本通常用于(1)一个数字矩阵,其中行为特征,列为样本(生物信息学中的数据存储约定)和一个与矩阵列数相同长度的因子向量(2)ADataFrame其中列是自然的特征,可能是不同的数据类型(即分类和数字),行是样本,类规范和(3)MultiAssayExperiment中存储样例类信息的colData槽的DataFrame列名为“class”。对于不是的输入(1和3)DataFrame时,它们被转换为a,因为其他数据类型可以存储为aDataFrame不丢失信息和变换,选择和分类函数所接受的DataFrame包含执行实际计算的代码。至少,新函数必须有一个带a的方法DataFrame作为样本类的输入,要么存储在名为“class”的列中,要么作为因子向量提供。虽然不是必需的,但提供一个接受带有因子向量的数字矩阵的函数版本和另一个接受MultiAssayExperiment的函数版本,以提供输入数据的灵活性是可取的。如果打算实现与分类相关的新函数,请参阅包中现有函数的代码以获得此类示例ClassifyR.