繁体   English   中英

如何找到一个可以最大化两个向量之间相关系数的百分位数?

[英]How to find a percentile that can maximize the correlation coefficient between two vector?

假设我有两个连续向量,例如:

set.seed(123)
df <- data.frame(x = rnorm(100),
                 y = rnorm(100,3,5))
with(df, cor(x,y))

我的问题是如何找到x的百分位数,以便最大化x和y的绝对相关性,从而:

perc <- quantile(df$x, 0.3)
df1 <- subset(df, x > perc)
with(df1, cor(x,y))

即如何找到perc

这个问题定义不清。 以示例数据集和要查找最大值的函数为例(从@coffeinjunky复制):

set.seed(123)
df <- data.frame(x = rnorm(100),
                 y = rnorm(100,3,5))

findperc <- function(prop, dat) {
  perc <- quantile(dat$x, prop)  
  with(subset(dat, dat$x > perc), abs(cor(x,y)))
}

现在绘制findperc的结果,以findperc 0到1之间的百分位数。

x <- seq(0,1,0.01)
plot(x,sapply(x,findperc,df),type="l")

带圆圈的点表示通过@coffeinjunky的答案中的optimize找到的。 显然,这只是局部最大值。 @Thierry发出的警告的适用性:“您需要重新考虑这个问题。一旦ax和y仅包含2个元素,则相关性将为1或-1”,应该在图的右侧显示出来。

通常,从独立生成的随机变量开始时,您将获得中等到较高的相关性,这一事实应警告您结果是虚假的且可能是方法可疑的。

在0到1之间的百分位数处的findperc图

好吧,为什么不从字面上看您的问题,而只是搜索它? 例如,尝试:

findperc <- function(prop, dat) {
  perc <- quantile(dat$x, prop)  
  with(subset(dat, dat$x > perc), abs(cor(x,y)))
}

optimize(findperc, lower=0, upper=1, maximum=T, dat=df)

这定义了一个函数,该函数根据相应的百分位数(此处是单个值)来计算向量之间的绝对相关性,就像示例代码中一样。 然后,我将此函数提供给线性优化器,该优化器搜索产生最大输出值的输入。


编辑:感谢@A。 我了解到,韦伯的答案是optimize使用梯度搜索而不是网格搜索。 我认为这是optimoptimize之间的主要区别,这是我应该检查自己的明显错误的假设。 但是,仅是为了提供使用网格搜索的解决方案以使您更接近全局最大值,可以使用以下方法:

 x <- seq(0,0.97,0.01)
 x[which.max(sapply(x, findperc, dat=df))]

请注意,我在这里将x削减了97%。 这样可确保至少有3个人留在样本中(样本大小为100)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM