我有多个数据框,我想在每个数据框上评估(多个)不同的模型。MWE
df1 <- data.frame(A3 = c(-5, 5, 1),
B3 = c(0, 10, 1))
df2 <- data.frame(A4 = c(5, 15, 1))
B4 = c(10, 20, 1))
myfun <- function(arg1, arg2){ # arg1 =1 or 2
if (arg2 == 1){
eqn <- paste0("A", arg1+2) ~ paste0("B", arg1+2) + I(as.name(paste0("B", arg1+2))^2)
} else {
eqn <- paste0("A", arg1+2) ~ paste0("B", arg1+2) + I(as.name(paste0("B", arg1+2))^2) +I(as.name(paste0("B", arg1+2))^3)
}
return (lm(formula = eqn, data = eval(as.name(paste0("df", arg1)))
)
)
}
例如,如果我跑步,myfun(1,2)
我想得到lm(A4 ~ B4 + I(B4^2) + I(B4^3), data = df2)
。但是无论如何,我都会收到以下错误消息Error in (paste0("B", arg1 +2))^2 : non-numeric argument to binary operator
。从我读到的内容中?I
,我想这是因为R隔离了传入的任何内容I()
,所以它没有意识到我正在尝试转换变量:这是怎么回事,我可以解决吗?另外,有没有更好的方法来快速估算多个模型?我发现所有类似的问题在data.frame
各个模型中都使用相同的问题,而我不得不考虑来自不同模型的不同数据帧的响应(和预测变量)。
也许这就是您要寻找的:
问题是您正在对字符串进行数学运算,即(paste0("B", arg1 +2))^2
尝试对字符串进行平方运算,这就是为什么会出现错误的原因。在Inytead中,您可以将公式作为字符串简单地粘在一起,并通过as.formula
以下方式将其转换为公式:
df1 <- data.frame(A3 = c(-5, 5, 1),
B3 = c(0, 10, 1))
df2 <- data.frame(A4 = c(5, 15, 1))
B4 = c(10, 20, 1)
myfun <- function(arg1, arg2){ # arg1 =1 or 2
if (arg2 == 1){
eqn <- paste0("A", arg1+2, " ~ B", arg1+2," + I(B", arg1+2, "^2)")
} else {
eqn <- paste0("A", arg1+2, " ~ B", arg1+2," + I(B", arg1+2, "^2) + I(B", arg1+2, "^3)")
}
return (lm(formula = as.formula(eqn), data = eval(as.name(paste0("df", arg1)))
)
)
}
myfun(2, 1)
#>
#> Call:
#> lm(formula = as.formula(eqn), data = eval(as.name(paste0("df",
#> arg1))))
#>
#> Coefficients:
#> (Intercept) B4 I(B4^2)
#> 0.84795 0.12281 0.02924
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句