如何解决在 Python 中生成模拟数据,同时满足与预定义变量相关的一系列相关性
让我们表示 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,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
解决方法
按照this answer,我们可以生成如下序列:
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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。