我正在尝试创建一个随机向量,其分量是不相关的标准正态变量,平均值和单位方差为零。我正在使用功能
这些随机变量是不相关的吗?因为当我试图找到协方差系数时:
import numpy as np
print(np.random.normal(0,1,size=17))
print(np.cov(np.random.normal(0,1,size=17)))
此外,Python并没有给我精确的零协方差系数(我的结果接近0.9(
这些是从标准均匀分布中提取的独立且同分布的变量。因此,您应该期望它们是不相关的。如果想要IID标准正常变量,则需要调用np.random.normal(size=n)
。
你不应该期望从任何相关性测试中得到完全为零的值——这是从该分布中提取的一组随机值,有时它们可能恰好是自相关的。
更新:我刚刚玩过Numpy的cov
函数,觉得你用错了。现在你告诉它测试一个值和它本身之间的相关性,这将是一个微不足道的身份。我认为corrcoef
可能是更好的方法,因为它被归一化为[-1,1],这使得解释值更容易。
import numpy as np
import scipy.stats as sps
n = 100
for _ in range(20):
obs = np.random.normal(size=n)
# calculate autocorrelation
s1 = np.corrcoef(obs[1:], obs[:-1])[0,1]
# calculate correlation with index
s2 = np.corrcoef(obs, np.arange(n))[0,1]
print(f" {s1: .3f} {s2: .3f}")
# 95% of the values above should be smaller than this
ts = sps.norm.ppf((1 - 0.95) / 2) / np.sqrt(n)
print(f"n{t:.0%} cutoff for n={n} is $abs(s) < {np.abs(ts):.3f}$")
如果我运行这个,我会得到以下输出:
0.118 -0.152
-0.005 -0.145
-0.177 0.143
0.091 0.186
-0.183 0.083
-0.009 0.027
-0.124 -0.083
0.111 0.167
-0.207 -0.093
-0.025 -0.191
-0.117 -0.001
-0.019 -0.026
-0.177 -0.057
0.084 -0.123
-0.144 0.088
-0.018 0.245
0.117 0.002
0.069 0.084
0.025 0.043
-0.101 -0.112
95% cutoff for n=100 is $abs(s) < 0.196$
请注意,有两个值大于测试统计值,但这是意料之中的事。使用n=100_000
重新运行提供了一个更严格的界限,但您仍然应该获得相同的失败率。
你的更新显示你的n=17
,所以你可能想切换到学生的t分布作为截止值。类似于:
ts = sps.t(n-2).ppf((1 - 0.95) / 2) / np.sqrt(n)
即仅将CCD_ 6改变为CCD_。注意,从高斯变为t只会使n=17
的截止值从0.475变宽到0.517。
我同意Sam Mason的观点,即您计算相关性不正确。实际上,你需要序列相关性,也就是自相关,它测量序列中不同滞后的值对之间的相关性。还要注意,在一般情况下,相关性和协方差不是一回事。滞后k处的相关性是滞后k处由滞后0处的协方差(其通常被认为是非序列上下文中的方差(缩放的协方差。这种缩放会产生一个介于-1和1之间的无单位值。另一方面,协方差在大小上既不是无单位的,也不是有界的。
由于你使用的是样本数据,你需要意识到样本平均值和样本方差与总体的理论平均值和方差不同。为了获得自相关的良好估计,你需要";标准化";减去平均值并除以标准差得到的数据。如果你不进行标准化,就有可能得到大于1的相关性估计。
这里的代码将计算k从0到min的滞后k自相关(样本大小,10(。滞后0相关性总是1,因为每个观测都与其自身完全相关。它作为健全性检查包含在内。
import numpy as np
n = 100
my_array = np.random.normal(0, 1, size=n)
my_mean = np.mean(my_array) # sample mean of the data
my_var = np.var(my_array) # sample variance of the data
my_array = (my_array - my_mean) / np.sqrt(my_var) # standardized
# Estimate correlations between all pairings of the standardized data, pick off
# the appropriate subset of lag k correlations, and average the results at
# each lag. Scaling by n rather than (n-k) results in a biased estimator, but
# increases stability of the estimator and has relatively low impact for k
# small relative to n.
#
# Ideally the outcome should be a one followed by all zeros if the data are
# independent. In practice sampling variance will yield non-zero results, but
# they should converge towards zero as n is increased.
print(np.correlate(my_array, my_array, mode = 'full')[n - 1 : min(2*n, n + 10)] / n)
这会产生以下结果:
[ 1. -0.12001073 0.13843158 -0.0488547 -0.0372176 0.13162176 -0.00577363 -0.04491521 0.00122878 0.16740437 -0.07059456]
对于n=100和
[ 1. 0.00129255 -0.02647235 -0.01868428 -0.00134764 -0.00246469 0.04393734 0.00669801 -0.04666181 -0.00369125 -0.02117044]
对于n=1000。