【问题标题】:Use every level of a categorical variable in a regression在回归中使用分类变量的每个级别
【发布时间】:2015-11-26 19:02:54
【问题描述】:

简短说明

我正在尝试在 Matlab 中运行(GLM)回归(使用 fitglm 函数),其中一个回归量是分类变量。但是,我不想添加截距并删除第一级,而是希望包括分类变量的每个级别并排除常数项。

动机

我知道,理论上两种方法的结果都是相同的,但我有两个理由反对用常数估计模型并以不同方式解释虚拟水平系数:

  • 较小的问题是我正在运行许多回归作为 使用大数据的不同子集的更大的估计过程 数据集,我的分类变量的可用级别可能 在回归中不一样。最后我想 比较水平的估计系数。它可以解决 一些额外的代码/黑客,但这不是一个优雅的解决方案。
  • 更大的问题是数量级 水平系数之间的差异:其中一些 非常小。如果这样的级别被用作基础级别,我就是 担心它可能会导致数值问题/优化 问题。

尝试过的方法

我尝试对 GeneralizedLinearModel 类进行子类化,但不幸的是它被标记为 final。类组合也不起作用,因为我什至无法从 GeneralizedLinearModel 类的父类继承。由于我使用共享的 Matlab 安装,因此无法修改 Matlab 的文件。

我能想到的唯一想法是使用 dummyvar 或类似的东西将我的分类变量变成一组虚拟变量,然后在回归中使用这些虚拟变量。 AFAIK 这就是 Matlab 内部的工作方式,但是通过采用这种方法,我失去了处理分类变量的用户友好性。

附:这个问题也发布在 MatlabCentral this link

【问题讨论】:

    标签: matlab regression glm


    【解决方案1】:

    由于似乎没有内置方法可以执行此操作,因此我发布了一个我编写的简短函数以完成工作。

    我有一个辅助函数可以将分类变量转换为虚拟数组:

    function dummyTable = convert_to_dummy_table(catVar)
        dummyTable = array2table(dummyvar(catVar));
        varName = inputname(1);
        levels = categories(catVar)';
        dummyTable.Properties.VariableNames = strcat(varName, '_', levels);
    end
    

    用法很简单。如果您有一个表T 有一些连续的解释变量X1, X2, X3、一个分类解释变量C 和一个响应变量Y,那么不要使用

    M = fitglm(T, 'Distribution', 'binomial', 'Link', 'logit', 'ResponseVar', 'Y')
    

    这将适合使用 k - 1 级别的分类变量和截距的 logit 模型,可以这样做

    estTable = [T(:, {'X1', 'X2', 'X3', 'Y'}), convert_to_dummy_table(T.C)]
    M = fitglm(estTable, 'Distribution', 'binomial', 'Link', 'logit', ... 
                         'ResponseVar', 'Y', 'Intercept', false)
    

    它不像处理分类变量的默认方式那样美观和易读,但它的优点是虚拟变量的名称与 Matlab 在估计期间使用分类变量自动分配的名称相同。因此生成的M 对象的Coefficients 表很容易解析或理解。

    【讨论】:

    • 抱歉,语法突出显示混乱,如果没有明确使用 transpose 函数(我不想要),我无法避免突出显示错误解释字符串开头的转置运算符。跨度>
    猜你喜欢
    • 2014-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2022-01-22
    相关资源
    最近更新 更多