我是建模新手,所以请耐心等待,但我正在使用 statsmodels mixedlm
,如下所示:
model = smf.mixedlm("value ~ categorical_variable", data, groups=data[year_identifier])
我尝试转换我的响应变量,使其成为具有自定义倾斜参数的倾斜法线:
# Define the custom skew-normal distribution with a custom skew parameter
skew_parameter = -4
# Transform response variable using the inverse CDF
data["transformed_value"] = stats.skewnorm.ppf(
stats.norm.cdf(
x=np.array(data["value"].values),
),
skew_parameter,
)
它产生了所有 np.inf
值。然后我尝试通过调整
loc
和
scale
值来进行转换:
# Transform response variable using the inverse CDF
data["transformed_value"] = stats.skewnorm.ppf(
stats.norm.cdf(
x=np.array(data["value"].values),
loc=np.mean(data["value"]),
scale=np.std(data["value"]),
),
skew_parameter,
)
这提供了一个转换后的数组,但是当我绘制残差时,分布实际上是更糟,当我使用下面的公式将它们转换回来时,这些值看起来根本不正确:
result.params['Intercept'] = stats.skewnorm.cdf(result.params['Intercept'], skew_parameter)
result.params['categorical_variable[T.value]'] = stats.skewnorm.cdf(result.params['categorical_variable[T.value]'], skew_parameter)
任何人都可以建议在这种情况下该怎么做吗?也许我没有正确转换,或者,也许有更好的方法来处理左偏正态分布?
谢谢!!!
左偏残差:理想情况下,回归模型的残差应呈正态分布。如果不是,则可能表明模型中存在非线性、遗漏变量或其他问题。转型有时有助于实现这一目标。但是,在进行转换之前,考虑其他模型规范、添加交互项或包含其他预测变量可能会很有用。
使用偏斜正态分布的转换:使用偏斜正态分布的想法很有趣,但正确实现有点棘手。主要问题是由于您在数据正态分布的 CDF 值上使用偏正态分布的逆 CDF(百分点函数,或 ppf)。这可能会导致意外的结果,特别是在倾斜参数极端的情况下。
值变成 np.inf:np.inf 值的出现是因为,对于倾斜参数的某些值和数据的值,ppf 函数返回无穷大。当 CDF 值接近 1 时尤其如此。
转换回来:记住转换数据会改变规模和分布是至关重要的。当您将转换后的参数恢复到原始比例时,它们可能并不总是有意义,特别是在转换不合适的情况下。
建议:
替代变换:在使用偏正态分布之前,请考虑更简单的变换,例如平方根、对数或 Box-Cox 变换。 Box-Cox 变换尤其有用,因为它确定了可减少偏度的数据的最佳幂变换。
模型规范:考虑向模型添加其他预测变量、多项式项或交互项。有时,可以通过以不同方式指定模型来解决残差的偏度。
使用分位数回归:如果主要关注的是残差的分布,并且转换似乎不起作用,请考虑使用分位数回归。它没有对残差的分布做出假设。
重新评估转换的需要:有时,残差与正态性的轻微偏差可能不是大问题,特别是在样本量很大的情况下。