【问题标题】:Regress categorical variables in Matlab在 Matlab 中回归分类变量
【发布时间】:2015-09-07 20:11:21
【问题描述】:

我有一个包含 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{:});

有人可以帮我吗?谢谢

【问题讨论】:

  • 逻辑 reg 在这里似乎是个好主意
  • @STNYU Code2 你说?
  • @STNYU - 你的意思是逻辑回归,对吧?
  • @rayryeng 你的意思是 logit 模型?
  • @rayryeng 我的因变量 y 的值确实不平衡(只有不到 10% 的值是 1),因此就“结果”而言,它们将与线性的结果非常相似概率。模型。但是,如果这是我在 Matlab 中做到这一点的唯一方法,我会尝试,因为我根本没有成功。现在看看怎么做!谢谢

标签: matlab regression categorical-data


【解决方案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])

上面的代码sn-ps应该可以正常工作了。

但是,您可以考虑将分类变量声明为分类变量(如果您有 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 真的很好,有很多例子,所以也检查一下。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2017-03-31
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2022-11-29
    • 1970-01-01
    • 2016-03-12
    相关资源
    最近更新 更多