我试图在Matlab中运行(GLM)回归(使用fitglm
函数),其中一个回归量是一个分类变量。但是,我想包括分类变量的每个级别并排除常量项,而不是添加截距并删除第一级。
我知道,从理论上讲,结果两种方式都是相同的,但我有两个理由反对使用常数估计模型并以不同方式解释虚拟水平系数:
我尝试了继承GeneralizedLinearModel类,但不幸的是它被标记为final。类组合也不起作用,因为我甚至无法从GeneralizedLinearModel类的父级继承。由于我使用共享的Matlab安装,因此无法修改Matlab的文件。
我能想出的唯一想法是使用dummyvar或类似的东西将我的分类变量变成一组虚拟变量,然后在回归中使用这些虚拟变量。 AFAIK这就是Matlab内部工作的方式,但通过采用这种方法,我失去了处理分类变量的用户友好性。
P.S。这个问题也发布在MatlabCentral上this link。
答案 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
表很容易解析或理解。