在do.call中更正参数规范

时间:2016-03-02 11:56:13

标签: r

我在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], ??? ) 

}

1 个答案:

答案 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]]