我有两个矩阵。在matrix1中只是值0和255.另一个矩阵具有不同的值。
vec1 <- c(255,0,0,0,255,0,0,255,255,0)
vec2 <- c(0,255,0,255,0,0,255,255,0,0)
vec3 <- c(112,68,235,147,89,56,245,7,119,76)
vec4 <- c(194,158,13,41,182,218,5,78,195,235)
matrix1 <- matrix(c(vec1,vec2,vec1,vec2),10)
matrix2 <- matrix(c(vec3,vec4,vec3,vec4),10)
现在我想为matrix2定义一个阈值,这样就可以了 值0和255。
matrix2[matrix2 > 150] <- 255
matrix2[matrix2 <= 150] <- 0
然后我想从两个矩阵中获得技能分数。 这些是一个阈值但我想拥有技能分数 对于所有阈值(从0到255)。
a <- length(which(matrix1 == 255 & matrix2 == 255))
b <- length(which(matrix1 == 0 & matrix2 == 255))
c <- length(which(matrix1 == 255 & matrix2 == 0))
d <- length(which(matrix1 == 0 & matrix2 == 0))
KSS <- ((a*d)-(b*c))/((a+c)*(b+d))
我尝试使用for循环,但它没有用。
for (i in c(1:255)) {
matrix2[matrix2 >i] <-255
matrix2[matrix2 <= i] <-0
}
感谢您的帮助!
答案 0 :(得分:1)
对于您的阈值矩阵,请使用以下构造:
(matrix2>50)*100
[,1] [,2] [,3] [,4]
[1,] 0 100 0 100
[2,] 100 100 100 100
[3,] 0 0 0 0
[4,] 0 0 0 0
[5,] 100 100 100 100
[6,] 100 0 100 0
[7,] 0 0 0 0
[8,] 0 100 0 100
[9,] 0 100 0 100
[10,] 100 0 100 0
对于a,b,c和d,您可以简化为(并且根本不需要其他阈值矩阵):
a <- sum(!!matrix1 & !!(matrix2>50))
b <- sum(!matrix1 & !!(matrix2>50))
c <- sum(!!matrix1 & !(matrix2>50))
d <- sum(!matrix1 & !(matrix2>50))
答案 1 :(得分:0)
真正的问题是你每次都在循环中改变matrix2
的值,所以在第一次循环之后,所有的值都是0或100,所以不同的阈值无关紧要。这样的事情怎么样?首先,我们可以定义一个KSS
函数,它接受两个矩阵,将它们转换为2x2表并计算KSS值。
KSS <- function(a,b) {
x <- table(factor(a, levels=c(0,100)), factor(b, levels=c(0,100)))
((x[2,2]*x[1,1])-(x[1,2]*x[2,1]))/((x[2,2]+x[2,1])*(x[1,2]+x[1,1]))
}
然后你可以做
kss.val <- sapply(1:100, function(thresh) {
KSS(matrix1, (matrix2 > thresh) * 100)
})
获取每个阈值的KSS值。然后,如果您愿意,可以绘制结果
plot(1:100, kss.val)