我使用partykit
包并遇到以下错误消息:
Error in matrix(0, nrow = mi, ncol = nl) :
invalid 'nrow' value (too large or NA)
In addition: Warning message:
In matrix(0, nrow = mi, ncol = nl) :
NAs introduced by coercion to integer range
我使用了this文章中给出的示例,该文章将包及其处理与许多类别进行了比较。
问题是,使用的拆分变量包含太多类别。在mob()
函数内,创建了包含所有可能拆分的矩阵。仅此矩阵的大小为p * (2^(p-1)-1)
,其中p是分裂变量的类别数。
根据所使用的系统资源(RAM等),对于不同数量的p,会出现给定的错误。
文章建议使用基尼标准。我认为在partykit包的意图中,不能使用Gini标准,因为我没有目标变量的分类问题,而是模型规范问题。
我的问题是:有没有办法找到这种情况的分割或减少要检查的分割数量的方法?
答案 0 :(得分:1)
仅搜索k个有序分裂而不是2 ^ k -1无序分区的技巧仅在某些情况下有效,例如,当可以按每个类别内的平均值对响应进行排序时。我从未在足够详细的细节中看过基础理论,但这只能在某些假设下工作,而且我不确定这些是否在某处得到了很好的拼写。你肯定需要一个单变量问题,因为只有一个基础参数(通常是均值)被优化。鉴于对基尼的重视,目标函数的可能持续可分性也可能是一个问题。
由于mob()
可能最常用于分区多个参数的情况,我不认为有可能利用这个技巧。同样,ctree()
可以很容易地应用于具有多变量分数的情况,即使响应变量是单变量的(例如,用于捕获位置和比例差异)。
我通常会建议将多个级别的因素细分为更小的部分。例如,如果您有观察邮政编码的因子:那么可以使用状态/省的因子,以及编码" size"的数字变量。 (地区或人口),编码农村与城市的因素等。当然,这是额外的工作,但通常也会带来更多可解释的结果。
话虽如此,如果有的话,我们的愿望清单是partykit利用这些技巧。但它并不是我们当前议程的首要任务......
答案 1 :(得分:0)
我用来解决问题的方法是通过使用model.matrix(~ 0 + predictor, data)
在对比矩阵中转换变量。 ctree()
无法管理长因素,但可以轻松管理具有许多变量的数据集。
当然有缺点,使用这种技术会失去ctree()
的因子聚类功能;每个节点将只使用一个级别,因为它们现在是不同的列。