问题描述
我想在以下数据帧上应用以下调整后的 spearman 等级相关性(用于 sobol 敏感性指数的收敛检查),如 https://www.sciencedirect.com/science/article/pii/S1364815216300251?via%3Dihub 中所建议。 (输入因子排序的收敛性)。在公式中,i 是参数(a、b 或 c),j/k 是样本数(因此在本例中为 1、2、3 或 4)。
示例数据帧由 3 个参数 (a,b,c) 组成,它们的 sobol 灵敏度指数 (S_a,S_b,S_c) 和等级 (R_a,R_b,R_c) 给出了 4 个样本:
初始 df:
S_a S_b S_c R_a R_b R_c
1 0.3 0.4 0.2 2 1 3
2 0.5 0.3 0.2 1 2 3
3 0.6 0.3 0.1 1 2 3
4 0.6 0.3 0.1 1 2 3
公式指出,我应该得到所有可能的样本结果对的 spearman 系数。这意味着对于这个数据集,我应该得到组合 (1_2) (1_3) (2_3) (1_4) (2_4) (3_4) 的 spearman 相关性。 -> (1_1) 不是合法的对组合,(2_1) 也不是,因为它等于 (1_2)。因此,初始数据帧的输出数据帧应如下所示:
所需的 df:
combination(j,k) spearman(j,k)
1_2 ...
1_3 ...
2_3 ...
1_4 ...
2_4 ...
3_4 ...
然而,我正在为代码而苦苦挣扎。我已经到了应该对上述等式中的所有项求和的地步。 代码
import pandas as pd
df = pd.DataFrame({ "ID": ['n1','n2','n3','n4'],"S_a": [0.3,0.5,0.6,0.6],
"S_b": [0.4,0.3,0.3],
"S_c": [0.2,0.2,0.1,0.1],
"R_a": [2,1,1],
"R_b": [1,2,2],
"R_c": [3,3,3]})
print(df)
df.set_index('ID',inplace=True)
a,b = map(list,zip(*combinations(df.index,2)))
d = pd.concat([df.loc[a].reset_index(),df.loc[b].reset_index()],keys=['a','b'],axis=1)
d.set_index([('a','ID'),('b','ID')]).rename_axis(['a','b'])
print(d)
# S_max -----
S_max = d.loc[:,d.columns.get_level_values(1).isin({"S_a","S_b","S_c"})]
S_max = S_max.max(level=1,axis=1)**2
S_max['S_sum'] = S_max.sum(axis=1)
print(S_max)
# R_abs -----
R_abs = d.loc[:,d.columns.get_level_values(1).isin({"R_a","R_b","R_c"})]
print(R_abs)
R_abs = R_abs['a'].sub(R_abs['b'],level=1,axis=1).abs()
print(R_abs)
# ID_sum -----
ID_sum = d.loc[:,d.columns.get_level_values(1).isin({"ID"})]
ID_sum = ID_sum.reindex(['b','a'],level=0,axis=1)
ID_sum = ID_sum.apply(lambda x : ''.join(x.astype(str)),1)
ID_sum.columns = ['ID']
print(ID_sum)
# resulting matrix -----
result = S_max
result["ID"] = ID_sum
result = result.merge(R_abs,left_index=True,right_index=True,how='inner')
print(result)
result['spearman'] = sum(x.mul(y.div(z)) for x,y,z in zip([result['R_a'],result['R_b'],result['R_c']],[result['S_a'],result['S_b'],result['S_c']],[result['S_sum'],result['S_sum'],result['S_sum']]))
print(result)
...
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)