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

时间:2016-03-22 15:48:26

标签: r

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

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

2 个答案:

答案 0 :(得分:3)

此问题定义不明确。拿你的示例数据集和你想要找到的函数的最大值(从@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的结果绘制为0到1之间的百分位数。

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

圆圈点表示optimize在@ coffeinjunky的答案中找到的点。这显然只是局部最大值。来自@Thierry的警告的适用性,“你需要重新考虑这个问题。一旦ax和y只包含2个元素,相关性将是1或-1”,应该在图的右侧显而易见。 / p>

一般情况下,当您从独立生成的随机变量开始时,您获得中等到高相关的事实应警告您,您的结果是虚假的并且方法可疑。

plot of findperc at percentiles between 0 and 1

答案 1 :(得分:2)

那么,为什么不从字面上理解你的问题,只是搜索它?例如,尝试:

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。 Webb的回答我了解到optimize使用渐变搜索而不是网格搜索。我认为这是optimoptimize之间的主要区别,这是一个我自己应该检查的明显错误的假设。但是,为了提供使用网格搜索的解决方案,使您更接近全局最大值,可以使用以下内容:

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

请注意,我已将x裁减为97%。这样可确保样本中至少留有3个人(样本量为100)。