# Loading necessary libraries library(openxlsx) library(vcd)# Reading the Excel data AccData <- read.xlsx("D:/R_proj/a绘图demo/bKappa/五指山生态系统分类精度评价一二级类.xlsx",sheet = 1, colNames = T)# Handle missing values (replace NA with 0) AccData[is.na(AccData)] <- 0 AccMatrix <- data.matrix(AccData[1:nrow(AccData), 2:ncol(AccData)])# Extract diagonal and total sum,提取对角线和总和 MatDiag <- diag(AccMatrix) TotalNum <- sum(AccMatrix)# Overall accuracy,总体精度 (OA) OA <- sum(MatDiag) / TotalNum# Kappa coefficient,计算Kappa系数,用vcd包中的函数 K <- Kappa(AccMatrix)# Calculate Kappa manually,手动计算Kappa系数 colFreqs <- colSums(AccMatrix) / TotalNum colFreqs rowFreqs <- rowSums(AccMatrix) / TotalNum rowFreqs p0 <- sum(MatDiag) / TotalNum pe <- crossprod(colFreqs, rowFreqs)[1] k2 <- (p0 - pe) / (1 - pe)# Calculate mapping accuracy and user accuracy mapping_accuracy <- data.frame(Class = character(), MappingAccuracy = numeric()) user_accuracy <- data.frame(Class = character(), UserAccuracy = numeric())for (i in 1:nrow(AccMatrix)) {PA <- AccMatrix[i, i] / sum(AccMatrix[, i])UA <- AccMatrix[i, i] / sum(AccMatrix[i, ])# Append results to data framesmapping_accuracy <- rbind(mapping_accuracy, data.frame(Class = AccData[i, 1], MappingAccuracy = PA))user_accuracy <- rbind(user_accuracy, data.frame(Class = AccData[i, 1], UserAccuracy = UA))print(paste(AccData[i, 1], "制图精度为", PA * 100, "%"))print(paste(AccData[i, 1], "用户精度为", UA * 100, "%")) }# Output overall classification accuracy and Kappa coefficient print(paste("总体分类精度为", OA * 100, "%")) print(paste("Kappa系数为", K[["Unweighted"]][["value"]] * 100, "%"))# Save results to Excel output_file <- "D:/R_proj/a绘图demo/bKappa/classification_accuracy_results1.xlsx" write.xlsx(list("Mapping Accuracy" = mapping_accuracy,"User Accuracy" = user_accuracy,"Overall Accuracy" = data.frame(OverallAccuracy = OA * 100),"Kappa Coefficient" = data.frame(Kappa = K[["Unweighted"]][["value"]] * 100) ), file = output_file)print(paste("Results saved to", output_file))
混淆矩阵:
结果: