我有一个由组成数据构成的数据集。每一列表示混合物中一个组分的百分比(小数值)。每一行总和为1。
如果混合物中的一个组分发生变化,其余组分必须相应地改变以满足总和约束条件。
我正在使用这些数据执行多元线性回归,并且需要进行一些转换,以使回归系数具有意义并可解释。数据集包含零值,这对我尝试实施的特定类型的转换是一个问题。
在我执行此转换之前,建议的操作是用一个小数字替换所有零值,并调整其余组分,使总和约束仍然得到满足。
您可以在下面的虚拟数据框中看到有些情况下一行中有多个零值。
如果混合物中的一个组分发生变化,其余组分必须相应地改变以满足总和约束条件。
我正在使用这些数据执行多元线性回归,并且需要进行一些转换,以使回归系数具有意义并可解释。数据集包含零值,这对我尝试实施的特定类型的转换是一个问题。
在我执行此转换之前,建议的操作是用一个小数字替换所有零值,并调整其余组分,使总和约束仍然得到满足。
您可以在下面的虚拟数据框中看到有些情况下一行中有多个零值。
data = {'X1': [0.21, 0.08, 0.57, 0.03],
'X2': [0.27, 0.56, 0.0, 0.02],
'X3': [0.0, 0.14, 0.0, 0.45],
'X4': [0.13, 0.02, 0.26, 0.37],
'X5': [0.39, 0.2, 0.17, 0.13]}
df = pd.DataFrame(data)
print(df)
让我们只考虑一行,因此计算公式如下:
假设原始值为r_i
。对于组件r_i
的变化delta_i
,我们得到新值x_i
。
因此,x_i = r_i + delta_i
为了保持其余组件之间的相对比例,
让r_j
成为其余组件的原始值,
然后第j个分量的新值x_j为,
x_j = r_j - ((r_j / (1 - r_i) * delta_i) and i != j
我正在努力编写一个适当的循环来搜索数据集中的零值,然后在包含零值的索引和列中添加一个小数,然后继续使用上述公式调整整个行。
编辑:
抱歉数学公式表达不好。
对于虚拟df中的第一行,应用公式是直截了当的,因为该行只有一个零:
重要的是剩余组件之间的相对比例保持不变,当我将零值更新为一个小数时,您可以在这里看到。
对于虚拟数据框的第三行,情况变得有点复杂。我通过添加一个小数来更新第一个(X2)零值。第二个(X3)零值仍然为零,因为公式正在乘以和除以零。 因此,我进行了第二次更新,使X2和X3现在成为小的非零值,并在下面的表的第三行中显示。 在存在多个零的行上,保持剩余组件之间的相对比例的情况与此类似。我无法想出第一个问题的循环,更别提第二个了! 而且,不要担心相对比例表中由于除以小数而产生的大数字,我稍后会处理。