如何使用 stats.models 将数据转换为混合效应模型的偏态正态分布?

问题描述 投票:0回答:1

我是建模新手,所以请耐心等待,但我正在使用 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)
任何人都可以建议在这种情况下该怎么做吗?

也许我没有正确转换,或者,也许有更好的方法来处理左偏正态分布?

谢谢!!!

python transform statsmodels mixed-models normal-distribution
1个回答
0
投票
让我们分解情况并逐步解决问题。

左偏残差:理想情况下,回归模型的残差应呈正态分布。如果不是,则可能表明模型中存在非线性、遗漏变量或其他问题。转型有时有助于实现这一目标。但是,在进行转换之前,考虑其他模型规范、添加交互项或包含其他预测变量可能会很有用。

使用偏斜正态分布的转换:使用偏斜正态分布的想法很有趣,但正确实现有点棘手。主要问题是由于您在数据正态分布的 CDF 值上使用偏正态分布的逆 CDF(百分点函数,或 ppf)。这可能会导致意外的结果,特别是在倾斜参数极端的情况下。

值变成 np.inf:np.inf 值的出现是因为,对于倾斜参数的某些值和数据的值,ppf 函数返回无穷大。当 CDF 值接近 1 时尤其如此。

转换回来:记住转换数据会改变规模和分布是至关重要的。当您将转换后的参数恢复到原始比例时,它们可能并不总是有意义,特别是在转换不合适的情况下。

建议:

替代变换:在使用偏正态分布之前,请考虑更简单的变换,例如平方根、对数或 Box-Cox 变换。 Box-Cox 变换尤其有用,因为它确定了可减少偏度的数据的最佳幂变换。

模型规范:考虑向模型添加其他预测变量、多项式项或交互项。有时,可以通过以不同方式指定模型来解决残差的偏度。

使用分位数回归:如果主要关注的是残差的分布,并且转换似乎不起作用,请考虑使用分位数回归。它没有对残差的分布做出假设。

重新评估转换的需要:有时,残差与正态性的轻微偏差可能不是大问题,特别是在样本量很大的情况下。

© www.soinside.com 2019 - 2024. All rights reserved.