当前位置: 首页 > news >正文

tigramite教程(七)使用TIGRAMITE 进行条件独立性测试

文章目录

  • 概述
  • 1 连续数值变量
    • 1.1 ParCorr 偏相关(ParCorr类)
    • 1.2 鲁棒偏相关(RobustParCorr)
    • 非线性检验
    • 1.3 GPDC
    • 1.4 CMIknn
  • 2a. 分类/符号时间序列
  • 2b. 混合分类/连续时间序列
  • 多变量X和Y的测试

概述

这个表格概述了 X ⊥ Y ∣ Z X\perp Y | Z XYZ的测试及其相关的假设

条件独立性检验假设条件
ParCorr连续变量 X , Y , Z X,Y,Z X,Y,Z,具有线性依赖关系和高斯噪声; X , Y X,Y X,Y必须是单变量
RobustParCorr连续变量 X , Y , Z X,Y,Z X,Y,Z,具有线性依赖关系,对不同边缘分布具有鲁棒性; X , Y X,Y X,Y必须是单变量
ParCorrWLS连续变量 X , Y , Z X,Y,Z X,Y,Z,具有线性依赖关系,可以处理异方差依赖关系; X , Y X,Y X,Y必须是单变量
GPDC / GPDCtorch连续变量 X , Y , Z X,Y,Z X,Y,Z,具有加性依赖关系; X , Y X,Y X,Y必须是单变量
CMIknn连续变量 X , Y , Z X,Y,Z X,Y,Z,具有更一般的依赖关系(基于排列的检验); X , Y X,Y X,Y可以是多变量
Gsquared离散/分类变量 X , Y , Z X,Y,Z X,Y,Z X , Y X,Y X,Y必须是单变量
CMIsymb离散/分类变量 X , Y , Z X,Y,Z X,Y,Z(基于排列的检验); X , Y X,Y X,Y 可以是多变量
RegressionCI混合数据集,包含单变量离散/分类和(线性)连续变量 X , Y , Z X,Y,Z X,Y,Z X , Y X,Y X,Y必须是单变量
PairwiseMultCI元条件独立性检验,将上述每个单变量检验转变为多变量检验,包括可能有助于增加效应大小的方法

在概述教程中讨论的密度图可以帮助选择使用哪种测试。

需要注意的是,那些假设条件较少的测试通常比假设条件较多的测试具有更低的检测能力。例如,对于实际上是线性的依赖关系,ParCorr的效果会比CMIknn好得多。此外,非参数测试在计算上要昂贵得多。

# Imports
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
%matplotlib inline     
## use `%matplotlib notebook` for interactive figures
# plt.style.use('ggplot')
import sklearnimport tigramite
from tigramite import data_processing as pp
from tigramite.toymodels import structural_causal_processes as toysfrom tigramite import plotting as tp
from tigramite.pcmci import PCMCIfrom tigramite.independence_tests.parcorr import ParCorr
from tigramite.independence_tests.robust_parcorr import RobustParCorr
from tigramite.independence_tests.parcorr_wls import ParCorrWLS
from tigramite.independence_tests.gpdc import GPDC
from tigramite.independence_tests.cmiknn import CMIknn
from tigramite.independence_tests.cmisymb import CMIsymb
from tigramite.independence_tests.gsquared import Gsquared
from tigramite.independence_tests.regressionCI import RegressionCI

1 连续数值变量

1.1 ParCorr 偏相关(ParCorr类)

在概述教程中有解释。

1.2 鲁棒偏相关(RobustParCorr)

如果在数据中仍然存在线性依赖关系,但分布又不是高斯分布,建议使用鲁棒偏相关(RobustParCorr)测试。这种测试在进行偏相关测试之前,会先将数据转换为正态分布1。

在这里,我们还展示了新的函数toys.generate_structural_causal_process,它允许随机创建具有一定数量参数的结构因果过程模型(详见文档说明)。在接下来的示例中,噪声项来自于极值Weibull分布和均匀分布。此外,我们还应用了一些多项式变换,使数据变得更加极端。

# np.random.seed(1)
T = 500
links, noises = toys.generate_structural_causal_process(N=3, L=4, dependency_funcs=['linear'], dependency_coeffs=[-0.5, 0.5], auto_coeffs=[0.3, 0.5], contemp_fraction=0.,max_lag=2, noise_dists=['weibull', 'uniform'],noise_means=[0.],noise_sigmas=[1., 1.5],noise_seed=5,seed=9)
for j in links:print(j, [(link[0], link[1], link[2].__name__) for link in links[j]])print(noises[j].__name__)
data, nonstat = toys.structural_causal_process(links,T=T, noises=noises)
data[:,0] = data[:,0] + 0.3*data[:,0]**3
data[:,1] = data[:,1] + 0.3*data[:,1]**5
data[:,2] = np.sign(data[:,2])*data[:,2]**2
var_names = [r'$X^0$', r'$X^1$', r'$X^2$']dataframe = pp.DataFrame(data, var_names=var_names)
tp.plot_timeseries(dataframe)

