如何对向量进行排序并仅使用基于条件的两个相邻值
How to sequence through a vector and only use two adjacent values based on a conditional
一些背景知识:我是一名病毒学家,只涉足 r,所以想通过制作 r TCID50 (tissue-culture infectious dose 50% end-point) calculator based off the Reed-Muench 方法来磨练我的技能(link 可能需要付费)。基本上,它所做的是计算与得分 (positive/negative) 矩阵的比例距离,并找到一个点,在这个点上,50% 的值将为正。数据看起来有点像这样(注意第 3/4 列中的 1/0 转换):
1
2
3
4
5
6
7
1
1
1
0
0
0
0
1
1
1
1
0
0
0
1
1
1
0
0
0
0
1
1
0
0
0
0
0
1
1
1
0
0
0
0
其中每列是传染源稀释系列中的一个步骤,1/0 是 positive/negative。我也有一个 Excel sheet 来做这个,但我喜欢玩 r.
实际数据和包数:
library(tidyverse)
library(FSA)
Scored_Data <- structure(list(X1 = c(0, 0, 0, 0, 0, 0, 0, 0), X2 = c(0, 0, 0,
0, 0, 0, 0, 0), X3 = c(0, 0, 0, 0, 0, 0, 0, 0), X4 = c(0, 0,
0, 0, 0, 0, 0, 0), X5 = c(0, 0, 0, 0, 0, 0, 0, 0), X6 = c(0,
0, 0, 0, 0, 0, 0, 0), X7 = c(0, 0, 0, 0, 0, 0, 0, 0), X8 = c(0,
0, 0, 0, 0, 0, 1, 0), X9 = c(1, 0, 0, 0, 0, 0, 1, 1), X10 = c(1,
1, 1, 1, 1, 1, 0, 1), X11 = c(1, 1, 1, 1, 1, 1, 1, 1), X12 = c(1,
1, 1, 1, 1, 1, 1, 1)), row.names = c(NA, -8L), class = c("tbl_df",
"tbl", "data.frame"))
第一步是使用阳性和阴性的累积总和计算每列的感染率,从阳性到阴性的转变值最低。为此,我使用了包 FSA
中的函数 rcumsum
等式为:
Infection rate = cumulative positive/(cumulative positive + cumulative negative)
我有(有点冗长,我认为绝对可以缩短):
Scored_Data <- as.tibble(Scored_Data)
Neg_Col <- colSums(Scored_Data)
Pos_Col <- colSums(Scored_Data == 0)
Cum_Neg_Col <- cumsum(Neg_Col)
Cum_Pos_Col <- rcumsum(Pos_Col)
Inf_Rate <- Cum_Pos_Col/(Cum_Pos_Col + Cum_Neg_Col)
这给了我
Dput(Inf_Rate)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 0.92857143 0.60000000 0.08333333 0.00000000 0.00000000
现在困难的是计算下一步。为此,我需要找到刚好高于和低于 50% 的值来计算比例距离 (PD)。等式是:
PD = (Value above 0.5 - 0.5)/(Value above 0.5 - Value below 0.5)
在我的数据中,高于 50% 的值为 X9,低于 50% 的值为 X10
我有:
PD <- for (i in Inf_Rate){
for (j in Inf_Rate){
if_else(i >= 0.5 & j < 0.5, (i-0.5)/(i-j), NULL)
}
}
哪个(以我天真的、非数学思维)应该像这样工作...查看数据并找到满足这些条件的值,return PD 或什么都没有。但这只有 returns "NULL".
我确定有办法让它工作,但它是什么?
我不确定您要如何处理其中一个数字恰好为 0.5 的情况。但这是你想要的吗?
Inf_Rate <- c(X1 = 1, X2 = 1, X3 = 1, X4 = 1, X5 = 1, X6 = 1, X7 = 1, X8 = 0.928571428571429,
X9 = 0.6, X10 = 0.0833333333333333, X11 = 0, X12 = 0)
value_above <- min(Inf_Rate[Inf_Rate > 0.5])
value_below <- max(Inf_Rate[Inf_Rate < 0.5])
PD <- (value_above - 0.5)/(value_above - value_below)
一些背景知识:我是一名病毒学家,只涉足 r,所以想通过制作 r TCID50 (tissue-culture infectious dose 50% end-point) calculator based off the Reed-Muench 方法来磨练我的技能(link 可能需要付费)。基本上,它所做的是计算与得分 (positive/negative) 矩阵的比例距离,并找到一个点,在这个点上,50% 的值将为正。数据看起来有点像这样(注意第 3/4 列中的 1/0 转换):
1 | 2 | 3 | 4 | 5 | 6 | 7 |
---|---|---|---|---|---|---|
1 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 0 | 0 | 0 |
1 | 1 | 0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 0 | 0 | 0 | 0 |
其中每列是传染源稀释系列中的一个步骤,1/0 是 positive/negative。我也有一个 Excel sheet 来做这个,但我喜欢玩 r.
实际数据和包数:
library(tidyverse)
library(FSA)
Scored_Data <- structure(list(X1 = c(0, 0, 0, 0, 0, 0, 0, 0), X2 = c(0, 0, 0,
0, 0, 0, 0, 0), X3 = c(0, 0, 0, 0, 0, 0, 0, 0), X4 = c(0, 0,
0, 0, 0, 0, 0, 0), X5 = c(0, 0, 0, 0, 0, 0, 0, 0), X6 = c(0,
0, 0, 0, 0, 0, 0, 0), X7 = c(0, 0, 0, 0, 0, 0, 0, 0), X8 = c(0,
0, 0, 0, 0, 0, 1, 0), X9 = c(1, 0, 0, 0, 0, 0, 1, 1), X10 = c(1,
1, 1, 1, 1, 1, 0, 1), X11 = c(1, 1, 1, 1, 1, 1, 1, 1), X12 = c(1,
1, 1, 1, 1, 1, 1, 1)), row.names = c(NA, -8L), class = c("tbl_df",
"tbl", "data.frame"))
第一步是使用阳性和阴性的累积总和计算每列的感染率,从阳性到阴性的转变值最低。为此,我使用了包 FSA
rcumsum
等式为:
Infection rate = cumulative positive/(cumulative positive + cumulative negative)
我有(有点冗长,我认为绝对可以缩短):
Scored_Data <- as.tibble(Scored_Data)
Neg_Col <- colSums(Scored_Data)
Pos_Col <- colSums(Scored_Data == 0)
Cum_Neg_Col <- cumsum(Neg_Col)
Cum_Pos_Col <- rcumsum(Pos_Col)
Inf_Rate <- Cum_Pos_Col/(Cum_Pos_Col + Cum_Neg_Col)
这给了我
Dput(Inf_Rate)
X1 X2 X3 X4 X5 X6 X7 X8 X9 X10 X11 X12
1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 1.00000000 0.92857143 0.60000000 0.08333333 0.00000000 0.00000000
现在困难的是计算下一步。为此,我需要找到刚好高于和低于 50% 的值来计算比例距离 (PD)。等式是:
PD = (Value above 0.5 - 0.5)/(Value above 0.5 - Value below 0.5)
在我的数据中,高于 50% 的值为 X9,低于 50% 的值为 X10
我有:
PD <- for (i in Inf_Rate){
for (j in Inf_Rate){
if_else(i >= 0.5 & j < 0.5, (i-0.5)/(i-j), NULL)
}
}
哪个(以我天真的、非数学思维)应该像这样工作...查看数据并找到满足这些条件的值,return PD 或什么都没有。但这只有 returns "NULL".
我确定有办法让它工作,但它是什么?
我不确定您要如何处理其中一个数字恰好为 0.5 的情况。但这是你想要的吗?
Inf_Rate <- c(X1 = 1, X2 = 1, X3 = 1, X4 = 1, X5 = 1, X6 = 1, X7 = 1, X8 = 0.928571428571429,
X9 = 0.6, X10 = 0.0833333333333333, X11 = 0, X12 = 0)
value_above <- min(Inf_Rate[Inf_Rate > 0.5])
value_below <- max(Inf_Rate[Inf_Rate < 0.5])
PD <- (value_above - 0.5)/(value_above - value_below)