我试图将下面的公式应用于我的每个列表整数。
((TP * TN) - (FP * FN)) / sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))
我正在尝试用pmap
,但似乎无法使计算工作。
数据:
TP <- list(12734L, 12765L, 12842L, 12786L)
FP <- list(262L, 212L, 215L, 198L)
FN <- list(635L, 869L, 943L, 1081L)
TN <- list(869L, 654L, 500L, 435L)
我运行以下命令:
TP <- list(12734L, 12765L, 12842L, 12786L)
FP <- list(262L, 212L, 215L, 198L)
FN <- list(635L, 869L, 943L, 1081L)
TN <- list(869L, 654L, 500L, 435L)
lst1 <- list(TP, FP, FN, TN)
purrr::pmap(lst1, ~ ((..1 * ..4) - (..2 * ..3))/sqrt((..1 + ..2) * (..1 + ..3) * (..4 + ..2) * (..4 + ..3)))
其中产出:
[[1]]
[1] NA
[[2]]
[1] NA
[[3]]
[1] NA
[[4]]
[1] NA
Warning messages:
1: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
NAs produced by integer overflow
2: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
NAs produced by integer overflow
3: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
NAs produced by integer overflow
4: In (..1 + ..2) * (..1 + ..3) * (..4 + ..2) :
NAs produced by integer overflow
发布于 2020-01-19 12:32:30
我们可以将所有list
元素包装在一个list
中
lst1 <- list(TP, FP, FN, TN)
list
元素都是整数类,根据计算结果,*
值将得到非常大的数字,超出了integer
的值范围。可能是应该转换为大整数类或使用numeric
library(purrr)
pmap_dbl(lst1, ~ ((as.numeric(..1) * as.numeric(..4)) -
(as.numeric(..2) * as.numeric(..3)))/
sqrt((as.numeric(..1) + as.numeric(..2)) * (as.numeric(..1) +
as.numeric(..3)) * (as.numeric(..4) + as.numeric(..2)) *
(as.numeric(..4) + as.numeric(..3))))
#[1] 0.6340100 0.5344409 0.4563071 0.4068497
此外,由于list
的长度都相同,所以最好将其转换为vector
,并且作为data.frame的列,我们可以更容易地应用这些函数。
library(dplyr)
library(tidyr)
tibble(TP, FP, FN, TN) %>%
unnest(c(TP, FP, FN, TN)) %>%
mutate_all(as.numeric) %>%
transmute(out = f1(TP, FP, FN, TN))
# A tibble: 4 x 1
# out
# <dbl>
#1 0.634
#2 0.534
#3 0.456
#4 0.407
哪里
f1 <- function(TP, FP, FN, TN) {
((TP * TN) - (FP * FN)) /
sqrt((TP + FP) * (TP+FN) * (TN+FP) * (TN+FN))
}
https://stackoverflow.com/questions/59814091
复制相似问题