0 [((0, -1), 0.5, ‘linear’), ((2, -1), -0.5, ‘linear’), ((1, -2), 0.5, ‘linear’)]
weibull
1 [((1, -1), 0.3, ‘linear’), ((0, -2), -0.5, ‘linear’)]
weibull
2 [((2, -1), 0.3, ‘linear’), ((0, -2), 0.5, ‘linear’)]
uniform
在这里插入图片描述

# Init
pcmci_robust_parcorr = PCMCI(dataframe=dataframe, cond_ind_test=RobustParCorr())

我们可以使用密度图功能来展示偏斜的边缘和联合密度。在这里,我们将偏斜的数据标准化,以显示它明显非高斯分布。

# tp.plot_densityplots(dataframe=dataframe, add_densityplot_args={'matrix_lags':matrix_lags}); plt.show()
# correlations = pcmci_robust_parcorr.get_lagged_dependencies(tau_max=20, val_only=True)['val_matrix']
# matrix_lags = np.argmax(np.abs(correlations), axis=2)
matrix_lags = Nonematrix = tp.setup_density_matrix(N=dataframe.N, var_names=dataframe.var_names)# Standardize to better compare skewness with gaussianized data
dataframe.values[0] -= dataframe.values[0].mean(axis=0)
dataframe.values[0] /= dataframe.values[0].std(axis=0)matrix.add_densityplot(dataframe=dataframe, matrix_lags=matrix_lags, label_color='red', label="standardized data",snskdeplot_args = {'cmap':'Reds', 'alpha':1., 'levels':4})# Transform data to normal marginals
data_normal = pp.trafo2normal(data)
dataframe_normal = pp.DataFrame(data_normal, var_names=var_names)matrix.add_densityplot(dataframe=dataframe_normal, matrix_lags=matrix_lags, label_color='black', label="gaussianized data",snskdeplot_args = {'cmap':'Greys', 'alpha':1., 'levels':4})
matrix.adjustfig()
# plt.show()

在这里插入图片描述

pcmci_parcorr = PCMCI(dataframe=dataframe, cond_ind_test=ParCorr())
results = pcmci_parcorr.run_pcmci(tau_max=2)pcmci_robust_parcorr = PCMCI(dataframe=dataframe, cond_ind_test=RobustParCorr())
results_robust = pcmci_robust_parcorr.run_pcmci(tau_max=2)fig, axes = plt.subplots(nrows=1, ncols=3)
axes[0].set_title("True graph")
tp.plot_graph(graph=pcmci_robust_parcorr.get_graph_from_dict(links, tau_max=None),var_names=var_names,fig_ax=(fig, axes[0]),show_colorbar=False,)axes[1].set_title("ParCorr")
tp.plot_graph(val_matrix=results['val_matrix'],graph=results['graph'],var_names=var_names,fig_ax=(fig, axes[1]),show_colorbar=False,)axes[2].set_title("RobustParCorr")
tp.plot_graph(val_matrix=results_robust['val_matrix'],graph=results_robust['graph'],var_names=var_names,fig_ax=(fig, axes[2]),show_colorbar=False,)
plt.show()

在这里插入图片描述

鲁棒偏相关(右图)在这里比标准的偏相关(左图)产生更可靠的结果,因为边缘分布事先被转换为正态分布。

在教程tigarite_tutorial_heteroskedastic_ParCorrWLS中,我们介绍了另一种适用于异方差数据的偏相关版本,称为ParCorrWLS。

非线性检验

如果存在非线性依赖关系,建议使用非参数检验。

在这里插入图片描述

random_state = np.random.default_rng(seed=42)
data = random_state.standard_normal((500, 3))
for t in range(1, 500):data[t, 0] += 0.4*data[t-1, 1]**2data[t, 2] += 0.3*data[t-2, 1]**2
var_names = [r'$X^0$', r'$X^1$', r'$X^2$']dataframe = pp.DataFrame(data, var_names=var_names)
tp.plot_timeseries(dataframe); plt.show()

在这里插入图片描述

pcmci_parcorr = PCMCI(dataframe=dataframe, cond_ind_test=ParCorr(),verbosity=0)
results = pcmci_parcorr.run_pcmci(tau_max=2, pc_alpha=0.2, alpha_level = 0.01)
tp.plot_graph(val_matrix=results['val_matrix'],graph=results['graph'],var_names=var_names,show_colorbar=False,)

在这里插入图片描述
偏相关在这里有两个失败之处:(1)它无法检测到两个非线性链接;(2)它错误地检测到了一个链接,因为它同样无法排除非线性依赖。

1.3 GPDC

Tigramite通过基于高斯过程回归和残差上的距离相关性(GPDC)的测试来覆盖非线性加性依赖关系。对于GPDC,没有可用的距离相关性(DC)的解析空模型分布。为了进行显著性检验,Tigramite通过参数significance = 'analytic'预先计算每个样本大小的分布(存储在内存中),从而避免了对每个条件独立性测试进行计算成本高昂的排列测试(significance = 'shuffle_test')。高斯过程回归使用sklearn的默认参数执行,除了核函数在这里默认为径向基函数+一个白噪声核(这两个超参数在内部被优化),以及假定的噪声水平alpha被设置为零,因为我们添加了一个白噪声核。这些和其他参数可以通过gp_params字典来设置。有关进一步讨论,请参见sklearn的文档。还存在一个模块(gpdc_torch.py),它利用gpytorch在GPU上进行更快的计算。

