38 lines
1010 B
Python
38 lines
1010 B
Python
import numpy as np
|
|
|
|
|
|
def add_indep(x, varnames, dtype=None):
|
|
'''
|
|
construct array with independent columns
|
|
|
|
x is either iterable (list, tuple) or instance of ndarray or a subclass
|
|
of it. If x is an ndarray, then each column is assumed to represent a
|
|
variable with observations in rows.
|
|
'''
|
|
# TODO: this needs tests for subclasses
|
|
|
|
if isinstance(x, np.ndarray) and x.ndim == 2:
|
|
x = x.T
|
|
|
|
nvars_orig = len(x)
|
|
nobs = len(x[0])
|
|
if not dtype:
|
|
dtype = np.asarray(x[0]).dtype
|
|
xout = np.zeros((nobs, nvars_orig), dtype=dtype)
|
|
count = 0
|
|
rank_old = 0
|
|
varnames_new = []
|
|
varnames_dropped = []
|
|
keepindx = []
|
|
for (xi, ni) in zip(x, varnames):
|
|
xout[:, count] = xi
|
|
rank_new = np.linalg.matrix_rank(xout)
|
|
if rank_new > rank_old:
|
|
varnames_new.append(ni)
|
|
rank_old = rank_new
|
|
count += 1
|
|
else:
|
|
varnames_dropped.append(ni)
|
|
|
|
return xout[:, :count], varnames_new
|