On 07/07/11 08:43, Data Analytics Corp. wrote:
Hi,
Suppose I have two vectors, not necessarily the same length (in fact,
they usually are different lengths): y.1 that has increasing values
between 0 and 1; y.2 that has decreasing values between 1.0 and 0.
You can picture these as being supply (= y.1) and demand (= y.2)
curves from economics. I typically plot these vectors on the same
graph against a common x variable, which happens to be price for what
I do. The price variable runs from, say, $0 to $25. When I plot y.1
and y.2, I've been eye-balling a vertical line at a price point where
y.1 intersects y.2. I'm now tired of eye-balling a line through the
intersection -- takes too much time to get it right or just close
enough. I can't figure out how to find the price value at which the
two curves intersect. Going back to the economics interpretation, I
want the price where supply equals demand. Any suggestions as to how
I can find that price point in R? Any functions that help?
There will actually be two pairs of points, one pair on the price curve
and one
pair on the demand curve, so that the intersection of the two curves
lies between
the respective pair on each curve. Without an algebraic expression for
the curves,
that's all you can say. The following function joins the respective
pairs of points
findInt <- function (x1,y1,x2,y2,plot=FALSE) {
#
# x1 and y1 are the coordinates of the points on the INCREASING curve.
# x2 and y2 are the coordinates of the points on the DECREASING curve.
#
y1star <- approx(x2,y2,xout=x1,yleft=Inf,yright=-Inf)$y
k <- sum(y1 <= y1star)
y2star <- approx(x1,y1,xout=x2,yleft=-Inf,yright=Inf)$y
ell <- sum(y2 >= y2star)
b1 <- y1[k]
b2 <- y2[ell]
m1 <- (y1[k+1] - y1[k])/(x1[k+1] - x1[k])
m2 <- (y2[ell+1] - y2[ell])/(x2[ell+1] - x2[ell])
x <- (b1-b2-m1*x1[k]+m2*x2[ell])/(m2-m1)
y <- b1 + m1*(x-x1[k])
if(plot) {
plot(x1,y1,xlim=range(x1,x2),ylim=range(y1,y2))
points(x2,y2,col="red")
segments(x1[k],y1[k],x1[k+1],y1[k+1])
segments(x2[ell],y2[ell],x2[ell+1],y2[ell+1])
points(x,y,pch=20)
}
c(x=x,y=y)
}
by straight lines and finds the point of intersection of the two lines.
This is probably
pretty similar to the point you'd get by eye-balling the data.
cheers,
Rolf Turner
______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.