gpt4 book ai didi

R:从 lapply 对象中提取循环元素

转载 作者:行者123 更新时间:2023-11-30 09:32:19 25 4
gpt4 key购买 nike

简而言之:有没有办法循环遍历下面描述的 lapply 对象的每个元素 allModelsResults

意思是,allModelsResults$'1' 例如给我对象的第一个元素。接下来的 allModelsResults$'2' 将是第二个元素。我想创建一个 for 循环来提取每个元素,运行一些命令并存储结果。

详细说明如下...

我有以下代码,其中我使用“knn”跨多个模型规范运行一个简单的 ML 模型。模型规范存储在allModelList中,所有结果存储在allModelsResults中。

所有模型列表中的单个模型如下所示:

y ~ x1 + x2 + x3

y ~ x1 + x5 + x4

等等……总之就是一系列型号规范的组合

allModelsResults <- lapply(allModelsList, function(x) train(x,       data=All_categories_merged_done,method = "knn"))

我现在想一一提取每个元素(每个模型的结果)以进行分析。例如我可以手动获取:

allModelsResults$'1' 从第一个模型获取结果,或 allModelsResults$'5' 从第五个模型获取结果,依此类推。

理想情况下,我会在 for 循环中循环遍历这些元素,每次选择其中一个元素时都会运行一系列命令。

有关如何从 allModelsResults 对象中提取元素的任何帮助都会非常有帮助!我有大约 50 个模型规范,因此我需要创建一个循环或类似的东西来自动一一提取。

特别是为了与社区分享,对于每个元素,我想为每个模型一一进行此操作。

作为示例,我在这里提取模型 1(这显然不起作用):

aggregate_results <- NULL

for(z in 1:length(categories)){
element_number_ID <- (element_number[z])

element_number_ID 应等于 '1' 以提取正确的模型

    model_1_result <- allModelsResults$'1'

ResultsTestPred <- predict(model_1_result, testing_data)
results_to_store <- confusionMatrix(ResultsTestPred, testing_data $outcome)

aggregate_results <- rbind(aggregate_results, results_to_store)

}
一个元素的

results_to_store 输出如下所示:

混淆矩阵和统计

      Reference

预测 0 1 0 14 2 1 4 19

           Accuracy : 0.8462          
95% CI : (0.6947, 0.9414)
No Information Rate : 0.5385
P-Value [Acc > NIR] : 0.00005274

Kappa : 0.688

麦克尼马尔测试 P 值:0.6831

        Sensitivity : 0.7778          
Specificity : 0.9048
Pos Pred Value : 0.8750
Neg Pred Value : 0.8261
Prevalence : 0.4615
Detection Rate : 0.3590

检测率:0.4103
平衡精度:0.8413

   'Positive' Class : 0       

我想要保存每个元素/模型的准确度值。这样我就可以比较每个模型规范的准确性。

任何见解将不胜感激!

最佳答案

您似乎想要获得每个模型的预测和混淆矩阵。没有可重复的示例并且存在一些令人困惑的术语,我正在做很多猜测,但我认为我理解你想要什么(或足够接近)。我将向您展示如何使用 lapplyMap 来完成此操作,然后我们也可以使用 for 循环来完成此操作。

首先,对测试数据进行预测。所有这些方法都是完全相同的:

# lapply way
predictions = lapply(allModelsList, predict, newdata = testingdata)

# for loop way
predictions = list()
for (i in 1:length(allModelsList)) {
predictions[[i]] = predict(allModelsList[[i]], newdata = testingdata)
}

# manual way - just so you understand exactly what's going on
predictions = list(
predict(allModelsList[[1]], newdata = testingdata),
predict(allModelsList[[2]], newdata = testingdata),
predict(allModelsList[[3]], newdata = testingdata),
...
)

现在,predictions 是一个 list,因此我们使用 [[ 访问每个元素。第一个是 predictions[[1]],如果我们想定义某个变量,则第一个 kpredictions[[k]] k (就像在循环中使用)。我们还可以添加描述性名称并使用名称而不是索引。

类似地,我们可以计算所有的混淆矩阵:

# lapply way
conf_matrices = lapply(predictions, confusionMatrix, reference = testingdata$outcome)

# for loop way
conf_matrices = list()
for (p in 1:length(predictions)) {
conf_matrices[[p]] = confusionMatrix(p, reference = testingdata$outcome)
}

# manual way (for illustration)
conf_matrices = list(
confusionMatrix(predictions[[1]], reference = testingdata$outcome),
confusionMatrix(predictions[[2]], reference = testingdata$outcome),
...
)

同样,我们有一个列表。第一个混淆矩阵是 conf_matrices[[1]] ,与上面相同。

希望这可以帮助我们了解如何使用 lapplyfor 循环来创建列表。

<小时/>

现在,在问题的底部,您似乎暗示了混淆矩阵的“准确性”部分。我运行了帮助页面 ?confusionMatrix 底部的示例并查看了结果。对结果运行 str(conf_mat) 表明它是一个 list,并且列表的 "overall" 元素是一个命名的向量,包括“准确性”。因此,对于单个混淆矩阵 cm,我们可以使用 cm[["overall"]]["Accuracy"] 提取准确度。我们使用 [[ 作为 list 部分,使用 [ 作为常规向量部分。 (我们也可以使用 cm$overall["Accuracy"]。当我们给它确切的名称、没有引号、没有变量时,$ 就可以工作。你的很多问题似乎与尝试将 $ 与引号或变量一起使用有关。您就是不能这样做。请参阅 fortunes::fortune(312))。

因此,我们可以从混淆矩阵列表中提取准确性:

# I use *s*apply here so the result will be *s*implified into a vector
acc = sapply(conf_matrices, function(cm) cm[["overall"]]["Accuracy"])

acc = numeric(length(conf_matrices))
for (i in 1:length(conf_matrices)) {
acc[i] = conf_matrices[[i]][["overall"]]["Accuracy"]
}

或者,如果您从一开始就知道您只想要准确性,我们可以直接到达那里,而无需保存中间步骤:

# apply
acc = sapply(allModelsList, function(x) {
pred = predict(x, newdata = testingdata)
cm = confusionMatrix(pred, reference = testingdata$outcome
return(cm[["overall"]]["Accuracy"]
}
)

# for 循环 acc = 数字(长度(allModelsList)) for (i in 1:length(allModelsList)) { pred = 预测(allModelsList[[i]], newdata = 测试数据) cm = 混淆矩阵(pred, 引用 = 测试数据$结果 acc[i] = (cm[["总体"]]["准确度"] }

<小时/>

注释:如上所述,如果没有可重现的示例,我会猜测很多,并且这些都没有经过测试,因为我没有任何输入可以测试。我假设我在您的问题中看到的各个步骤(例如我们想要预测 allModelResults 的每个元素)是正确的。 (如果是这样,那么,fittedModels 似乎是一个比 allModelResults 更好的名称。)我不知道“模型规范”是什么意思,并且我不知道 allModelList 中有什么,但希望这为您提供了足够的使用列表的示例,以便您可以解决任何问题。 (也可能存在括号不匹配或括号缺失的情况。)

lapplysapplyfor 循环更方便,可以减少输入次数,但它们实际上并没有什么不同。他们设置一个对象来保存结果,然后填充它。如果您想同时创建多个结果,您可能只想使用 for 循环。随着内部步骤数变长,无论如何调试 for 循环都会变得更容易。使用您喜欢且对您有意义的内容。

关于R:从 lapply 对象中提取循环元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53242723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com