0

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

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{:});

有人可以帮助我吗?谢谢

4

1 回答 1

2

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

第一个问题是 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每次要运行回归时都指定参数。

最后,这个函数的Matlab 文档fitlm非常好,有很多例子,所以也检查一下。

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

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

但是,如果您这样做,请务必了解逻辑模型是什么,它的假设是什么以及它的系数的解释是什么。

于 2015-09-07T11:21:07.590 回答