假设我有两个连续的向量,例如:
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
?
答案 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>
一般情况下,当您从独立生成的随机变量开始时,您获得中等到高相关的事实应警告您,您的结果是虚假的并且方法可疑。
答案 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
使用渐变搜索而不是网格搜索。我认为这是optim
和optimize
之间的主要区别,这是一个我自己应该检查的明显错误的假设。但是,为了提供使用网格搜索的解决方案,使您更接近全局最大值,可以使用以下内容:
x <- seq(0,0.97,0.01)
x[which.max(sapply(x, findperc, dat=df))]
请注意,我已将x
裁减为97%。这样可确保样本中至少留有3个人(样本量为100)。