方差解释 - 分类数据的等效统计?

机器算法验证 分类数据 方差 r平方
2022-04-02 16:34:44

我有一个多项式响应变量和一个多项式“独立”变量。是否有等效的统计数据或方法来计算自变量解释的方差?

4个回答

对于广义线性模型 (GLM),我们使用偏差值作为回归中使用的缩放平方和的概括(参见此处的相关答案)。代替线性回归中使用的决定系数,我们将使用 McFadden'sR2值,由下式给出:

RGLM2=^p^0^S^0,

在哪里^S是饱和模型下的最大对数似然(每个数据点一个系数),^p是实际模型下的最大对数似然,并且^0是空模型下的最大化对数似然(仅截距项)。

此拟合优度量衡量超出由实际模型中的解释变量解释的空模型的偏差比例。它是高斯线性回归模型中决定系数的概括(即,它减少到该模型中的统计量)。

如果您使用起来很舒服R2作为解释方差比例的粗略近似,知道它在非线性情况下不正确,例如逻辑回归(但您决定它对您的工作有多好,作为您的听众认为它理解的易于计算的估计),那么无论您使用的是分类特征还是连续特征都没有关系。总平方和的分解导致R2,在链接中给出,从未明确提及这些特征(是的,它们通过预测隐含地存在,y^i),只有观察值和预测值。

我实际上认为赏金评论提出的问题与原始帖子不同。由于赏金消息将在几天后消失,因此我将在下面包含文字,因为我相信我解决的赏金问题比原始问题更多。此外,赏金要求有信誉的来源。我希望大多数回归教科书都能分解总平方和来解释如何R2最终给出解释的方差比例(至少在 OLS 中线性与截距)。我的教授使用了 Agresti 的书,所以这就是我所知道的。您正在寻找的是第 2 章第 47-54 页中的内容。

阿格雷斯蒂,艾伦。线性和广义线性模型的基础约翰威利父子公司,2015 年。

赏金

我可以将 R2 报告为数值预测变量“解释”的变异分数的粗略指标,但我如何为分类预测变量报告类似的指标?感觉应该有一个简单的表达方式,但我正在努力寻找表达它的参考!

鉴于您只有一个因变量和一个自变量,您可以执行为分类变量量身定制的相关测试并报告相关统计数据(及其 p 值)。本文很好地概述了您的选择。

也就是说,或者您可以简单地执行交叉验证并从那里报告准确性指标。但是,尽管这是一个简单且更“通用”的解决方案,但请注意,这是一个有偏差的方差估计量

基于 Dave 和 Vasilis 的回应(我很抱歉 Ben,我的非统计大脑无法完全吸收你的答案——这在我身上)我编写并粗略地验证了一个 python 函数来生成一个“R2 等价物”网格。

我有点担心我需要编写代码来完成我认为是常见任务的事情。因此,我发布了我的代码 (a) 以便其他有类似需求的人可以使用它,并且 (b) 供有经验和时间提供反馈的任何人审查!

def explain_variation_by_category_grid(data_in, cat_cols, cont_cols, dropna = True):
    '''
    Generate a grid of quasi r2 values of for the approximate fraction of squared
    difference in the continuous variable associated with each category.

    Influenced by discussion here:
        https://stats.stackexchange.com/questions/215606/variance-explained-equivalent-statistics-for-categorical-data

        Parameters:
            data_in (pandas dataframe):
            cat_cols (list): category columns
            cont_cols (list): continuous columns
            dropna (Bool): exlude NA values
            
        Returns:
            quasi R2 (dataframe): indexed on the continuous variables and one column for each category 
    '''

    def sum_of_var_sqd(a):
        ''' calculate sum of sqared difference from group mean '''
        mean = a.mean()
        return ((a - mean) ** 2).sum()
    
    res_dict = {}
    for split in cat_cols:
        res_dict[split] = {}
        for var in cont_cols:
            f = [split, var]
            data = data_in[f].dropna() if dropna else data_in[f]
            all_sum_of_var_sqd = sum_of_var_sqd(data[data.columns[1]])
            agg = pd.pivot_table(data, index=split, aggfunc=[sum_of_var_sqd])
            cat_sum_of_var_sqd = agg[agg.columns[0]].sum()
            r2 = 1 - (cat_sum_of_var_sqd /all_sum_of_var_sqd )
            res_dict[split][var] = r2
    return pd.DataFrame.from_dict(res_dict)

我的测试数据由大约 150k 条记录组成,用于训练 NN 和增强森林 (BF) 模型,并根据样本预测 ( _pred) 和计算残差 ( *_act - *_pre = *_d) 生成两个感兴趣的结果(恢复时间 = ~ 分钟到手术后醒来;DAOH30 =“活着和出院的日子”)。

正如您所看到的,分类预测变量都与实际值弱相关,但模型(使用他们拥有的数据)都做出了与预测变量更紧密相关的预测。残差的值接近于零,这是我所希望的,因为预期模型将抵消变量的影响。

显示准 r2 值的表