R中的动态公式创建?

时间:2015-04-18 00:46:44

标签: r matrix formula linear-regression

是否可以将lm()函数与矩阵一起使用?或许,正确的问题是:“是否可以在R中动态创建公式?”

我正在创建一个函数,其输出是一个矩阵,矩阵中的列数不固定=它取决于用户的输入。我想使用矩阵中的数据拟合OLS模型。 - 第一列表示因变量 - 其他列是自变量。

使用lm函数需要一个公式,该公式预先知道解释变量的数量,这不是我的情况!

除了使用OLS公式手动估算方程外,还有其他解决方案吗?

可重复的例子:

> # When user 1 uses the function, he obtains m1
> m1 <- replicate(5, rnorm(50))
> colnames(m1) <- c("dep", paste0("ind", 1:(ncol(m1)-1)))
> head(m1)
            dep       ind1        ind2       ind3       ind4
[1,]  0.5848705  0.3602760 -0.95493403 -1.7278030 -0.1914170
[2,]  1.7167604 -0.1035825  0.31026183 -1.5071415 -1.2748600
[3,] -0.1326187 -0.5669026  0.01819749  0.8346880 -0.6304498
[4,] -0.7381232  0.4612792 -0.36132404 -0.1183131 -0.7446985
[5,]  0.9919123 -1.3228248 -0.44728270  0.6571244 -0.4895385
[6,] -0.8010111  0.8307584 -0.16106804  0.3069870 -0.3834583
> 
> # When user 2 uses the function, he obtains m2
> m2 <- replicate(6, rnorm(50))
> colnames(m2) <- c("dep", paste0("ind", 1:(ncol(m2)-1)))
> head(m2)
            dep       ind1       ind2         ind3       ind4       ind5
[1,]  1.2936031 -0.8060085  0.5020699 -1.699123234  1.0205626  1.0787888
[2,]  1.2357370  0.5973699 -1.2134283 -0.928040354 -0.3037920 -0.1251678
[3,]  0.5292583  0.1063213 -1.3036526  0.395886937 -0.1280863  1.1423532
[4,]  0.9234484 -0.4505604  1.2796922  0.424705893 -0.5547274 -0.3794037
[5,] -0.8016376  1.1362677 -1.1935238 -0.004460092 -1.4449704 -0.3739311
[6,]  0.4385867  0.5671138  0.4493617 -2.277925642 -0.8626944 -0.6880523

用户1将使用以下内容估算线性模型:

lm(dep ~ ind1 + ind2 + ind3 + ind4, data = m1)

同时用户2有一个额外的自变量,并将通过以下方式估计线性模型:

lm(dep ~ ind1 + ind2 + ind3 + ind4 + ind5, data = m1)

再一次,有什么方法可以动态创建公式吗?

1 个答案:

答案 0 :(得分:2)

是的,实际上公式界面的性能问题列数越多。 实际上,对于较大的列宽,矩阵接口是首选

  

有什么方法可以动态创建公式吗?

当然,您可以通过列索引向量直接查找矩阵列,也可以通过将名称向量转换为列索引来间接查找矩阵列 使用grep(cols_you_want, names(mat))

但是在你的情况下,你不需要打扰grep,因为你已经有一个简单的列命名方案,你知道ind1...ind5对应于列索引1..5

lm(m1[,'dep'] ~ m1[,2:5])

# or in general
lm(m1[,'dep'] ~ m1[,colIndicesVector])  # e.g. c(1,3,4)