def randprbmat(n): A = sackmat_m.make_zero_matrix(n, n) for i in range(0, n): for j in range(0, n): A[i][j] = random.random() row_normalize_matrix(A) return A
def compute_ols(X, y): [n, p] = X.dims() # Notation is as in the Wikipedia article Xt = X.transpose() XtX = Xt * X XtXi = XtX.inv() XtXi_Xt = XtXi * Xt P = X * XtXi_Xt I_n = sackmat_m.make_identity_matrix(n) M = I_n - P ones = [1.0] * n L = I_n - sackmat_m.outer(ones, ones).smul(1.0 / n) # Qxx = E[xi xi'] Qxx = sackmat_m.make_zero_matrix(p, p) for k in xrange(0, n): for i in xrange(0, p): for j in xrange(0, p): Qxx[i][j] += X[k][i] * X[k][j] for i in xrange(0, p): for j in xrange(0, p): Qxx[i][j] /= n Qxxi = Qxx.inv() # This is the essence of OLS: coeffs = sackmat_m.matrix_times_vector(XtXi_Xt, y) s2 = sackmat_m.vector_times_matrix_times_vector(y, M, y) / (n - p) se_of_regression = math.sqrt(s2) sigmahat2 = s2 * (n - p) / n sigmahats = [0] * p for j in xrange(0, p): sigmahats[j] = math.sqrt(1.0 / n * sigmahat2 * Qxxi[j][j]) # The tstat_j is betahat_j / sigma_j tstats = sackmat_m.vecdiv(coeffs, sigmahats) # Same as y - X betahat epsilonhats = sackmat_m.matrix_times_vector(M, y) pvalue = [999.0] * p model_sum_of_sq = 999.0 residual_sum_of_sq = sackmat_m.vecdot(epsilonhats, epsilonhats) total_sum_of_sq = 999.0 # One might assert that P, M are symmetric and idempotent; also PX=X and # MX=0. R2 = sackmat_m.vector_times_matrix_times_vector(y, L*P, y) / \ sackmat_m.vector_times_matrix_times_vector(y, L, y) adjR2 = 1 - (n - 1) / (n - p - 1) * (1 - R2) return ols_info_t(n, p, coeffs, sigmahats, tstats, pvalue, R2, adjR2, se_of_regression, model_sum_of_sq, residual_sum_of_sq, total_sum_of_sq)
def compute_ols(X, y): [n, p] = X.dims() # Notation is as in the Wikipedia article Xt = X.transpose() XtX = Xt * X XtXi = XtX.inv() XtXi_Xt = XtXi * Xt P = X * XtXi_Xt I_n = sackmat_m.make_identity_matrix(n) M = I_n - P ones = [1.0] * n L = I_n - sackmat_m.outer(ones, ones).smul(1.0/n) # Qxx = E[xi xi'] Qxx = sackmat_m.make_zero_matrix(p, p) for k in xrange(0, n): for i in xrange(0, p): for j in xrange(0, p): Qxx[i][j] += X[k][i] * X[k][j] for i in xrange(0, p): for j in xrange(0, p): Qxx[i][j] /= n Qxxi = Qxx.inv() # This is the essence of OLS: coeffs = sackmat_m.matrix_times_vector(XtXi_Xt, y) s2 = sackmat_m.vector_times_matrix_times_vector(y, M, y) / (n-p) se_of_regression = math.sqrt(s2) sigmahat2 = s2 * (n-p) / n sigmahats = [0] * p for j in xrange(0, p): sigmahats[j] = math.sqrt(1.0/n * sigmahat2 * Qxxi[j][j]) # The tstat_j is betahat_j / sigma_j tstats = sackmat_m.vecdiv(coeffs, sigmahats) # Same as y - X betahat epsilonhats = sackmat_m.matrix_times_vector(M, y) pvalue = [999.0] * p model_sum_of_sq = 999.0 residual_sum_of_sq = sackmat_m.vecdot(epsilonhats, epsilonhats) total_sum_of_sq = 999.0 # One might assert that P, M are symmetric and idempotent; also PX=X and # MX=0. R2 = sackmat_m.vector_times_matrix_times_vector(y, L*P, y) / \ sackmat_m.vector_times_matrix_times_vector(y, L, y) adjR2 = 1 - (n-1)/(n-p-1) * (1-R2) return ols_info_t(n, p, coeffs, sigmahats, tstats, pvalue, R2, adjR2, se_of_regression, model_sum_of_sq, residual_sum_of_sq, total_sum_of_sq)
def find_sample_covariance_matrix(xs): nx = len(xs) dim = len(xs[0]) mean = find_vector_mean(xs) Q = sackmat_m.make_zero_matrix(dim, dim) for i in range(0, dim): for j in range(0, dim): sum = 0.0 for k in range(0, nx): sum += (xs[k][i] - mean[i]) * (xs[k][j] - mean[j]) Q[i][j] = sum / (nx - 1.0) return Q
def find_sample_covariance_matrix(xs): nx = len(xs) dim = len(xs[0]) mean = find_vector_mean(xs) Q = sackmat_m.make_zero_matrix(dim, dim) for i in range(0, dim): for j in range(0, dim): sum = 0.0 for k in range(0, nx): sum += (xs[k][i] - mean[i]) * (xs[k][j] - mean[j]) Q[i][j] = sum / (nx-1.0) return Q
def make_histogram2(xy_pairs, lo_x, hi_x, num_x_bins, lo_y, hi_y, num_y_bins): bins = sackmat_m.make_zero_matrix(num_x_bins, num_y_bins) # Ensure they are floats. lo_x *= 1.0; hi_x *= 1.0; lo_y *= 1.0; hi_y *= 1.0 # These are loop-invariant; hoist them out. mul_x = num_x_bins / (hi_x - lo_x) mul_y = num_y_bins / (hi_y - lo_y) for [x, y] in xy_pairs: if ((x >= lo_x) and (x < hi_x) and (y >= lo_y) and (y < hi_y)): x_idx = int((x-lo_x) * mul_x) y_idx = int((y-lo_y) * mul_y) bins[x_idx][y_idx] += 1 return bins
def make_histogram2(xy_pairs, lo_x, hi_x, num_x_bins, lo_y, hi_y, num_y_bins): bins = sackmat_m.make_zero_matrix(num_x_bins, num_y_bins) # Ensure they are floats. lo_x *= 1.0 hi_x *= 1.0 lo_y *= 1.0 hi_y *= 1.0 # These are loop-invariant; hoist them out. mul_x = num_x_bins / (hi_x - lo_x) mul_y = num_y_bins / (hi_y - lo_y) for [x, y] in xy_pairs: if ((x >= lo_x) and (x < hi_x) and (y >= lo_y) and (y < hi_y)): x_idx = int((x - lo_x) * mul_x) y_idx = int((y - lo_y) * mul_y) bins[x_idx][y_idx] += 1 return bins
else: usage() if (s < 0) or (s >= T): print >> sys.stderr, 's = %11.7f is outside (0, T = %11.7f).' & (s, T) sys.exit(1) if (t < 0) or (t >= T): print >> sys.stderr, 't = %11.7f is outside (0, T = %11.7f).' & (t, T) sys.exit(1) dt = T / nt ts = brownian.get_t_series(nt, dt) if which_process == 'bm': Bts = sackmat_m.make_zero_matrix(nX, nt) for i in xrange(0, nX): brownian.get_SRW_series(Bts[i], dt) values = Bts elif which_process == 'bbbm': Bts = sackmat_m.make_zero_matrix(nX, nt) Xts = sackmat_m.make_zero_matrix(nX, nt) for i in xrange(0, nX): brownian.get_SRW_series(Bts[i], dt) brownian.get_BB_series_from_BM(Xts[i], Bts[i], X0, XT, dt) values = Xts if which_process == 'bm': values = Bts elif which_process == 'bbbm': values = Xts # ----------------------------------------------------------------
elif re.match(r'^T=', arg): T = float(arg[2:]) elif re.match(r'^nX=', arg): nX = int(arg[3:]) elif re.match(r'^nt=', arg): nt = int(arg[3:]) elif re.match(r'^X0=', arg): X0 = float(arg[3:]) elif re.match(r'^m=', arg): m = float(arg[2:]) elif re.match(r'^s=', arg): s = float(arg[2:]) else: usage() dt = T / nt mean_series = [0.0] * nt stddev_series = [0.0] * nt Xts = sackmat_m.make_zero_matrix(nX, nt) ts = brownian.get_t_series(nt, dt) mrou.get_mrou_mean_series(mean_series, X0, m, ts) mrou.get_mrou_stddev_series(stddev_series, s, ts) for i in xrange(0, nX): mrou.get_mrou_series_from_SDE(Xts[i], X0, m, s, dt) # Plot for i in xrange(0, nt): print '%11.7f' % (ts[i]), print '%11.7f' % (mean_series[i] - 2.0 * stddev_series[i]), print '%11.7f' % (mean_series[i] - stddev_series[i]), print '%11.7f' % (mean_series[i]), print '%11.7f' % (mean_series[i] + stddev_series[i]), print '%11.7f' % (mean_series[i] + 2.0 * stddev_series[i]),
elif argc == 2: columns = tabutil_m.float_columns_from_file(sys.argv[1]) y = columns[0] xs = columns[1:] elif argc == 3: [y] = tabutil_m.float_columns_from_file(sys.argv[1]) xs = tabutil_m.float_columns_from_file(sys.argv[2]) else: print >> sys.stderr, "Usage: %s {y and xs file name}" % (sys.argv[0]) print >> sys.stderr, "Or: %s {xs file name} {y file name}" % (sys.argv[0]) sys.exit(1) # 2. compute XtX k = len(xs) n = len(y) XtX = sackmat_m.make_zero_matrix(k, k) for i in range(0, k): xi = xs[i] for j in range(i, k): xj = xs[j] xi_dot_xj = sackmat_m.vecdot(xi, xj) XtX[i][j] = xi_dot_xj if i != j: XtX[j][i] = xi_dot_xj # 3. commpute XxT.inv XtXi = XtX.inv() # xxx handle singular ... # 4. commpute XtX.inv Xt y Xt = sackmat_m.sackmat(xs)
def circpmat2(n, p): A = sackmat_m.make_zero_matrix(n, n) for i in range(0, n): A[i][(i-1)%n] = p A[i][(i+1)%n] = 1-p return A
if arg == '-h' or arg == '--help': usage() elif re.match(r'^T=', arg): T = float(arg[2:]) elif re.match(r'^nR=', arg): nR = int(arg[3:]) elif re.match(r'^nt=', arg): nt = int(arg[3:]) elif re.match(r'^X0=', arg): X0 = float(arg[3:]) elif re.match(r'^Y0=', arg): Y0 = float(arg[3:]) elif re.match(r'^XT=', arg): XT = float(arg[3:]) elif re.match(r'^YT=', arg): YT = float(arg[3:]) else: usage() dt = T / nt ts = brownian.get_t_series(nt, dt) BtXs = sackmat_m.make_zero_matrix(nR, nt) BtYs = sackmat_m.make_zero_matrix(nR, nt) Xts = sackmat_m.make_zero_matrix(nR, nt) Yts = sackmat_m.make_zero_matrix(nR, nt) for i in xrange(0, nR): brownian.get_BM_series(BtXs[i], dt) brownian.get_BM_series(BtYs[i], dt) brownian.get_BB_series_from_BM(Xts[i], BtXs[i], X0, XT, dt) brownian.get_BB_series_from_BM(Yts[i], BtYs[i], Y0, YT, dt) # ---------------------------------------------------------------- # Print time-series data. for i in xrange(0, nt): for j in xrange(0, nR): print ' %11.7f %11.7f' % (Xts[j][i], Yts[j][i]),
if arg == '-h' or arg == '--help': usage() elif re.match(r'^T=', arg): T = float(arg[2:]) elif re.match(r'^nR=', arg): nR = int (arg[3:]) elif re.match(r'^nt=', arg): nt = int (arg[3:]) elif re.match(r'^X0=', arg): X0 = float(arg[3:]) elif re.match(r'^Y0=', arg): Y0 = float(arg[3:]) elif re.match(r'^XT=', arg): XT = float(arg[3:]) elif re.match(r'^YT=', arg): YT = float(arg[3:]) else: usage() dt = T / nt ts = brownian.get_t_series(nt, dt) BtXs = sackmat_m.make_zero_matrix(nR, nt) BtYs = sackmat_m.make_zero_matrix(nR, nt) Xts = sackmat_m.make_zero_matrix(nR, nt) Yts = sackmat_m.make_zero_matrix(nR, nt) for i in xrange(0, nR): brownian.get_BM_series(BtXs[i], dt) brownian.get_BM_series(BtYs[i], dt) brownian.get_BB_series_from_BM(Xts[i], BtXs[i], X0, XT, dt) brownian.get_BB_series_from_BM(Yts[i], BtYs[i], Y0, YT, dt) # ---------------------------------------------------------------- # Print time-series data. for i in xrange(0, nt): for j in xrange(0, nR): print ' %11.7f %11.7f' % (Xts[j][i], Yts[j][i]),