[R] Intersection for two curves

Muhammad Rahiz muhammad.rahiz at ouce.ox.ac.uk
Sat Apr 24 14:10:44 CEST 2010


Thanks again David,

I've made the changes. The optimize() function works alright but it does 
not give me the intersection. I suspect it must have to do with the 
user-defined function which I am totally clueless and am inexperienced 
with. Mind showing the way.

Thanks again and thanks for your patience...

*   s1         cm
1    0 0.57223196
2   10 0.33110049
3   20 0.11163181
4   30 0.10242237
5   40 0.09254315
6   50 0.02739370
7   60 0.02567137
8   70 0.02492397
9   80 0.03206637
10  90 0.02487381
11 100 0.01747584
12 110 0.15977533
13 120 0.13317708

x<- read.table("test.data.txt",header=TRUE)
ds <- x[,2] ; cr <- x[,3]
plot(ds,cr)

fc <- function(x,a,b){a*exp(-b*x)}   
fm <- nls(cr ~ fc(ds,a,b),start=c(a=1,b=0))
co <- coef(fm)
curve(fc(x,a=co[1],b=co[2]),add=TRUE,col="red",lwd=1.5)

n <- 1/2.71

int <- function(x) {coef(fm)[1] + x*coef(fm)[2]}
in1 <- optimize(f=function(x) abs(int(x)-n),c(0,120))

abline(v=in1$minimum,col="red",lty=2)
abline(h=n,col="red",lty=2)

Muhammad



David Winsemius wrote:
> On Apr 23, 2010, at 8:06 PM, Muhammad Rahiz wrote:
>
>   
>> Thanks David & Peter,
>>
>> The locator() works but not practical as I have to repeat the  
>> process many times.
>>
>> Does the code works on linear regression only?
>>     
>
> Should work for any process that can produce a function.
>
>   
>> When i tried to find the intersection at a non-linear curve, i get  
>> the following error
>> Error in optimize(f = function(x) abs(xyf(ds) - n), c(0, 13)) :
>>  invalid function value in 'optimize'
>>     
>
> Why did you did not change the name of the function?
> And the code below would not have produced that error, so why did you  
> post it?
>
>   
>> I'd like to know what the error means and how I can correct it.
>>
>> I have my sample data and code as follows;
>>
>>
>> *   s1         cm
>> 1    0 0.57223196
>> 2   10 0.33110049
>> 3   20 0.11163181
>> 4   30 0.10242237
>> 5   40 0.09254315
>> 6   50 0.02739370
>> 7   60 0.02567137
>> 8   70 0.02492397
>> 9   80 0.03206637
>> 10  90 0.02487381
>> 11 100 0.01747584
>> 12 110 0.15977533
>> 13 120 0.13317708
>>
>> rm(list=ls())
>>     
>
> PLEASE, DON'T DO THAT!!!!. Or rather you can do it in your workspace  
> but don't post it. It's not fair to a person who may not read your  
> code line by line before pasting it into their workspace and having it  
> wiped out. Do you expect us to completely clear out our workspaces  
> just so we can answer your questions? At the very least comment it out  
> so it doesn't blow away half a days work for someone who is trying to  
> be helpful.
>
>   
>> x<- read.table("test.data.txt",header=TRUE)
>>
>> ds <- x[,2] # distance
>> cr <- x[,3] # correlation values
>> plot(ds,cr)
>> n <- 1/2.71
>> abline(h=n)
>>
>> fc <- function(x,a,b){a*exp(-b*x)}    # where a & b are constants
>> fm <- nls(cr ~ fc(ds,a,b),start=c(a=1,b=0))
>> co <- coef(fm)
>>     
>
>   
>> curve(fc(x,a=co[1],b=co[2]),add=TRUE,col="red",lwd=1.5)
>>
>> int <- function(x) coef(fm)[1] + x*coef(fm)[2]
>> in1 <- optimize(f=function(x) c(0,120), abs(int(ds)-n))
>>     
>
> Huh? I don't really see anything in there that would be a function. I  
> think you would need to specify "fc" and coefficient values for "a"  
> and "b".
>
>   
>> abline(v=in1$minimize)   # ????
>>     
>
> I think you would use in1$minimum once you get this far.
>
>   
>> thanks,
>> Muhammad
>>
>>
>>
>>
>> On 04/23/2010 07:32 PM, Peter Ehlers wrote:
>>     
>>> On 2010-04-23 11:46, David Winsemius wrote:
>>>
>>>       
>>>> On Apr 23, 2010, at 1:06 PM, Muhammad Rahiz wrote:
>>>>
>>>>
>>>>         
>>>>> Does anyone know of a method that I can get the intersection  
>>>>> where the
>>>>> red and blue curves meet i.e. the value on the x-axis?
>>>>>
>>>>> x<- 1:10
>>>>> y<- 10:1
>>>>> plot(x,y)
>>>>> abline(lm(y~x),col="blue")
>>>>> abline(h=2.5,col="red")
>>>>>
>>>>>           
>>>> Two ways :
>>>>
>>>>  >  xy<- lm(y~x)
>>>>  >  xyf<- function(x) coef(xy)[1] +x*coef(xy)[2]
>>>>
>>>> # absolute difference
>>>>  >  optimise(f=function(x) abs(xyf(x)-2.5), c(1,10) )
>>>> $minimum
>>>> [1] 8.49998
>>>>
>>>> $objective
>>>> (Intercept)
>>>> 1.932015e-05
>>>>
>>>> #N minimize squared difference
>>>>  >  optimise(f=function(x) (xyf(x)-2.5)^2, c(1,10) )
>>>> $minimum
>>>> [1] 8.5
>>>>
>>>> $objective
>>>> (Intercept)
>>>> 3.155444e-30
>>>>
>>>>
>>>>         
>>> Another (crude) way is to use locator(). I usually maximize
>>> the plot window for this.
>>>
>>>
>>>       
>
> David Winsemius, MD
> West Hartford, CT
>
>



More information about the R-help mailing list