gpdc = GPDC(significance='analytic', gp_params=None)
pcmci_gpdc = PCMCI(dataframe=dataframe, cond_ind_test=gpdc,verbosity=0)

与偏相关(ParCorr)相比,非线性链接被GPDC正确检测到。

results = pcmci_gpdc.run_pcmci(tau_max=2, pc_alpha=0.1, alpha_level = 0.01)
tp.plot_graph(val_matrix=results['val_matrix'],graph=results['graph'],var_names=var_names,show_colorbar=False,)

在这里插入图片描述
作为一个简短的离题,我们可以通过观察散点图来了解GPDC是如何工作的。

array, dymmy, dummy, dummy = gpdc._get_array(X=[(0, -1)], Y=[(2, 0)], Z=[(1, -2)], tau_max=2)
x, meanx = gpdc._get_single_residuals(array, target_var=0, return_means=True)
y, meany = gpdc._get_single_residuals(array, target_var=1, return_means=True)fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(8,3))
axes[0].scatter(array[2], array[0], color='grey', alpha=0.3)
axes[0].scatter(array[2], meanx, color='black')
axes[0].set_title("GP of %s on %s" % (var_names[0], var_names[1]) )
axes[0].set_xlabel(var_names[1]); axes[0].set_ylabel(var_names[0])
axes[1].scatter(array[2], array[1], color='grey', alpha=0.3)
axes[1].scatter(array[2], meany, color='black')
axes[1].set_title("GP of %s on %s" % (var_names[2], var_names[1]) )
axes[1].set_xlabel(var_names[1]); axes[1].set_ylabel(var_names[2])
axes[2].scatter(x, y, color='red', alpha=0.3)
axes[2].set_title("DC of residuals:" "\n val=%.3f / p-val=%.3f" % (gpdc.run_test(X=[(0, -1)], Y=[(2, 0)], Z=[(1, -2)], tau_max=2)) )
axes[2].set_xlabel("resid. "+var_names[0]); axes[2].set_ylabel("resid. "+var_names[2])
plt.tight_layout()

在这里插入图片描述
让我们来看一个具有乘性噪声的模型中更为非线性的依赖关系:

random_state = np.random.default_rng(seed=11)
data = random_state.standard_normal((600, 3))
for t in range(1, 600):data[t, 0] *= 0.2*data[t-1, 1]data[t, 2] *= 0.3*data[t-2, 1]
dataframe = pp.DataFrame(data, var_names=var_names)
tp.plot_timeseries(dataframe); plt.show()

在这里插入图片描述
由于乘性噪声违反了GPDC所基于的加性依赖的假设,虚假的链接被错误地检测出来,因为它无法被排除条件。然而,与ParCorr相比,两个真实的链接被检测出来,因为距离相关性(DC)可以检测到任何类型的依赖关系(底层的sklearn高斯过程函数可能会发出警告):

pcmci_gpdc = PCMCI(dataframe=dataframe, cond_ind_test=gpdc)
results = pcmci_gpdc.run_pcmci(tau_max=2, pc_alpha=0.1, alpha_level = 0.01)
tp.plot_graph(val_matrix=results['val_matrix'],graph=results['graph'],var_names=var_names,show_colorbar=False,)

在这里插入图片描述
在这里的散点图中,我们可以看到高斯过程无法很好地拟合依赖关系,因此残差不是独立的。

array, dymmy, dummy, dummy = gpdc._get_array(X=[(0, -1)], Y=[(2, 0)], Z=[(1, -2)], tau_max=2)
x, meanx = gpdc._get_single_residuals(array, target_var=0, return_means=True)
y, meany = gpdc._get_single_residuals(array, target_var=1, return_means=True)fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(8,3))
axes[0].scatter(array[2], array[0], color='grey')
axes[0].scatter(array[2], meanx, color='black')
axes[0].set_title("GP of %s on %s" % (var_names[0], var_names[1]) )
axes[0].set_xlabel(var_names[1]); axes[0].set_ylabel(var_names[0])
axes[1].scatter(array[2], array[1], color='grey')
axes[1].scatter(array[2], meany, color='black')
axes[1].set_title("GP of %s on %s" % (var_names[2], var_names[1]) )
axes[1].set_xlabel(var_names[1]); axes[1].set_ylabel(var_names[2])
axes[2].scatter(x, y, color='red', alpha=0.3)
axes[2].set_title("DC of residuals:" "\n val=%.3f / p-val=%.3f" % (gpdc.run_test(X=[(0, -1)], Y=[(2, 0)], Z=[(1, -2)], tau_max=2)) )
axes[2].set_xlabel("resid. "+var_names[0]); axes[2].set_ylabel("resid. "+var_names[2])
plt.tight_layout()

在这里插入图片描述

1.4 CMIknn

Tigramite中实现的最通用的条件独立性测试是基于使用k-最近邻估计器估计的条件互信息(CMIknn)。这个测试在下面的论文中有描述:

