我在do.call功能上苦苦挣扎。我在数据集上运行了几个不同的模型。
对于每个模型,我想传递模型函数,一个指定模型,函数参数和数据集的公式。
我希望很清楚我想做什么,如果不是,请发表评论,我试着澄清我的问题。
我当前的代码有点长,所以这是一个伪玩具示例:
methods <- c('lm','glm',...)
arguments <- list( list( 'Arguments lm '), list( 'Arguments glm '),... )
models <- list( y ~. x1 + x2 , y ~. x1 + x3)
for( i in 1:N ) {
current.model <- do.call( methods[i], ??? )
}
答案 0 :(得分:1)
这是一个例子
[DisplayName("Erledigt am")]
[DataType(DataType.Date)]
public Nullable<System.DateTimeOffset> end_time { get; set; }
我将稍微修改你的结构,使参数成为明确的列表列表,并命名内部列表中的每个元素以消除歧义。
library(data.table)
set.seed(123)
dat <- data.table(x1=runif(10),x2=runif(10),x3=runif(10))
dat[,y:=x1+2*x2+3*x3+runif(10)]
> dat
x1 x2 x3 y
1: 0.2875775 0.95683335 0.8895393 5.832886
2: 0.7883051 0.45333416 0.6928034 4.675683
3: 0.4089769 0.67757064 0.6405068 4.376344
4: 0.8830174 0.57263340 0.9942698 5.806561
5: 0.9404673 0.10292468 0.6557058 3.138048
6: 0.0455565 0.89982497 0.7085305 4.448594
7: 0.5281055 0.24608773 0.5440660 3.410939
8: 0.8924190 0.04205953 0.5941420 2.975372
9: 0.5514350 0.32792072 0.2891597 2.392937
10: 0.4566147 0.95450365 0.1471136 3.038589
methods <- c('lm','glm')
arguments <- list( list(data=dat), list(data=dat,family="gaussian"))
models <- list( y ~. x1 + x2 , y ~. x1 + x3)
需要一个函数和一个参数列表。所以我可以做do.call
形式的事情。由于模型本身就是一个论点,我需要将它加入到&#34;附加&#34;您在do.call([an element of methods],[a list of arguments])
中提供的参数。所以我会有某种对象,例如arguments
。第一个参数中的c(list(models[[1]]),arguments[[1]])
将元素list
转换为列表models[[1]]
,以便arguments[[1]]
可以连接两个相似的列表。最后,我可以在for循环中调用c
,但do.call
- 样式更喜欢R
个函数。在这里,我使用*apply
来获取seq_along
并应用一个匿名函数来执行for循环的主体;总而言之,这实际上是一个缩写的for循环,它返回结果列表:
1:length(methods)
可以直接深入了解您的搜索结果。如果我调用该对象lapply(seq_along(methods), function(n)
do.call(methods[n],c(list(models[[n]]),arguments[[n]])))
[[1]]
Call:
lm(formula = y ~ x1 + x2, data = structure(list(x1 = c(0.563014860032126,
0.211994701065123, 0.174694777932018, 0.135693877004087, 0.460017150267959,
0.736233349423856, 0.63450039527379, 0.652027820236981, 0.467176814330742,
0.148995384806767), x2 = c(0.0307870297692716, 0.601646583992988,
0.812958373920992, 0.698285705409944, 0.907962741097435, 0.75469194049947,
0.0430496339686215, 0.0829190369695425, 0.109014765359461, 0.33699565846473
), x3 = c(0.412113963160664, 0.432729347608984, 0.0741072639357299,
0.382540747756138, 0.0340626831166446, 0.624421828892082, 0.179525560466573,
0.884322474710643, 0.548561444506049, 0.0785303884185851), y = c(2.22677680454217,
3.11262330505997, 2.2728122510016, 3.08046812936664, 3.15304983314127,
4.43124474911019, 1.85952415782958, 4.28254768694751, 2.72436442878097,
1.10656954837032)), .Names = c("x1", "x2", "x3", "y"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7fbe1a050b78>))
Coefficients:
(Intercept) x1 x2
0.8162 3.1206 1.6057
[[2]]
Call: glm(formula = y ~ x1 + x3, family = "gaussian", data = structure(list(
x1 = c(0.563014860032126, 0.211994701065123, 0.174694777932018,
0.135693877004087, 0.460017150267959, 0.736233349423856,
0.63450039527379, 0.652027820236981, 0.467176814330742, 0.148995384806767
), x2 = c(0.0307870297692716, 0.601646583992988, 0.812958373920992,
0.698285705409944, 0.907962741097435, 0.75469194049947, 0.0430496339686215,
0.0829190369695425, 0.109014765359461, 0.33699565846473),
x3 = c(0.412113963160664, 0.432729347608984, 0.0741072639357299,
0.382540747756138, 0.0340626831166446, 0.624421828892082,
0.179525560466573, 0.884322474710643, 0.548561444506049,
0.0785303884185851), y = c(2.22677680454217, 3.11262330505997,
2.2728122510016, 3.08046812936664, 3.15304983314127, 4.43124474911019,
1.85952415782958, 4.28254768694751, 2.72436442878097, 1.10656954837032
)), .Names = c("x1", "x2", "x3", "y"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x7fbe1a050b78>))
Coefficients:
(Intercept) x1 x3
1.6630 0.6408 2.4483
Degrees of Freedom: 9 Total (i.e. Null); 7 Residual
Null Deviance: 9.518
Residual Deviance: 4.269 AIC: 27.87
,那么例如x
是第一个拟合模型,我可以使用标准函数套件与它进行交互:
x[[1]]