我有两个变量。一个连续(范围从-2到2)和一个二分(A和B)。这两个变量与编码为" B"的大多数变量高度相关。积极的,大多数变量编码为" A"负面的。我想计算r中两个变量之间重叠的比例。或者我想知道在连续标度上最负面的观察之间有多少观察结果被编码为" B"在连续尺度上的二分尺度和最积极的观察,编码为" A"在二分法上。
在r中解决这个问题的最佳方法是什么?
例如,如果我有以下数据:
Continous Variable Dichotmous Variable
.189 B
-.7 A
.5 B
-.3 A
-.5 A
-.1 B
.2 A
-.05 A
因为具有最低值-1的B变量和具有最高值的A变量是.2,所以我想计算这两个值之间的观察数。在这种情况下,它将是25%,因为我有两个观察结果在总共8个观测值中重叠。
运行循环是最好的方法吗?
如果没有明确说明,我会事先道歉,我感谢您提供的任何建议。
答案 0 :(得分:0)
df <- data.frame(cont=c(0.189,-0.7,0.5,-0.3,-0.5,-0.1,0.2,-0.05),dich=c('B','A','B','A','A','B','A','A'));
(sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L)/nrow(df)*100;
## [1] 25
让我们一次打破一件:
min(df$cont[df$dich=='B'])
## [1] -0.1
获取B组的最小连续值。
max(df$cont[df$dich=='A'])
## [1] 0.2
获取A组的最大连续值。
c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A']))
## [1] -0.1 0.2
将两个值组合成一个双元素向量。
请注意,我没有在我的解决方案中包含任何用于检查此双元素向量是否确实按升序排序的规定。在你的问题中似乎假设最小的B值将小于最大的A值;该假设有效地嵌入我的解决方案中。如果您需要检查它,您必须首先预先计算这两个值并检查它们的顺序。如果违反了该假设,则必须避免运行解决方案的其余部分,因为Muenchian method会因无效而失败(由于未按升序排序)vec
。
findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))
## [1] 1 0 2 0 0 1 2 1
找出最小B下面的元素(0),最小B和最大A之间的(1),以及最大A之上的(2)。我们正在寻找1。
findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L
## [1] TRUE FALSE FALSE FALSE FALSE TRUE FALSE TRUE
测试哪个间隔为1。
sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)
## [1] 3
计算1的间隔数。
请注意,我们得到3而不是2,因为findInterval()
默认包含区间的下限,因此最小的B值匹配。我们将在下一步中减去不需要的匹配。
如果您需要对端点进行不同的处理,可以尝试使用rightmost.closed
的{{1}},all.inside
和left.open
参数来获取所需内容。
findInterval()
减去1以删除最小的B值,因为我们要将其排除。
sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L
## [1] 2
除以data.frame中的总行数以获得分数。
(sum(findInterval(df$cont,c(min(df$cont[df$dich=='B']),max(df$cont[df$dich=='A'])))==1L)-1L)/nrow(df)
## [1] 0.25
乘以100得到一个百分比。