在回归

时间:2015-09-01 13:48:17

标签: matlab regression glm

简短说明

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

动机

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

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

尝试过方法

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

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

P.S。这个问题也发布在MatlabCentral上this link

1 个答案:

答案 0 :(得分: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在估算期间使用分类变量自动分配的名称相同。因此,生成的Coefficients对象的M表很容易解析或理解。