[R] Regression of complex-valued functions

Andrea Graziani a.graziani at mail.com
Sun Feb 9 23:45:50 CET 2014


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(loga0,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



More information about the R-help mailing list