Runge, Jakob. 2018. “基于条件互信息最近邻估计器的条件独立性测试。” 载于第21届国际人工智能与统计会议论文集。

CMIknn不涉及对依赖关系的明确假设。然而,由于密度是通过局部样本超点隐式近似的,因此有一个假设是这些超立方体内密度是恒定的。参数knn决定了超立方体的大小,即(数据自适应的)局部长度尺度。

现在我们甚至不能预计算空模型分布,因为CMIknn不像GPDC那样基于残差,空模型分布依赖于更多因素。因此,我们使用significance='shuffle_test'在每个单独的测试中生成它。测试的洗牌测试 I ( X ; Y ∣ Z ) = 0 I(X;Y|Z)=0 I(X;YZ)=0随机 X X X值是局部的:每个样本点 x x x的值被随机映射到其最近邻居中的一个(shuffle_neighbors参数)在子空间 Z Z Z中。另一个可选参数是transform,它指定在CMI估计之前是否转换数据。新的默认值是transform=ranks,它比旧的transform=standardize效果更好。下面的单元可能需要几分钟时间。

# cmi_knn = CMIknn(significance='shuffle_test', knn=0.1, shuffle_neighbors=5, transform='ranks', sig_samples=200)
# pcmci_cmi_knn = PCMCI(
#     dataframe=dataframe, 
#     cond_ind_test=cmi_knn,
#     verbosity=0)
# results = pcmci_cmi_knn.run_pcmci(tau_max=2, pc_alpha=0.05, alpha_level = 0.01)
# tp.plot_graph(
#     val_matrix=results['val_matrix'],
#     graph=results['graph'],
#     var_names=var_names,
#     link_colorbar_label='cross-MCI',
#     node_colorbar_label='auto-MCI',
#     vmin_edges=0.,
#     vmax_edges = 0.3,
#     edge_ticks=0.05,
#     cmap_edges='OrRd',
#     vmin_nodes=0,
#     vmax_nodes=.5,
#     node_ticks=.1,
#     cmap_nodes='OrRd',
#     ); plt.show()

在这里插入图片描述

在这里,CMIknn正确地检测到了真实的链接,并且也揭示了虚假的链接。虽然CMIknn现在可能看起来是最好的独立性测试选择,我们必须注意到,这种通用性是以更低的检测能力为代价的,即当依赖关系实际上遵循某种参数形式时。那么,ParCorr或GPDC是更有力的措施。当然,ParCorr也比GPDC更好地检测线性链接。

另外需要注意的是:由于洗牌测试,CMIknn的计算成本非常高。你可以通过sig_samples参数减少洗牌样本的数量(以增加p值估计的误差为代价)。

或者,你可以使用significance='fixed_thres'选项。然后,pc_alpha被解释为任何条件独立性测试中的(单边)阈值 I ∗ I^* I。然后不会进行条件独立性假设检验。对于测试统计量 I ( X ; Y ∣ Z ) I(X;Y|Z) I(X;YZ)
的条件独立性的标准则是
I ( X ; Y ∣ Z ) < I ∗ I(X;Y|Z)<I^* I(X;YZ)<I
I ∗ I^* I应被视为超参数。请注意,为CMIknn选择 I ∗ I^* I是棘手的,因为 I ( X ; Y ∣ Z ) I(X;Y|Z) I(X;YZ)的值取决于变量的维度,由于有限样本的估计偏差。好的一面是,即使这样,CMIknn也相当快。

然后,你也可以使用像pc_alpha = [0.001, 0.005, 0.01, 0.05](或任何其他你选择的阈值列表)。然后计算所有这些阈值的图形,并使用CMIknn的(新)get_model_selection_criterion函数在这些图形中选择。该函数使用sklearn的cross_val_score(基于模型选择_folds的k折交叉验证集)和KNeighborsRegressor模型(与估计器的邻居数量相同,但使用标准的欧几里得范数)在每个节点上使用其在给定阈值产生的图形中的父节点。它将返回最小分数(预测误差)的结果。

这个选项只对依赖于排列测试的条件独立性测试有意义,这些测试是CMIknn和CMIsymb.

# Pick pc_alpha here interpreted as fixed threshold with significance='fixed_thres'
pc_alpha = 0.05  #[0.001, 0.005, 0.01, 0.025, 0.05, 0.1]cmi_knn = CMIknn(significance='fixed_thres', model_selection_folds=3)
pcmci_cmi_knn = PCMCI(dataframe=dataframe, cond_ind_test=cmi_knn, verbosity=0)
results = pcmci_cmi_knn.run_pcmciplus(tau_max=2, pc_alpha=pc_alpha)  
# if fixed_thres is used, pc_alpha (and alpha_level) is interpreted as a threshold on the test statistic.tp.plot_graph(val_matrix=results['val_matrix'],graph=results['graph'],var_names=var_names,link_colorbar_label='cross-MCI',node_colorbar_label='auto-MCI',vmin_edges=0.,vmax_edges = 0.3,edge_ticks=0.05,cmap_edges='OrRd',vmin_nodes=0,vmax_nodes=.5,node_ticks=.1,cmap_nodes='OrRd',); plt.show()

