【问题标题】:Predicting how many columns in R's model.matrix预测 R 的 model.matrix 中有多少列
【发布时间】:2017-08-23 17:45:29
【问题描述】:

有没有一种方法可以使用公式来预测 model.matrix 中有多少列,而无需实例化 model.matrix?

我正在尝试优化代码以构建sparse.model.matrix

构造稀疏 mm 的内存分配在此函数中效率低下。因为它不知道最终矩阵中会有多少列,所以它不能为一个大矩阵进行 1 次内存分配。相反,它将循环遍历公式中的项,并分配许多较小的矩阵。在 for 循环的每次迭代中,它还会将矩阵 cbind 在一起以增长大输出矩阵,这会产生如此多的内存分配,并且对于大数据来说真的很慢。

如果有办法计算最终结果需要多少列,我们可以预先分配矩阵并使 sparse.model.matrix 更加高效。

我面临的挑战是我不知道如何计算交互项需要多少列,尤其是当存在 a:b:c 形式的交互时。另外,我没有对比的经验,所以不知道这会如何影响所需的列数

【问题讨论】:

  • 我确信有一种方法可以更优雅地做到这一点,但如果由于内存问题不想调用model.matrix(),也许解决方案是 a) 构建一个微型模拟保留所有原始因子水平的原始数据(您可以通过对原始数值变量进行抽样并对因子抽样levels() 来做到这一点),b)将model.matrix() 应用于这个新数据集,然后c)调用ncol()输出?

标签: r formula model.matrix


【解决方案1】:

这是一个小例子:

> set.seed(100)
> col_x1 = as.factor(sample(LETTERS[1:5], 10, replace = TRUE))
> col_x2 = as.factor(sample(LETTERS[1:10], 10, replace = TRUE))
> col_x3 = as.factor(sample(LETTERS[1:2], 10, replace = TRUE))
> df <- data.frame(X1 = col_x1, X2 = col_x2, X3 = col_x3)
> df
   X1 X2 X3
1   B  G  B
2   B  I  B
3   C  C  B
4   A  D  B
5   C  H  A
6   C  G  A
7   E  C  B
8   B  D  B
9   C  D  B
10  A  G  A
> str(df)
'data.frame':   10 obs. of  3 variables:
 $ X1: Factor w/ 4 levels "A","B","C","E": 2 2 3 1 3 3 4 2 3 1
 $ X2: Factor w/ 5 levels "C","D","G","H",..: 3 5 1 2 4 3 1 2 2 3
 $ X3: Factor w/ 2 levels "A","B": 2 2 2 2 1 1 2 2 2 1
> df_model_matrix <- model.matrix(~., df)
> dim(df_model_matrix)
[1] 10  9
> df_model_matrix <- model.matrix(~ X1 + X2 + X3 + X1*X2 + X2*X3 + X3*X1, df)
> dim(df_model_matrix)
[1] 10 28
> df_model_matrix <- model.matrix(~ X1 + X2 + X3 + X1*X2 + X2*X3 + X3*X1 + X1*X2*X3, df)
> dim(df_model_matrix)
[1] 10 40

在这种情况下,您要查找的公式是:

如果您以非常特定的方式使用 model.matrix(提供对比度、抑制截距等),那么您需要相应地对其进行修改。

【讨论】:

    猜你喜欢
    • 2013-06-21
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 2019-02-07
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多