在R中找到两个密度的交点

时间:2014-01-19 02:02:49

标签: r

我有两个密度重叠,如附图所示。我想找出这两条线相遇的地方。我该怎么做呢?

Density Plot

这是产生图像的代码:

... #reading in files etc.
pdf("test-plot.pdf")
d1 <- density(somedata) 

d2 <- density(someotherdata)

plot(d1)

par(col="red")
lines(d2)

dev.off()

原始数据只是两个单维向量,所以我感兴趣的是它们密度的交叉点。

我尝试使用here中显示的解决方案,但不幸的是,它既没有给我一个数字,也没有正确地绘制线条:

Doesn't work for me

修改: I have found what I was looking for

4 个答案:

答案 0 :(得分:3)

# create and plot example data
set.seed(1)
plotrange <- c(-1,8)
d1 <- density(rchisq(1000, df=2), from=plotrange[1], to=plotrange[2])
d2 <- density(rchisq(1000, df=3)-1, from=plotrange[1], to=plotrange[2])
plot(d1)
lines(d2)

# look for points of intersection
poi <- which(diff(d1$y > d2$y) != 0) 

# Mark those points with a circle:
points(x=d1$x[poi], y=d1$y[poi], col="red")

# or with lines:
abline(v=d1$x[poi], col="orange", lty=2)
abline(h=d1$y[poi], col="orange", lty=2)

答案 1 :(得分:2)

intersect(x,y)

请参阅此help file

例如:如果您的数据位于相同的data.frame df

intersect(df$col1, df$col2)

答案 2 :(得分:2)

这是一个用一个例子来扩展约翰答案的小例子。

require(ggplot2)
require(reshape2)

set.seed(12)
df <- data.frame(x = round(rnorm(100, 20, 10),1), y = round((100/log(100:199)),1))
str(df)
# 'data.frame': 200 obs. of  2 variables:
#  $ variable: Factor w/ 2 levels "x","y": 1 1 1 1 1 1 1 1 1 1 ...
#  $ value   : num  16.8 25.7 20.5 22 19 ...

# Melt and plot
mdf <- melt(df)
ggplot(mdf) +
  geom_density(aes(x = value, color = variable))

enter image description here

# Find points that intersect  
intersect(df$x, df$y)
# [1] 18.9 20.1 21.3 21.5 21.0 19.6 19.0 20.0 19.8

# To make the answer more complete, here is the source code of intersect.
function (x, y) 
{
    y <- as.vector(y)
    unique(y[match(as.vector(x), y, 0L)])
}
<bytecode: 0x10285d400>
<environment: namespace:base>
> 

# It's actually posible to use unique and match to produce the same output
unique(as.vector(df$y)[match(as.vector(df$x), df$y, 0L)])
# [1] 18.9 20.1 21.3 21.5 21.0 19.6 19.0 20.0 19.8!

答案 3 :(得分:2)

我确定你的答案是正确的,但是最终对我有用的是:

d1$x[abs(d1$y-d2$y) < 0.00001 && d1$x < 1000 && d1$x > 500]

(因为我真的只需要找出一个价值而且是一个R新手,因为我很难理解你的答案,因为我甚至不了解最基本的R概念。谢谢你的帮助抱歉。