在这里插入图片描述
在这个例子中,选择 pc_alpha = [0.001, 0.005, 0.01, 0.025, 0.05, 0.1] 并不能得到正确的结果。阈值设定没有统计检验的严谨性,但可以帮助进行因果特征选择或在更大的机器学习流水线中使用因果发现等任务。

2a. 分类/符号时间序列

分类或符号(或离散)数据在值之间没有顺序或度量,比如苹果和梨子。为了适应这类时间序列,Tigramite包括了GsquaredCMIsymb条件独立性测试。这两种测试都是直接从离散值的直方图估计得出的。为了获得空模型分布,Gsquared使用 x 2 x^2 x2分布(对于零条目调整自由度),这只在渐近情况下有效(取决于数据)。对于较小的样本量,使用CMIsymb类,它包括基于条件互信息的局部排列测试,CMIsymb的计算时间要比Gsquared长得多。

在下面的过程中, X 0 X^0 X0, X 1 X^1 X1有两个类别,而 X 2 X^2 X2有三个。 X 0 X^0 X0 X 2 X^2 X2的概率取决于 X 1 X^1 X1的概率,其中 X 1 X^1 X1充当混杂因子。

T = 1000
def get_data(T, seed=1):random_state = np.random.default_rng(seed)data = random_state.binomial(n=1, p=0.4, size=(T, 3))for t in range(T):prob = 0.4+data[t-1, 1].squeeze()*0.2data[t, 0] = random_state.choice([0, 1], p=[prob, 1.-prob])prob = 0.4+data[t-2, 1].squeeze()*0.2data[t, 2] = random_state.choice([0, 1, 2], p=[prob, (1.-prob)/2., (1.-prob)/2.])return data
dataframe = pp.DataFrame(get_data(T), var_names=var_names)
tp.plot_timeseries(dataframe, figsize=(10,4)); plt.show()

在这里插入图片描述

在这里,我们关注Gsquared。请注意,G2统计量值随样本量的大小而变化,但它与条件互信息相关,相关公式为 G = 2 n C M I G = 2nCMI G=2nCMI。其中, n n n是样本量。因此,我们在这里转换val_matrix以获得更好解释(和可绘图的)量。

gsquared = Gsquared(significance='analytic')
pcmci_cmi_symb = PCMCI(dataframe=dataframe, cond_ind_test=gsquared)
results = pcmci_cmi_symb.run_pcmci(tau_min = 1, tau_max=2, pc_alpha=0.2, alpha_level = 0.01)val_matrix = results['val_matrix']
val_matrix /= (2.*T)
tp.plot_graph(val_matrix=val_matrix,graph=results['graph'],var_names=var_names,link_colorbar_label='cross-MCI',node_colorbar_label='auto-MCI',vmin_edges=0.,vmax_edges = 0.3,edge_ticks=0.05,cmap_edges='OrRd',vmin_nodes=0,vmax_nodes=.5,node_ticks=.1,cmap_nodes='OrRd',); plt.show()

在这里插入图片描述
请参考关于CMIsymb的独立教程,以及CMIknnMixed,该教程讨论了如何处理(连续和分类变量的)组合,甚至是同时包含两种类型的变量。

在这里,CMIsymb需要更长的时间并且给出了相同的结果,但对于较小的样本量和更高维度的条件集(和/或更多的分类值),Gsquared的渐近空模型分布可能不再有效,这时更倾向于使用CMIsymb。

# cmi_symb = CMIsymb(significance='shuffle_test')
# pcmci_cmi_symb = PCMCI(
#     dataframe=dataframe, 
#     cond_ind_test=cmi_symb)
# results = pcmci_cmi_symb.run_pcmci(tau_min = 1, tau_max=2, pc_alpha=0.2, alpha_level = 0.01)
# tp.plot_graph(
#     val_matrix=val_matrix,
#     graph=results['graph'],
#     var_names=var_names,
#     link_colorbar_label='cross-MCI',
#     node_colorbar_label='auto-MCI',
#     vmin_edges=0.,
#     vmax_edges = 0.3,
#     edge_ticks=0.05,
#     cmap_edges='OrRd',
#     vmin_nodes=0,
#     vmax_nodes=.5,
#     node_ticks=.1,
#     cmap_nodes='OrRd',
#     ); plt.show()

在这里插入图片描述

2b. 混合分类/连续时间序列

通常,人们可能会遇到一种情况,即在数据集中,一些变量是分类的,而另一些是连续的。这种情况可以通过RegressionCI独立性测试来解决。然后,必须通过dataframe的data_type参数为每个变量设置类型。这里更一般地将其实现为与数据形状相同的二进制数据数组,描述变量中的个别样本(或所有样本)是连续的还是离散的:连续变量用0表示,离散变量用1表示。在这里,一个变量的所有样本必须是相同的类型。

