SA 指数配对样本的调整斯皮尔曼等级相关性

问题描述

我想在以下数据帧上应用以下调整后的 spearman 等级相关性(用于 sobol 敏感性指数的收敛检查),如 https://www.sciencedirect.com/science/article/pii/S1364815216300251?via%3Dihub 中所建议。 (输入因子排序的收敛性)。在公式中,i 是参数(a、b 或 c),j/k 是样本数(因此在本例中为 1、2、3 或 4)。

enter image description here

示例数据帧由 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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...