给定分布 A 和零分布,如何找到对应于 FDR=0.05 的值?
How to find value that corresponds to FDR=0.05 given distribution A and a null distribution?
我有两个相关向量:一个代表真实相关,另一个代表置换相关(零分布)。我想找到对应于 0.05 FDR 的相关值。
更新方法:
cor_real=rnorm(1000,0,sd=0.2)
cor_null=rnorm(1000,0,sd=0.15)
d_real=density(cor_real,from=max(min(cor_real),min(cor_null)),to=min(max(cor_real),max(cor_null)))
d_null=density(cor_null,from=max(min(cor_real),min(cor_null)),to=min(max(cor_real),max(cor_null)))
# here we ensure that the x values are comparable between the two densities
plot(d_real)
lines(d_null)
然后,要找到对应于 FDR = 0.05 的相关值,我的猜测是:
ratios=d_null$y/d_real$y
d_real$x[which(round(ratios,2)==.05)]
[1] 0.5694628 0.5716372 0.5868581 0.5890325 0.5912069
# this the the correlation value(s) that corresponds to a 5% chance of a false positive
这是正确的方法吗?
例如:
cor_real=rnorm(100,0.25,sd=0.1)
cor_null=rnorm(100,0.2,sd=0.1)
h_real=hist(cor_real,plot=F)
h_null=hist(cor_null,plot=F)
plot(h_null,col=rgb(1,0,0,.5),xlim=c(0,1),ylim=c(0,max(h_real$counts))) # in red
plot(h_real,col=rgb(0,.5,.5,0.25),add=T) # in blue
我认为这是当两个直方图的频率之比 = 0.05 (null:real) 时,但我对此不是 100% 确定。
如何找到对应于 FDR = 0.05 的相关值,同时“访问”空分布和实分布?
密度不太正确,因为 1. 您没有将 n
和 from, to
设置为相同,2. 它计算的假阳性数/假阴性数仅为 1 bin.
错误发现率定义为 FP / (FP + TP)。也请参阅此 post。一旦我们将两个相关性放在同一个向量中,标记并排序它们,我们就可以计算这个:
set.seed(321)
cor_real=rnorm(1000,0,sd=0.2)
cor_null=rnorm(1000,0,sd=0.15)
df = data.frame(rho = c(cor_real,cor_null),
type = rep(c(TRUE,FALSE),each=1000))
df$rho = abs(df$rho)
df = df[order(df$rho,decreasing=TRUE),]
df$FP = cumsum(df$type == FALSE)
df$TP = cumsum(df$type == TRUE)
df$FDR = df$FP / (df$FP + df$TP)
如果您查看结果,
head(df,25)
rho type FP TP FDR
366 0.5822139 TRUE 0 1 0.00000000
247 0.5632078 TRUE 0 2 0.00000000
298 0.5594879 TRUE 0 3 0.00000000
147 0.5460875 TRUE 0 4 0.00000000
781 0.5373146 TRUE 0 5 0.00000000
760 0.5367116 TRUE 0 6 0.00000000
797 0.5216281 TRUE 0 7 0.00000000
569 0.5204598 TRUE 0 8 0.00000000
374 0.5200687 TRUE 0 9 0.00000000
744 0.5101275 TRUE 0 10 0.00000000
864 0.5058457 TRUE 0 11 0.00000000
227 0.4997959 TRUE 0 12 0.00000000
66 0.4993164 TRUE 0 13 0.00000000
14 0.4886520 TRUE 0 14 0.00000000
830 0.4840573 TRUE 0 15 0.00000000
261 0.4765394 TRUE 0 16 0.00000000
1163 0.4703764 FALSE 1 16 0.05882353
27 0.4661862 TRUE 1 17 0.05555556
965 0.4633883 TRUE 1 18 0.05263158
530 0.4608271 TRUE 1 19 0.05000000
96 0.4575683 TRUE 1 20 0.04761905
851 0.4563224 TRUE 1 21 0.04545455
922 0.4516161 TRUE 1 22 0.04347826
343 0.4511517 TRUE 1 23 0.04166667
在 abs(rho) >= 0.4511517 时,您有 1 个 FP 和 23 个 TP,使您的 FDR 为 0.0416..低于 FDR 0.05。所以你可以在这里设置你的绝对截止值。
你的例子很难测试,因为两者几乎是相同的原假设,只是 sd 不同。在现实生活中,我们很可能需要模拟数据来找到我们在零假设下获得的相关性。你会发现上面的计算应该运行得很好。
我有两个相关向量:一个代表真实相关,另一个代表置换相关(零分布)。我想找到对应于 0.05 FDR 的相关值。
更新方法:
cor_real=rnorm(1000,0,sd=0.2)
cor_null=rnorm(1000,0,sd=0.15)
d_real=density(cor_real,from=max(min(cor_real),min(cor_null)),to=min(max(cor_real),max(cor_null)))
d_null=density(cor_null,from=max(min(cor_real),min(cor_null)),to=min(max(cor_real),max(cor_null)))
# here we ensure that the x values are comparable between the two densities
plot(d_real)
lines(d_null)
然后,要找到对应于 FDR = 0.05 的相关值,我的猜测是:
ratios=d_null$y/d_real$y
d_real$x[which(round(ratios,2)==.05)]
[1] 0.5694628 0.5716372 0.5868581 0.5890325 0.5912069
# this the the correlation value(s) that corresponds to a 5% chance of a false positive
这是正确的方法吗?
例如:
cor_real=rnorm(100,0.25,sd=0.1)
cor_null=rnorm(100,0.2,sd=0.1)
h_real=hist(cor_real,plot=F)
h_null=hist(cor_null,plot=F)
plot(h_null,col=rgb(1,0,0,.5),xlim=c(0,1),ylim=c(0,max(h_real$counts))) # in red
plot(h_real,col=rgb(0,.5,.5,0.25),add=T) # in blue
我认为这是当两个直方图的频率之比 = 0.05 (null:real) 时,但我对此不是 100% 确定。
如何找到对应于 FDR = 0.05 的相关值,同时“访问”空分布和实分布?
密度不太正确,因为 1. 您没有将 n
和 from, to
设置为相同,2. 它计算的假阳性数/假阴性数仅为 1 bin.
错误发现率定义为 FP / (FP + TP)。也请参阅此 post。一旦我们将两个相关性放在同一个向量中,标记并排序它们,我们就可以计算这个:
set.seed(321)
cor_real=rnorm(1000,0,sd=0.2)
cor_null=rnorm(1000,0,sd=0.15)
df = data.frame(rho = c(cor_real,cor_null),
type = rep(c(TRUE,FALSE),each=1000))
df$rho = abs(df$rho)
df = df[order(df$rho,decreasing=TRUE),]
df$FP = cumsum(df$type == FALSE)
df$TP = cumsum(df$type == TRUE)
df$FDR = df$FP / (df$FP + df$TP)
如果您查看结果,
head(df,25)
rho type FP TP FDR
366 0.5822139 TRUE 0 1 0.00000000
247 0.5632078 TRUE 0 2 0.00000000
298 0.5594879 TRUE 0 3 0.00000000
147 0.5460875 TRUE 0 4 0.00000000
781 0.5373146 TRUE 0 5 0.00000000
760 0.5367116 TRUE 0 6 0.00000000
797 0.5216281 TRUE 0 7 0.00000000
569 0.5204598 TRUE 0 8 0.00000000
374 0.5200687 TRUE 0 9 0.00000000
744 0.5101275 TRUE 0 10 0.00000000
864 0.5058457 TRUE 0 11 0.00000000
227 0.4997959 TRUE 0 12 0.00000000
66 0.4993164 TRUE 0 13 0.00000000
14 0.4886520 TRUE 0 14 0.00000000
830 0.4840573 TRUE 0 15 0.00000000
261 0.4765394 TRUE 0 16 0.00000000
1163 0.4703764 FALSE 1 16 0.05882353
27 0.4661862 TRUE 1 17 0.05555556
965 0.4633883 TRUE 1 18 0.05263158
530 0.4608271 TRUE 1 19 0.05000000
96 0.4575683 TRUE 1 20 0.04761905
851 0.4563224 TRUE 1 21 0.04545455
922 0.4516161 TRUE 1 22 0.04347826
343 0.4511517 TRUE 1 23 0.04166667
在 abs(rho) >= 0.4511517 时,您有 1 个 FP 和 23 个 TP,使您的 FDR 为 0.0416..低于 FDR 0.05。所以你可以在这里设置你的绝对截止值。
你的例子很难测试,因为两者几乎是相同的原假设,只是 sd 不同。在现实生活中,我们很可能需要模拟数据来找到我们在零假设下获得的相关性。你会发现上面的计算应该运行得很好。