Hi Frede,

Thank you for your accurate answer!

If I understand well, your way to use nls() solves the problem using too many 
physical parameters.
I solved the problem following the other way that you and Rolf Turner suggested 
(i.e. splitting the complex-valued problem into two real-valued problems and 
using nlm() ).
If you are interested in more details, please see my answer to Rolf’s mail.

>  Why are loga40, loga30, loga20, 0 (zero value), and loga0 not independent 
> variables that you control? If so you don't want to estimate those.
> 
> If the logaT parameters are not under your control do you still really want 
> to estimate the same set of values of the parameters of the model for each 
> set of your data? And not separate estimates for each curve?

You noticed a key point of the mechanical problem!
However I’m looking for a “single curve”, so-called “master curve”, to fit all 
experimental data!

> 
> However (putting my head under my shoulder) you can do something like this 
> (Having just noticed Rolf Turner's answer you should absolutely explore that 
> solutions. That would probably the best way to go).
;)

Thanks again!
Andrea



> 
> ## this seems to run
> fit.re <- nls(Re(E) ~ 
> Re(E_2S2P1D(f,c(rep(loga40,5),rep(loga30,5),rep(loga20,5),rep(0,5),rep(loga0,5)),
>                                      Eg,Ee,k,h,delta,logbeta,logtau)),
>              data = myE, na.action = "na.exclude",  
>              start=list(loga40=-3.76,loga30=-2.63,loga20=-1.39,loga0=1.68,
>                  
> Eg=27000,Ee=200,k=0.16,h=0.47,delta=1.97,logbeta=2.2,logtau=-0.02) )
> 
> fit.re
> 
> ## plot fit overlayed observations
> png("fitted-Re.png")
> plot(f_data, Re(E), type = "p", col = mycol)# log="xy")
> lines(f_data, fitted(fit.re), col = "grey80") #, log = "xy"
> dev.off()
> 
> ## this gives an error
> ## probably due to the 5 curves do not share parameters. See 3rd panel in 
> attached plot-raw-data.png
> fit.im <- nls(Im(E) ~ 
> Im(E_2S2P1D(f,c(rep(loga40,5),rep(loga30,5),rep(loga20,5),rep(0,5),rep(loga0,5)),
>                                  Eg,Ee,k,h,delta,logbeta,logtau)),
>              data = myE, na.action = "na.exclude",
>              start=list(loga40=-3.76,loga30=-2.63,loga20=-1.39,loga0=1.68,
>                   
> Eg=27000,Ee=200,k=0.16,h=0.47,delta=1.97,logbeta=2.2,logtau=-0.02) )
> 
> 
> ## Now try abs()
> ## which works and gives allmost same estimates as for fit.re
> fit.abs <- nls(abs(E) ~ 
> abs(E_2S2P1D(f,c(rep(loga40,5),rep(loga30,5),rep(loga20,5),rep(0,5),rep(loga0,5)),
>                                      Eg,Ee,k,h,delta,logbeta,logtau)),
>              data = myE, na.action = "na.exclude",
>              start=list(loga40=-3.76,loga30=-2.63,loga20=-1.39,loga0=1.68,
>                  
> Eg=27000,Ee=200,k=0.16,h=0.47,delta=1.97,logbeta=2.2,logtau=-0.02))
> 
> fit.abs
> 
> png("fitted-abs.png")
> plot(f_data, abs(E), type = "p", col = mycol)# log="xy")
> lines(f_data, predict(fit.abs), col = "grey80") #, log = "xy"
> dev.off()
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Yours sincerely / Med venlig hilsen
> 
> 
> Frede Aakmann Tøgersen
> Specialist, M.Sc., Ph.D.
> Plant Performance & Modeling
> 
> Technology & Service Solutions
> T +45 9730 5135
> M +45 2547 6050
> fr...@vestas.com
> http://www.vestas.com
> 
> Company reg. name: Vestas Wind Systems A/S
> This e-mail is subject to our e-mail disclaimer statement.
> Please refer to www.vestas.com/legal/notice
> If you have received this e-mail in error please contact the sender. 
> 
> 
>> -----Original Message-----
>> From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-project.org]
>> On Behalf Of Andrea Graziani
>> Sent: 9. februar 2014 23:46
>> To: r-help@r-project.org
>> Subject: [R] Regression of complex-valued functions
>> 
>> Hi everyone,
>> 
>> I previously posted this question but my message was not well written and
>> did not contain any code so I will try to do a better job this time.
>> 
>> The goal is to perform a non-linear regression on complex-valued data.
>> I will first give a short description of the data and then describe the 
>> complex-
>> valued non-linear function.
>> 
>> ***The Data
>> Obtained from mechanical tests performed at 5 loading frequencies 0.1, 0.25,
>> 1, 0.4 and 12 Hz, and at 5 temeperatures.
>> The independent variable used in the regression is:
>> f_data <- rep(c(0.1,0.25,1,4,12),5)
>> 
>> The measured values of the response variable are:
>> E <- c(289.7411+ 225.0708i , 386.4417+ 303.5021i ,  671.5132+ 521.1253i ,
>> 1210.8638+ 846.6253i , 1860.9623+1155.4139i ,
>> 862.8984+ 636.2637i , 1159.0436+ 814.5609i , 1919.0369+1186.5679i ,
>> 3060.7207+1573.6088i  , 4318.1781+1868.4761i  ,
>> 2760.7782+1418.5450i , 3306.3013+1612.2712i , 4746.6958+1923.8662i ,
>> 6468.5769+2148.9502i , 8072.2642+2198.5344i  ,
>> 6757.7680+2061.3110i , 7591.9787+2123.9168i , 9522.9471+2261.8489i ,
>> 11255.0952+2166.6411i , 12601.3970+2120.7178i ,
>> 11913.6543+2016.0828i , 12906.8294+2030.0610i , 14343.7693+1893.4877i ,
>> 15942.7703+1788.0910i , 16943.2261+1665.9847i)
>> 
>> To visualize the data:
>> plot(f_data,Re(E),log="xy")
>> plot(f_data,Im(E),log="xy")
>> plot(E)
>> 
>> ***Non-linear regression function:
>> Obtained from an analytical model
>> 
>> E_2S2P1D <- function(f,logaT,Eg,Ee,k,h,delta,logbeta,logtau)
>>           Ee+(Eg-Ee)*(
>>           1+delta*(2i*pi*10^(logtau)*f*10^logaT)^-k +
>>                   (2i*pi*10^(logtau)*f*10^logaT)^-h +
>>                   (2i*pi*10^(logtau)*f*10^logaT*10^(logbeta))^-1
>>                     )^-1
>> 
>> E_2S2P1D is a complex-valued function (note the imaginary unit "i") where:
>> "f" is the real-valued independent variable (i.e. the frequency),
>> "logaT","Eg","Ee","k","h","delta","logbeta","logtau" are real-valued
>> parameters.
>> 
>> For example:
>> 
>>> E_2S2P1D(1,0,27000,200,0.16,0.47,1.97,2.2,0.02)
>> [1] 9544.759+2204.974i
>> 
>>> E_2S2P1D(1,-1,27000,200,0.16,0.47,1.97,2.2,0.02)
>> [1] 6283.748+2088.473i
>> 
>> In order to find the parameters of the regression function I use "nls".
>> 
>> Executing
>> 
>> fit <- nls(E ~
>> E_2S2P1D(f_data,c(rep(loga40,5),rep(loga30,5),rep(loga20,5),rep(0,5),rep(lo
>> ga0,5)),
>>                            Eg,Ee,k,h,delta,logbeta,logtau),
>>          start=list(loga40=-3.76,loga30=-2.63,loga20=-1.39,loga0=1.68,
>>                     
>> Eg=27000,Ee=200,k=0.16,h=0.47,delta=1.97,logbeta=2.2,logtau=-
>> 0.02) )
>> 
>> results in a lot of warnings (my translation into english):
>> "In numericDeriv(form[[3L]], names(ind), env) :
>> imaginary parts removed during the conversion"
>> 
>> I've the same error trying:
>> y <- E_2S2P1D(f_data,c(rep(-3.76,5),rep(-2.63,5),rep(-
>> 1.39,5),rep(0,5),rep(1.68,5)),27000,200,0.16,0.47,1.97,2.2,0.02)
>> plot(E,y)
>> 
>> If I got it right R is not able to handle regression problems on 
>> complex-valued
>> functions, correct?
>> If yes, is there some workaround?
>> For example using MSExcel I write the Real and Imaginary parts separately,
>> and than I minimize
>> 
>> error = sum [ ( Re(E) - Re(E_E_2S2P1D) ) / Re(E) )^2 ] + sum [ ( Im(E) -
>> Im(E_E_2S2P1D) ) / Im(E) )^2 ]
>> 
>> using the MSExcel solver function.
>> 
>> thank you for your help
>> Andrea
>> 
>> PS
>> Thanks to David Winsemius for his suggestions
>> 
>> ______________________________________________
>> R-help@r-project.org 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.
> <plot-raw-data.png><fitted-Re.png><fitted-abs.png>

______________________________________________
R-help@r-project.org 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.

Reply via email to