# Generate some mixed-type data with a binary variable (can also be multinomial) causing two continuous ones.
random_state = np.random.default_rng(42)
T = 1000
data = np.zeros((T, 3))
data[:, 1] = random_state.binomial(n=1, p=0.5, size=T)
for t in range(2, T):data[t, 0] = 0.5 * data[t-1, 0] + random_state.normal(0.2 + data[t-1, 1] * 0.6, 1)data[t, 2] = 0.4 * data[t-1, 2] + random_state.normal(0.2 + data[t-2, 1] * 0.6, 1)data_type = np.zeros(data.shape, dtype='int')
# X0 is continuous, encoded as 0 in data_type
data_type[:,0] = 0
# X1 is discrete, encoded as 1 in data_type
data_type[:,1] = 1
# X2 is continuous, encoded as 0 in data_type
data_type[:,2] = 0dataframe = pp.DataFrame(data,data_type=data_type,var_names=var_names)
tp.plot_timeseries(dataframe, figsize=(10,4)); plt.show()

在这里插入图片描述

regressionCI = RegressionCI(significance='analytic')pcmci = PCMCI(dataframe=dataframe, cond_ind_test=regressionCI)
results = pcmci.run_pcmci(tau_min = 1, tau_max=2, pc_alpha=0.2, alpha_level = 0.01)# Also here the test statistic values are not very useful
val_matrix = results['val_matrix']
val_matrix /= (2.*T)
tp.plot_graph(val_matrix=val_matrix,graph=results['graph'],var_names=var_names,link_colorbar_label='cross-MCI',node_colorbar_label='auto-MCI',vmin_edges=0.,vmax_edges = 0.1,edge_ticks=0.05,cmap_edges='OrRd',vmin_nodes=0,vmax_nodes=.5,node_ticks=.1,cmap_nodes='OrRd',); plt.show()

在这里插入图片描述

多变量X和Y的测试

上述测试中的几个也适用于多变量X和Y(所有测试都适用于多变量Z)。此外,元类PairwiseMultCI允许将每个单变量测试转换为多变量测试。该类还允许增加条件集,这可以帮助增加效应大小。

查看相应的教程和论文:
Tom Hochsprung, Jonas Wahl*, Andreas Gerhardus*, Urmi Ninad*, 和 Jakob Runge. 增加随机向量间成对条件独立测试的效应大小。UAI2023, 2023。

相关文章:

tigramite教程(七)使用TIGRAMITE 进行条件独立性测试

文章目录 概述1 连续数值变量1.1 ParCorr 偏相关&#xff08;ParCorr类&#xff09;1.2 鲁棒偏相关&#xff08;RobustParCorr&#xff09;非线性检验1.3 GPDC1.4 CMIknn 2a. 分类/符号时间序列2b. 混合分类/连续时间序列多变量X和Y的测试 概述 这个表格概述了 X ⊥ Y ∣ Z X\…...

【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置

【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置 目录 【DevOps工具篇】使用Ansible部署Keycloak oauth2proxy 和 单点登录(SSO)设置Ansible 基础知识部署 Keycloak创建 OIDC-客户端创建 oauth2proxy 部署顶级 Ansible PlaybookHost.iniplayboo…...

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…...

C#清空窗体的背景图片

目录 一、涉及到的知识点 1.设置窗体的背景图 2.加载窗体背景图 3.清空窗体的背景图 二、 示例 一、涉及到的知识点 1.设置窗体的背景图 详见本文作者的其他文章&#xff1a;C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140…...

Qt 实现的万能采集库( 屏幕/相机/扬声器/麦克风采集)

【写在前面】 之前应公司需要&#xff0c;给公司写过一整套直播的库( 推拉流&#xff0c;编解码)&#xff0c;类似于 libobs。 结果后来因为没有相关项目&#xff0c;便停止开发&维护了。 不过里面很多有用的组件&#xff0c;然后也挺好用的&#xff0c;遂开源出来一部分。…...

将写好的打印机代码打包成jar包然后直接注册成windows服务,然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件

实现文件流PDF不需要预览直接调用打印机打印实现方案就是&#xff0c;将写好的打印机代码打包成jar包然后直接注册成windows服务&#xff0c;然后通过调用插件的接口地址将流传到接口实现解析并无需预览直接通过打印机直接打印PDF文件。源码地址...

加密软件VMProtect教程:使用脚本-功能

VMProtect是新一代软件保护实用程序。VMProtect支持德尔菲、Borland C Builder、Visual C/C、Visual Basic&#xff08;本机&#xff09;、Virtual Pascal和XCode编译器。 同时&#xff0c;VMProtect有一个内置的反汇编程序&#xff0c;可以与Windows和Mac OS X可执行文件一起…...

51单片机入门_江协科技_21.1_开发板USB口连接建议

1. 目前我自己用的普中A2版本的开发板&#xff0c;操作失误导致在开发板连接电脑并通电的情况下误将跳线帽触碰到开发板的3.3V与GND&#xff0c;导致USB口浪涌&#xff0c;2个电脑上面的USB口烧毁&#xff0c;开发板暂时没有任何问题&#xff0c;电脑USB口现在只是接通后有电&a…...

基于Spring Boot 3 + Spring Security6 + JWT + Redis实现登录、token身份认证

