def correlated_ts(c,delta_t = 0.1,N=1000): # parameters for coupled oscillator K,D = 1.0,1.0 data1 = langevin.time_series(A=1/K, D=D, delta_t=delta_t, N=N) data2 = langevin.time_series(A=1/(K+np.abs(c)), D=D, delta_t=delta_t, N=N) x1 = (data1 + data2)/2 if c>0: x2 = (data1 - data2)/2 else: x2 = (data2-data1)/2 return x1,x2
# initial prior # both D and A have mean 1 and std 10 alpha_A = 2.1 beta_A = 1.1 alpha_D = 0.1 beta_D = 0.1 # compile model for reuse sm = lcm.OU_DA() sm.samples = 100000 result_array = None for i in range(M): print("***** Iteration ", i, " *****") data = langevin.time_series(A=A, D=D, delta_t=delta_t, N=N) # calculate autocorrelation function f = np.fft.rfft(data) acf = np.fft.irfft(f * np.conjugate(f)) acf = np.fft.fftshift(acf) / N autocorr = acf[int(N / 2):] y = autocorr[:min(int(N / 2), P)] t = np.arange(min(int(N / 2), P)) mod = ExponentialModel() pars = mod.guess(y, x=t) try: out = mod.fit(y, pars, x=t) except: fit_results = np.zeros(4)
# A have mean 1 and std 10 # B is uniform prior over [0,1] interval alpha_A=2.1 beta_A=1.1 alpha_B=1 beta_B=1 # compile model for reuse sm = lcm.OU_BA() sm.samples=100000 result_array = None for i in range(M): print("***** Iteration ",i," *****") data = langevin.time_series(A=A, D=D, delta_t=delta_t, N=N) data_results = [data[0]**2, data[-1]**2, np.sum(data[1:-2]**2), np.sum(data[:-1]*data[1:])] # calculate autocorrelation function f = np.fft.rfft(data) acf = np.fft.irfft(f * np.conjugate(f)) acf = np.fft.fftshift(acf) / N autocorr = acf[int(N / 2):] y = autocorr[:min(int(N / 2), P)] t = np.arange(min(int(N / 2), P)) mod = ExponentialModel() pars = mod.guess(y, x=t) try:
def main(): parser = argparse.ArgumentParser() parser.add_argument('-d', '--output', action='store', default="./test", help='output file name') parser.add_argument('-a', '--amplitude', action='store', type=float, default=1.0, help='amplitude of OU') parser.add_argument('-r', '--tau', action='store', type=float, default=1.0, help='relaxation time tau of OU') parser.add_argument('-w', '--noise', action='store', type=float, default=1.0, help='power of the noise') parser.add_argument('-n', '--length', action='store', type=int, default=2000, help='length of simulation in timesteps') parser.add_argument('-s', '--samples', action='store', type=int, default=2000, help='MCMC samples per run') parser.add_argument('-b', '--dtstart', action='store', type=float, default=0.01, help='delta t range start') parser.add_argument('-e', '--dtend', action='store', type=float, default=2.0, help='delta t range end') parser.add_argument('-l', '--dtlength', action='store', type=int, default=50, help='delta t range number of points') parser.add_argument('-u', '--duplicates', action='store', type=int, default=1, help='delta t range number of points') # get arguments arg = parser.parse_args() filename = arg.output a = arg.amplitude tau = arg.tau pn = arg.noise n = arg.length mc_samples = arg.samples dtstart = arg.dtstart dtend = arg.dtend dtlength = arg.dtlength dupl = arg.duplicates delta_t_list = np.linspace(dtstart, dtend, dtlength) result_array = None for delta_t in delta_t_list: print(delta_t) for i in range(dupl): data = langevin.time_series(A=a, D=a / tau, delta_t=delta_t, N=n) dataN = data + np.random.normal(loc=0.0, scale=np.sqrt(pn), size=n) with pm.Model() as model: B = pm.Beta('B', alpha=5.0, beta=1.0) A = pm.Uniform('A', lower=0, upper=5) sigma = pm.Uniform('sigma', lower=0, upper=5) path = Ornstein_Uhlenbeck('path', A=A, B=B, shape=len(dataN)) dataObs = pm.Normal('dataObs', mu=path, sigma=sigma, observed=dataN) trace = pm.sample(mc_samples, cores=4) a_mean = trace['A'].mean() b_mean = trace['B'].mean() a_std = trace['A'].std() b_std = trace['B'].std() sigma_mean = trace['sigma'].mean() sigma_std = trace['sigma'].std() avgpath = np.mean(trace['path'], axis=0) stddiff = np.std(data - avgpath) stdpath = np.std(trace['path'], axis=0).mean() results = [ delta_t, a_mean, a_std, b_mean, b_std, sigma_mean, sigma_std, stddiff, stdpath ] if result_array is None: result_array = results else: result_array = np.vstack((result_array, results)) column_names = [ "delta_t", "a_mean", "a_std", "b_mean", "b_std", "sigma_mean", "sigma_std", "stddiff", "stdpath" ] df = pd.DataFrame(result_array, columns=column_names) df.to_csv(filename + '.csv', index=False)
import numpy as np import matplotlib.pyplot as plt, seaborn as sns import lmfit as lm from scipy import signal from lmfit.models import ExponentialModel import pandas as pd from itertools import accumulate import langevin A1 = 1.0 A2 = 0.5 D = 1.0 delta_t=0.5 datadir='results/delta05/corr2/' N=10000 # length of data set P=1000 # range to fit acf x1 = langevin.time_series(A1,D,delta_t,N) x2 = langevin.time_series(A2,D,delta_t,N) xx1 = (x1+x2)/2.0 xx2 = (x1-x2)/2.0 df = pd.DataFrame({'x1':xx1, 'x2':xx2}) df.to_csv(datadir+'data.csv',index=False)