我目前正在努力提高自己,有效地测试几个模型。我提供示例代码的尝试可以描述如下:
对于给定的因变量(data
中的第11列),估计由其解释输入变量不同的线性模型。我希望有一对参数a
和b
,它们决定了我的数据框data
中解释变量选择的开始和结束列。
我在parameters
中保存的这些参数组合。我想在给定行中的参数的情况下添加一个包含某些度量评估的列(此处为df.residual
)。
a
和b
,但没有传递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之外,我还会接受其他选项: - )
非常感谢提前。
答案 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中的公式调用。