0

当我尝试创建一个双循环来填充矩阵工作时,我的工作流程中遇到了一些问题。在我的脚本开始时,我定义:

Tijd_SAT_i <- c("08", "09", "10", "11", "12", "13", "14") 
D <- c(0, 0.01, 0.02, 0.03, 0.04, 0.05)
POD <- matrix(1:(length(Tijd_SAT_i)*length(D)), c(length(Tijd_SAT_i), length(D)))
FAR <- matrix(1:(length(Tijd_SAT_i)*length(D)), c(length(Tijd_SAT_i), length(D)))

之后创建“BASE”(86 x 42 x 7 阵列)和“SAT”(86 x 42 x 7 阵列)的大量内容。BASE 和 SAT 都包含 0 到 22 之间的值作为双精度值,并且具有 NA 值(NA 值构成了荷兰的轮廓以及除此之外的所有内容)。接下来,我需要填充两个矩阵 POD(检测概率)和 FAR(误报率​​)对于每小时 (Tijd_SAT_i) 我想计算 6 个不同的阈值及其对 POD 和 FAR 的影响。稍后我会将这些值放入数据框中,然后使用 RGL 绘制它们。我编写的填充 POD 和 FAR 的代码是:

for (k in 1:(length(Tijd_SAT_i))) {
  for (l in 1:(length(D))) {
    pre_C_BASE <- BASE[,,k]
    pre_C_SAT <- SAT[,,k]
    pre_C_BASE[pre_C_BASE >= D[l]] <- 1
    pre_C_BASE[pre_C_BASE < D[l]] <- 0
    pre_C_SAT[pre_C_SAT >= D[l]] <- 1
    pre_C_SAT[pre_C_SAT < D[l]] <- 0
    C_SAT <- as.vector(SAT)
    C_BASE <- as.vector(BASE)
    C_table <- (with(warpbreaks, table(C_SAT, C_BASE)))      
    print(C_table)
    print(dim(C_table))
    #p <- C_table[1, 1]/(C_table[1, 1]+C_table[2, 1])
    #f <- C_table[1, 2]/(C_table[1, 1]+C_table[1, 2])
    #POD[k, l] <- p
    #FAR[k, l] <- f
  }
}

但是由于某种模糊的原因,C_table 并没有变成 2 x 2 矩阵,而是 1237 x 3351 矩阵。因此无法执行#s 后面的内容。我在哪里错了?

编辑:我发现 2 × 2 矩阵未显示的原因:错误的参考 SAT 应该是 pre_C_SAT。现在我的权变矩阵已经制作好了(全部 42 个)。现在的问题是,如果我使用#s 运行该位,我会收到“下标越界”错误。这是为什么?

编辑:我认为问题在于“表”并不总是输出 2 x 2 矩阵。

编辑:Pffffrwt。我修好了它。在 table 命令中有一个令人难以置信的烦人的小问题,当输入向量之一中不存在零时,它不会返回 2 x 2 矩阵。我通过将 1, 0, 0, 1 和 1, 0, 1, 0 附加到后续向量来修复它,强制创建所有 4 个值,然后从后续等式中减去 1。

4

2 回答 2

0

在循环的每次迭代中,您定义

C_SAT <- as.vector(SAT)
C_BASE <- as.vector(BASE)

因此C_SATC_BASE将始终是长度等于 和 的维度乘积的SAT向量BASE

然后你定义

C_table <- (with(warpbreaks, table(C_SAT, C_BASE)))

warpbreaks数据框与您的分析有什么关系?您是否从某个地方复制并粘贴了此内容?它对结果没有影响。

无论如何,table(C_SAT, C_BASE)将具有与 in 中唯一值的数量一样多的行和与 in 中唯一值的C_SAT数量一样多的列C_BASE

于 2013-10-02T10:27:11.673 回答
0

我通过将 1, 0, 0, 1 和 1, 0, 1, 0 附加到后续向量,强制创建所有 4 个值,然后从后续等式中减去 1 来解决此问题。

于 2013-10-10T10:33:54.340 回答