R中的动态公式创建?
Dynamic formula creation in R?
是否可以将 lm() 函数与矩阵一起使用?或者,正确的问题是:"Is it possible to dynamically create formulas in 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)
再一次,有什么方法可以动态创建公式吗?
是的,事实上,公式界面的性能问题是列数越大。
所以实际上矩阵接口首选大列宽。
Is there any way I can create the formula dynamically?
当然,您可以直接通过列索引向量查找矩阵列,或者通过将名称向量转换为列索引间接查找矩阵列
使用 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)
是否可以将 lm() 函数与矩阵一起使用?或者,正确的问题是:"Is it possible to dynamically create formulas in 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)
再一次,有什么方法可以动态创建公式吗?
是的,事实上,公式界面的性能问题是列数越大。 所以实际上矩阵接口首选大列宽。
Is there any way I can create the formula dynamically?
当然,您可以直接通过列索引向量查找矩阵列,或者通过将名称向量转换为列索引间接查找矩阵列
使用 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)