基于Spring Boot3实现Spring Security6 JWT Redis实现登录、token身份认证。 用户从数据库中获取。使用RESTFul风格的APi进行登录。使用JWT生成token。使用Redis进行登录过期判断。所有的工具类和数据结构在源码中都有。 系列文章指路&#x1f449; 系列文章-基于SpringBoot3…...

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes&#xff08;k8s&#xff09;&#xff1a;精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…...

【随笔】Git 高级篇 -- 相对引用2(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…...

xilinx AXI CAN驱动开发

CAN收发方案有很多&#xff0c;常见的解决方案通过是采用CAN收发芯片&#xff0c;例如最常用的SJA1000,xilinx直接将CAN协议栈用纯逻辑实现&#xff0c;AXI CAN是其中一种&#xff1b; 通过这种方式硬件上只需外接一个PHY芯片即可 上图加了一个电平转换芯片 软件设计方面&…...

Python:百度AI开放平台——OCR图像文字识别应用

一、注册百度AI开放平台 使用百度AI服务的步骤为&#xff1a; 注册&#xff1a;注册成为百度AI开放平台开发者&#xff1b;创建AI应用&#xff1a;在百度API开放平台上创建相关类型的的AI应用&#xff0c;获得AppID、API Key和Secret Key&#xff1b;调用API&#xff1a;调用…...

OpenEuler/Centos制作离线软件源

需求背景&#xff1a; 一般线上服务器都是不能连接外网&#xff0c;服务器安装好系统之后就需要部署相关软件&#xff0c;此时因为无法联网导致无法下载软件&#xff0c;所以都会做一个本地的离线软件源&#xff0c;本文简单介绍如何快速利用已经下载好的rpm包&#xff0c;制作…...

论文笔记:基于多粒度信息融合的社交媒体多模态假新闻检测

整理了ICMR2023 Multi-modal Fake News Detection on Social Media via Multi-grained Information Fusion&#xff09;论文的阅读笔记 背景模型实验 背景 在假新闻检测领域&#xff0c;目前的方法主要集中在文本和视觉特征的集成上&#xff0c;但不能有效地利用细粒度和粗粒度…...

攻防世界 xff_referer 题目解析

xff_referer 一&#xff1a;了解xxf和Referer X-Forwarded-For:简称XFF头&#xff0c;它代表客户端&#xff0c;也就是HTTP的请求端真实的IP&#xff0c;只有在通过了HTTP 代理或者负载均衡服务器时才会添加该项。 一般的客户端发送HTTP请求没有X-Forwarded-For头的&#xff0…...

open-cd框架调试记录

源于论文Changer: Feature Interaction Is What You Need forChange Detection 源码位置&#xff1a;open-cd/README.md at main likyoo/open-cd (github.com) 同样是基于MMSegmentation框架的代码&#xff0c;不符合本人编程习惯所以一直也没有研究这东西&#xff0c;近期打…...

【算法刷题day17】Leetcode:110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

文章目录 Leetcode 110.平衡二叉树解题思路代码总结 Leetcode 257. 二叉树的所有路径解题思路代码总结 Leetcode 404.左叶子之和解题思路代码总结 草稿图网站 java的Deque Leetcode 110.平衡二叉树 题目&#xff1a;** 110.平衡二叉树** 解析&#xff1a;代码随想录解析 解题思…...

Linux云计算之Linux基础2——Linux发行版本的安装

目录 一、彻底删除VMware 二、VMware-17虚拟机安装 三、MobaXterm 安装 四、Centos 发行版 7.9的安装 五、rockys 9.1的安装 六、ubuntu2204的安装 一、彻底删除VMware 在卸载VMware虚拟机之前&#xff0c;要先把与VMware相关的服务和进程终止 1. 在windows中按下【Windo…...

C++:赋值运算符(17)

赋值也就是将后面的值赋值给变量&#xff0c;这里最常用的就是 &#xff0c;a1那么a就是1&#xff0c;此外还包含以下的赋值运算 等于int a 1; a10 a10加等于int a 1; a1;a2-减等于int a 1; a-1;a0*乘等于int a 2; a*5;a10/除等于int a 10; a/2;a5%模等于int a 10; a%…...

Spring Boot | Spring Boot的“数据访问“、Spring Boot“整合MyBatis“

目录: 一、Spring Boot”数据访问概述“二、Spring Boot”整合MyBatis”1. 基础环境搭建 (引入对应的“依赖启动器” 配置数据库的“相关参数”)① 数据准备 (导入Sql文件)② 创建项目&#xff0c;引入相应的启动器&#xff0c;编写数据库对应的“实体类”③额外添加pom.xml文…...

ActiViz中的数据集vtkPolyData

文章目录 前言一、数据结构二、数据内容三、几何操作四、数据导入与导出五、数据可视化六、函数详解1、SetPoints(vtkPoints points):2、SetPolys(vtkCellArray polys):3、GetNumberOfPoints():4、GetNumberOfCells():5、GetPointData():6、GetCellData():7、Ge...

【测试篇】测试用例

文章目录 前言具体设计测试用例等价类边界值场景设计法判定表&#xff08;因果图&#xff09;正交排列&#xff08;用的非常少&#xff09;错误猜测法 前言 什么是测试用例&#xff1f;&#xff1f; 测试用例是针对软件系统或应用程序的特定功能或场景编写的一组步骤&#xf…...

Shell学习 - 2.24 Shell let命令:对整数进行数学运算

let 命令和双小括号 (( )) 的用法是类似的&#xff0c;它们都是用来对整数进行运算&#xff0c;读者已经学习了《Shell (())》&#xff0c;再学习 let 命令就相当简单了。 注意&#xff1a;和双小括号 (( )) 一样&#xff0c;let 命令也只能进行整数运算&#xff0c;不能对小数…...

langchain Chroma 构建本地向量数据库

langchain Chroma 构建本地向量数据库 # import from langchain_community.document_loaders import TextLoader from langchain_community.embeddings.sentence_transformer import (SentenceTransformerEmbeddings, ) from langchain_community.embeddings import HuggingFa…...

Rust 中的字符串类型:`str` 和 `String`

Rust 中的字符串类型&#xff1a;&str 和 String 文章目录 Rust 中的字符串类型&#xff1a;&str 和 String1. &str&#xff1a;不可变的字符串引用2. String&#xff1a;可变的字符串3、字符串使用综合案例代码执行结果 在 Rust 编程语言中&#xff0c;有两种主要…...

Visual Studio(VS) 搭建 QT 开发环境

Visual Studio(VS) 搭建 QT 开发环境 在当今的软件开发领域,Visual Studio(VS)是一款备受欢迎的集成开发环境(IDE),而 QT 则是一个强大的跨平台应用程序框架。将两者结合使用,可以为开发人员提供高效、便捷的开发体验。本文将详细介绍如何在 VS2022 中搭建 QT 开发环…...

Qt模拟面试(超硬核)

1. 请简要介绍一下你的 Qt 开发经验。 建议&#xff1a;诚实地描述你的 Qt 经验&#xff0c;包括你使用过的 Qt 版本、开发过的项目类型、遇到的挑战以及如何解决它们。 假如你没有开发经验&#xff0c;可以提供一些关于 Qt 开发的一般信息和常见的经验分享。 Qt 是一个跨平…...

某眼实时票房接口获取

某眼实时票房接口获取 前言解决方案1.找到veri.js2.找到signKey所在位置3.分析它所处的这个函数的内容4.index参数的获取5.signKey参数的获取运行结果关键代码另一种思路票房接口:https://piaofang.maoyan.com/dashboard-ajax https://piaofang.maoyan.com/dashboard 实时票房…...

cesium键盘控制相机位置和姿态

该类主要用于监听键盘事件并在用户按下不同按键时执行相应的相机操作&#xff0c;如改变相机的位置、偏航角、俯仰角和翻滚角&#xff0c;从而实现在三维场景中的漫游。 以下是代码的主要逻辑&#xff1a; 导入Cesium库&#xff0c;并定义一个flags对象&#xff0c;其中包含了…...

上海网站建设乐云seo模板中心/seo监控系统

1、不能拷贝和直接拖拽文件至虚拟机系统中 解决办法&#xff1a; 通过共享文件夹的方式进行文件共享。 &#xff08;Win7 32位 10.0版本的虚拟机&#xff09;。 ①&#xff1a;选择虚拟机 虚拟机 → 设置 如下图&#xff1a; ②&#xff1a;在弹出的 设置对话框中 选中…...

淄博网站制作平台形象/seo流量的提升的软件

今天再画地图&#xff0c;对&#xff0c;没错&#xff0c;我又在画地图。 戴个耳机&#xff0c;微信读书走起。&#xff08;对我来说是微信听书&#xff09; 突发奇想&#xff1a; js能不能将文字转语音 以下这个demo我执行过&#xff0c;完全没问题&#xff0c;js是真滴强…...

seo管理系统易语言/应用宝aso优化

2019独角兽企业重金招聘Python工程师标准>>> Apache服务器80端口被占用——解决方法 80端口被占用解决办法有两种&#xff1a; 1.关闭占用80端口的程序&#xff0c;这时Apache服务器会正常启动&#xff1b; 2.修改Apache的端口&#xff0c;比如改为8081&#xff1b;…...

网站公安备案是必须的吗/百度平台我的订单查询在哪里

在linux运维工作中&#xff0c;熟练掌握磁盘管理相关技能是对运维人员最基本的要求。最近在学习系统管理的内容&#xff0c;而磁盘分区是其中比较重要的一部分内容。本实验所用linux系统为Centos6.6&#xff0c;涉及到的知识为linux磁盘分区。一、在实验前必须先要了解磁盘管理…...

上海做网站好的公司/淄博搜索引擎优化

归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法&#xff0c;它将待排序数组分成两个子数组&#xff0c;然后对这两个子数组分别进行排序&#xff0c;最后将两个已排序的子数组合并成一个有序数组。归并排序是一种稳定的排序算法&#xff0c;具体体现…...

沈阳网络建网站/西安seo教程

对于海量数据的插入和更新,ADO.NET确实不如JDBC做到好,JDBC有统一的模型来进行批操作.使用起来非常方便: PreparedStatement ps conn.prepareStatement("insert or update arg1,args2...."); 然后你就可以 for(int i0;i<1000000000000000;i){ ps.setXXX(realArg…...