在 Python 中生成模拟数据,同时满足与预定义变量相关的一系列相关性
Generate simulated data in Python while meeting a range of correlations with respect to a predefined variable
让我们用 refVar 表示,这是一个包含实验数据的感兴趣的变量。
对于模拟研究,我想生成其他变量 V0.05、V0.10、V0.15 直到 V0.95。
请注意,对于变量名称,V 后面的值表示变量与 refVar 之间的相关性(以便在最终数据帧中快速跟踪)。
我的阅读让我从 numpy 中找到 multivariate_normal() 。然而,当使用这个函数时,它会生成 2 个一维数组,它们都带有随机数。我想要的是始终保持 refVar 并生成其他填充随机数的数组,同时满足指定的相关性。
请在下面找到我的代码。简而言之,我不知道如何生成与我的实验变量 refVar 相关的其他变量。理想情况下,我想构建一个包含以下列的数据框:refVar,V0.05,V0.10,...,V0.95。我希望你明白我的意思,并提前感谢你的时间
import numpy as np
import pandas as pd
from numpy.random import multivariate_normal as mvn
refVar = [75.25,77.93,78.2,61.77,80.88,71.95,79.88,65.53,85.03,61.72,60.96,56.36,23.16,73.36,64.18,83.07,63.25,49.3,78.2,30.96]
mean_refVar = np.mean(refVar)
for r in np.arange(0,1,0.05):
var1 = 1
var2 = 1
cov = r
cov_matrix = [[var1,cov],
[cov,var2]]
data = mvn([mean_refVar,mean_refVar],cov_matrix,size=len(refVar))
output = 'corr_'+str(r.round(2))+'.txt'
df = pd.DataFrame(data,columns=['refVar','v'+str(r.round(2)])
df.to_csv(output,sep='\t',index=False) # Ideally, instead of creating an output for each correlation, I would like to generate a DF with refVar and all these newly created Series
根据我们可以生成如下序列:
def rand_with_corr(refVar, corr):
# center and normalize refVar
X = np.array(refVar) - np.mean(refVar)
X = X/np.linalg.norm(X)
# random sampling Y
Y = np.random.rand(len(X))
# centralize Y
Y = Y - Y.mean()
# find the orthorgonal component to X
Y = Y - Y.dot(X) * X
# normalize Y
Y = Y/np.linalg.norm(Y)
# output
return Y + (1/np.tan(np.arccos(corr))) * X
# test
out = rand_with_corr(refVar, 0.05)
pd.Series(out).corr(pd.Series(refVar))
# out
# 0.050000000000000086
让我们用 refVar 表示,这是一个包含实验数据的感兴趣的变量。 对于模拟研究,我想生成其他变量 V0.05、V0.10、V0.15 直到 V0.95。 请注意,对于变量名称,V 后面的值表示变量与 refVar 之间的相关性(以便在最终数据帧中快速跟踪)。 我的阅读让我从 numpy 中找到 multivariate_normal() 。然而,当使用这个函数时,它会生成 2 个一维数组,它们都带有随机数。我想要的是始终保持 refVar 并生成其他填充随机数的数组,同时满足指定的相关性。 请在下面找到我的代码。简而言之,我不知道如何生成与我的实验变量 refVar 相关的其他变量。理想情况下,我想构建一个包含以下列的数据框:refVar,V0.05,V0.10,...,V0.95。我希望你明白我的意思,并提前感谢你的时间
import numpy as np
import pandas as pd
from numpy.random import multivariate_normal as mvn
refVar = [75.25,77.93,78.2,61.77,80.88,71.95,79.88,65.53,85.03,61.72,60.96,56.36,23.16,73.36,64.18,83.07,63.25,49.3,78.2,30.96]
mean_refVar = np.mean(refVar)
for r in np.arange(0,1,0.05):
var1 = 1
var2 = 1
cov = r
cov_matrix = [[var1,cov],
[cov,var2]]
data = mvn([mean_refVar,mean_refVar],cov_matrix,size=len(refVar))
output = 'corr_'+str(r.round(2))+'.txt'
df = pd.DataFrame(data,columns=['refVar','v'+str(r.round(2)])
df.to_csv(output,sep='\t',index=False) # Ideally, instead of creating an output for each correlation, I would like to generate a DF with refVar and all these newly created Series
根据
def rand_with_corr(refVar, corr):
# center and normalize refVar
X = np.array(refVar) - np.mean(refVar)
X = X/np.linalg.norm(X)
# random sampling Y
Y = np.random.rand(len(X))
# centralize Y
Y = Y - Y.mean()
# find the orthorgonal component to X
Y = Y - Y.dot(X) * X
# normalize Y
Y = Y/np.linalg.norm(Y)
# output
return Y + (1/np.tan(np.arccos(corr))) * X
# test
out = rand_with_corr(refVar, 0.05)
pd.Series(out).corr(pd.Series(refVar))
# out
# 0.050000000000000086