将不同种类的参数传递给Vectorize()

时间:2017-06-14 09:27:01

标签: r function vectorization

我目前正在努力提高自己,有效地测试几个模型。我提供示例代码的尝试可以描述如下:

对于给定的因变量(data中的第11列),估计由其解释输入变量不同的线性模型。我希望有一对参数ab,它们决定了我的数据框data中解释变量选择的开始和结束列。

我在parameters中保存的这些参数组合。我想在给定行中的参数的情况下添加一个包含某些度量评估的列(此处为df.residual)。

但是,我在向量化问题时失败了。更具体地说,我正确地传递了ab,但没有传递data

# Example data
data = as.data.frame(mtcars)

# Setting the parameters for choosing x-columns
# a is the start column, b the end column
parameters = tidyr::expand(tibble(a=1:5, b = 1:5 * 2),a,b) %>%
dplyr::filter(a<b)


# Define the function called to yield the result
another_fun = function(a, b, data) {    
# Vectorize, here's some trouble
  case_fun_another = Vectorize( 
    function(a, b, data=data) {
      x = as.matrix(data[,a:b])
      y = as.matrix(data[,11])
      lm.fit(x=x,y=y)$df.residual
    }, SIMPLIFY = FALSE
  )

 output = case_fun_another(a, b)
 return(output)
}

# Calculate result
parameters = dplyr::mutate(parameters, result=another_fun(a, b, data))

产生:

promise already under evaluation: recursive default argument reference or earlier problems?

我发现这个主题的问题对我来说并不是很清楚。也许随着问题的描述变得更容易。

知道怎么处理它吗?除了使用Vectorize之外,我还会接受其他选项: - )

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

这里是一个不用处理嵌套函数和Vectorize的替代方法。

        <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="file"/>
        <data android:mimeType="audio/*"/>
        <data android:mimeType="application/ogg"/>
        <data android:mimeType="application/x-ogg"/>
        <data android:mimeType="application/itunes"/>
    </intent-filter>
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" />
        <data android:mimeType="audio/*"/>
        <data android:mimeType="application/ogg"/>
        <data android:mimeType="application/x-ogg"/>
        <data android:mimeType="application/itunes"/>
    </intent-filter>
    <intent-filter
        android:priority="-1">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="content" />
        <data android:mimeType="audio/*"/>
        <data android:mimeType="application/ogg"/>
        <data android:mimeType="application/x-ogg"/>
        <data android:mimeType="application/itunes"/>
    </intent-filter>

感谢@Roland指出使用# get all the possible pairwise combination of independent variables with combn ind.var <- names(data)[-11] %>% combn(., 2) %>% t head(ind.var) # [,1] [,2] # [1,] "mpg" "cyl" # [2,] "mpg" "disp" # [3,] "mpg" "hp" # [4,] "mpg" "drat" # [5,] "mpg" "wt" # [6,] "mpg" "qsec" # paste values of each row of ind.var, with separator "+" x <- do.call(paste, c(as.list(data.frame(ind.var, stringsAsFactors = FALSE)), sep="+")) y <- "carb" # write out all the linear model formula: forms <- mapply(function(a,b) paste(a, b, sep="~"), y, x) %>% setNames(NULL) all.lm <- lapply(forms, function(x) eval(bquote(lm(.(x), data=data)))) all.lm[[1]] # Call: # lm(formula = "carb~mpg+cyl", data = data) # # Coefficients: # (Intercept) mpg cyl # 3.63978 -0.09968 0.18995 来保留lm.object中的公式调用。