在Matlab中回归分类变量

时间:2014-08-18 14:31:54

标签: matlab regression categorical-data

我有一个12列和20000行的单元格类型变量。我称之为Atotal:

Atotal= [ATY1;ATY2;ATY3;ATY4;ATY5;ATY6;ATY7;ATY8;ATY9;ATY10;ATY11;ATY12;ATY13;ATY14;ATY15;ATY16;ATY17];

Atotal={   972   1  0 0 0 0 0  21   60  118  60110  2001
           973   0  0 1 0 0 0  15   46  1496 60110  2001
           980   0  0 0 0 1 0  4    68  142  40502  2001
           994   1  0 0 0 0 0  13   33  86   81101  2001
           995   0  0 0 1 0 0  9    55  183  31201  2001
           1024  1  0 0 0 0 0  10   26  3    80803  2001}

我从那里得到我的依赖和自变量:

Y1=cell2mat(Atotal(:,2));
X1=cell2mat(Atotal(:,3));

然后我倒退了。考虑到我的因变量Y1是二进制而我的自变量X1 也是分类变量,我使用下面的代码,仍然不确定是否这是正确的。

mdl1 = fitlm(X1,Y1,'CategoricalVars',logical([1]));

然后我添加更多的假人并尝试相同的代码:

X2=cell2mat(Atotal(:,4));
X3=cell2mat(Atotal(:,5));
X4=cell2mat(Atotal(:,6));
X5=cell2mat(Atotal(:,7));

mdl2 = fitlm(X1,X2,X3,X4,X5,Y1,'CategoricalVars',logical([1,2,3,4,5]));

但现在它给了我一些错误:

Error using internal.stats.parseArgs (line 42)
Parameter name must be text.

Error in LinearModel.fit (line 849)
            [intercept,predictorVars,responseVar,weights,exclude, ...

Error in fitlm (line 117)
model = LinearModel.fit(X,varargin{:});

有人可以帮助我吗?谢谢

1 个答案:

答案 0 :(得分:1)

我认为您的代码存在两个问题。

第一个问题是fitlm需要以下参数:

mdl = fitlm(X,y,modelspec)

这基本上意味着您必须将预测变量收集到一个矩阵中,并将其用作第一个参数。所以你应该做到以下几点:

X = [X1, X2, X3, X4, X5];
fitlm(X, Y1, ...)

第二个问题是,CategoricalVars参数fitlm需要一个逻辑向量(一个向量,其中变量是分类的,而在连续的情况下为零)数字索引向量。所以正确的用法是:

X = [X1, X2, X3, X4, X5];
fitlm(X, Y1, 'CategoricalVars',logical([1,1,1,1,1]))

X = [X1, X2, X3, X4, X5];
fitlm(X, Y1, 'CategoricalVars', [1,2,3,4,5])

以上代码段应该可以正常运行。

但是,您可以考虑将分类变量声明为分类变量(如果您使用Matlab R2013b或更高版本)。在这种情况下,您将执行以下操作:

X1 = categorical(cell2mat(Atotal(:,3)));
X2 = categorical(cell2mat(Atotal(:,4)));
X3 = categorical(cell2mat(Atotal(:,5)));
X4 = categorical(cell2mat(Atotal(:,6)));
X5 = categorical(cell2mat(Atotal(:,7)));

X = [X1, X2, X3, X4, X5];
fitlm(X, Y1)

这种方法的优点是Matlab知道您的Xi变量是分类的,并且它们将被相应地处理,因此您不必每次要运行时都指定CategoricalVars参数回归。

最后,fitlm函数的Matlab documentation非常适用于很多示例,所以请检查一下。

注意:正如其他人在评论中提到的那样,您还应该考虑运行logit回归,因为您的响应变量是二进制的。在这种情况下,您可以通过以下方式估算模型:

X = [X1, X2, X3, X4, X5];
fitglm(X, Y1, 'Distribution', 'binomial', 'Link', 'logit')

但是,如果你这样做,一定要了解逻辑模型是什么,它的假设是什么以及它的系数解释是什么。