Как выполнить экспоненциальную подборку данных даты? - PullRequest
1 голос
/ 18 марта 2020

У меня есть некоторые данные в этом формате:

0,1/19/20
0,1/20/20
0,1/21/20
1,1/22/20
6,1/23/20
7,1/24/20
11,1/25/20
15,1/26/20
28,1/27/20
38,1/28/20

, и я хочу построить их вместе с показательной кривой, которая подходит. Вот что я пытаюсь:

set datafile separator ","
set terminal svg enhance background rgb "white"
set timefmt "%m/%d/%y"
set xdata time
set format x "%m/%d/%y"
f(x)=a*exp(x*b)
a=1
b=0.00000000001
fit f(x) "test.dat" using 2:1 via a,b
plot "test.dat" using 2:1, f(x)

но вот что я получаю: https://i.stack.imgur.com/JrdYq.jpg

вывод:

iter      chisq       delta/lim  lambda   a             b            
   0 2.4518484242e+03   0.00e+00  7.18e-01    1.000000e+00   1.000000e-11
   1 1.0605090928e+03  -1.31e+05  7.18e-02    1.397524e+01   1.205276e-11
   2 1.0548499551e+03  -5.36e+02  7.18e-03    1.473392e+01   1.761422e-11
   * 1.1929533566e+03   1.16e+04  7.18e-02    5.600970e+00   4.096647e-10
   3 1.0548479644e+03  -1.89e-01  7.18e-03    1.463642e+01   2.152072e-11
iter      chisq       delta/lim  lambda   a             b            

After 3 iterations the fit converged.
final sum of squares of residuals : 1054.85
rel. change during last iteration : -1.88724e-06

degrees of freedom    (FIT_NDF)                        : 5
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 14.5248
variance of residuals (reduced chisquare) = WSSR/ndf   : 210.97

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a               = 14.6364          +/- 4.851e+04    (3.315e+05%)
b               = 2.15207e-11      +/- 2.098e-06    (9.749e+06%)

correlation matrix of the fit parameters:
                a      b      
a               1.000 
b              -1.000  1.000 

Другой случай (тот же формат для данных, та же команда):

Сюжет: https://i.stack.imgur.com/SUrOb.jpg

Выход:

iter      chisq       delta/lim  lambda   a             b            
   0 3.1449068545e+15   0.00e+00  8.39e+07    1.000000e+00   1.000000e-08
   1 4.3978813150e+14  -6.15e+05  8.39e+06    9.961173e-01   9.380902e-09
   2 6.0443707833e+13  -6.28e+05  8.39e+05    9.921770e-01   8.756643e-09
   3 8.2818940310e+12  -6.30e+05  8.39e+04    9.880292e-01   8.132279e-09
   4 1.1307879559e+12  -6.32e+05  8.39e+03    9.783880e-01   7.512240e-09
   5 1.4643178088e+11  -6.72e+05  8.39e+02    7.869411e-01   7.011825e-09
   ...
 223 4.3503512818e+08  -6.75e-01  8.39e+03    7.898096e-31   4.829813e-08
iter      chisq       delta/lim  lambda   a             b            

After 223 iterations the fit converged.
final sum of squares of residuals : 4.35035e+08
rel. change during last iteration : -6.75096e-06

degrees of freedom    (FIT_NDF)                        : 55
rms of residuals      (FIT_STDFIT) = sqrt(WSSR/ndf)    : 2812.42
variance of residuals (reduced chisquare) = WSSR/ndf   : 7.90973e+06

Final set of parameters            Asymptotic Standard Error
=======================            ==========================
a               = 7.8981e-31       +/- 1.236e-30    (0%)
b               = 4.82981e-08      +/- 2.01e-07     (416.2%)

correlation matrix of the fit parameters:
                a      b      
a               1.000 
b              -1.000  1.000 
line 0: warning: Too many axis ticks requested (>6e+04)
line 0: warning: Too many axis ticks requested (>6e+04)

I подозревал, что я не выбирал правильные начальные параметры для кривой соответствия, но я играл со многими значениями (особенно для b), и иногда я получаю неизвестный тип в реальном () .

I Читал, что при работе с датами x принимает значение секунд с начала века. Если это так, то я не уверен, как сделать правильные операции с этим номером. Я также хотел бы избавиться от всех точек зрения и точек, где у равен 0, если это возможно. Может кто-то указать, что я делаю не так? Может быть, я не использую правильную функцию подгонки?

1 Ответ

0 голосов
/ 19 марта 2020

Данные о времени обрабатываются внутренне как секунды с 1 января 1970 года 00:00:00. Проверьте help time/date. Таким образом, вам нужно изменить свою функцию f(x) на дату начала и указать разумное начальное значение, особенно для b.

Код:

### exponential fit of time data
reset session

$Data <<EOD
0,1/19/20
0,1/20/20
0,1/21/20
1,1/22/20
6,1/23/20
7,1/24/20
11,1/25/20
15,1/26/20
28,1/27/20
38,1/28/20
EOD

set datafile separator comma

myTimeFmt = "%m/%d/%y"
set format x "%m/%d" time

# get the start date
set table $Dummy
    plot $Data u (Start=timecolumn(2,myTimeFmt)) index 0 every ::0:0:0:0 w table
unset table

b=1e8    # reasonable startvalue for fitting
f(x) = a*exp((x-Start)/b*log(2))+c
set fit nolog
fit f(x) $Data u (timecolumn(2,myTimeFmt)):1 via a,b,c

End = strptime(myTimeFmt,"2/11/20")
set xrange[Start:End]
set yrange[0.5:]
set logscale y
set grid xtics, ytics
set key top left

set label 1 at graph 0.01, graph 0.85 sprintf("Doubling every: %.2f days",b/84600.)

plot $Data u (timecolumn(2,myTimeFmt)):1 w lp pt 7 lc rgb "blue" ti "Data", \
     f(x) w l lc rgb "red" ti "Fit"
### end of code 

Результат:

enter image description here

...