Source code for causalexplain.estimators.cam.selLm

"""
Here are the main changes and explanations:

- We use `numpy` for array operations and `scipy.stats` for linear regression.
- The default parameter `pars` is set to `None` and then initialized if not provided.
- We use f-strings for string formatting in the print statement.
- The input `X` is converted to a numpy array.
- Instead of using `lm`, we use `scipy.stats.linregress` for linear regression.
- We manually add a constant term to `X` for the intercept in the regression.
- The p-values are extracted directly from the `linregress` result.
- The selection vector is updated using list slicing to exclude the k-th element.

Note that this Python version assumes that the input `X` is a 2D array-like object. 
The function will work similarly to the R version, but there might be slight 
differences in the exact numerical results due to different underlying implementations 
of the linear regression.
"""
import numpy as np
from scipy import stats


[docs] def selLm(X, pars=None, output=False, k: int = None): """_summary_ Args: X (np.ndarray): a 2D numpy array with the variables pars (dict): Parameters output (bool, optional): _description_. Defaults to False. k (int, optional): The index of the variable Returns: _type_: _description_ """ if pars is None: pars = {'cut_off_p_val': 0.001} if output: print(f"Performing variable selection for variable {k}:") X = np.array(X) p = X.shape if p[1] > 1: sel_vec = [False] * p[1] x = np.delete(X, k, axis=1) y = X[:, k] # Perform linear regression X_with_const = np.column_stack((np.ones(len(x)), x)) model = stats.linregress(X_with_const, y) # Calculate p-values for coefficients (excluding intercept) p_val_vec = model.pvalue[1:] # Update sel_vec based on p-values # We need to assign the boolean values to sel_vec, excluding the k-th element # First, we create a boolean array from p_val_vec significant = p_val_vec < pars['cut_off_p_val'] # Then, we assign these values to sel_vec, skipping the k-th element sel_vec[:k] = significant[:k] sel_vec[k+1:] = significant[k:] else: sel_vec = [] return sel_vec