我尝试将公式传递给 lm()。但是,当我执行以下操作时:
independend_vars <- c("PC_1_food_men","covar_prev_diab")
dependent_var <- c("PC_1_mets_men", "PC_2_mets_men", "PC_3_mets_men")
var_names <- independend_vars
formula <- as.formula(paste0(dependent_var, "~", paste0(var_names, collapse = "+")))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Warning:
Using formula(x) is deprecated when x is a character vector of length > 1.
Consider formula(paste(x, collapse = " ")) instead.
Run Code Online (Sandbox Code Playgroud)
有谁知道问题出在哪里?
有一个警告(不是错误),因为问题中dependent_var
有多个元素,它让您知道它忽略了除第一个元素之外的所有元素。另请注意,您不必将字符串转换为公式,因为lm
它将接受字符串,但如果给定长度 > 1 的字符向量,它将忽略除第一个元素之外的所有元素并给出类似的警告。
我们可以将问题中的代码修改为:
paste(sprintf("cbind(%s)", toString(dependent_var)), "~",
paste(var_names, collapse = " + "))
Run Code Online (Sandbox Code Playgroud)
给予:
[1] "cbind(PC_1_mets_men, PC_2_mets_men, PC_3_mets_men) ~ PC_1_food_men + covar_prev_diab"
Run Code Online (Sandbox Code Playgroud)
但是,reformulate
在下一节中使用as 更容易一些。
相反,我们可以使用 形成 LHS sprintf
,然后将其与 中的自变量一起使用reformulate
。使用内置的 CO2 数据集,以便我们可以实际运行结果:
dep_vars <- names(CO2)[4:5] # c("conc", "uptake")
indep_vars <- names(CO2)[2:3] # c("Type", "Treatment")
fo <- reformulate(indep_vars, sprintf("cbind(%s)", toString(dep_vars)))
fo
## cbind(conc, uptake) ~ Type + Treatment
lm(fo, CO2)
Run Code Online (Sandbox Code Playgroud)
给予:
Call:
lm(formula = fo, data = CO2)
Coefficients:
conc uptake
(Intercept) 4.350e+02 3.697e+01
TypeMississippi -5.582e-14 -1.266e+01
Treatmentchilled 0.000e+00 -6.860e+00
Run Code Online (Sandbox Code Playgroud)
这个问题有多个因变量,但如果只有一个,那么我们可以简化重新表述的陈述。例如,仅使用第一个因变量:
reformulate(indep_vars, dep_vars[1])
## conc ~ Type + Treatment
Run Code Online (Sandbox Code Playgroud)
上面的 Call: 行按字面意思显示了 RHS,fo
但我们可以使用do.call
它来强制它产生更好看的 Call: 行。
do.call("lm", list(fo, quote(CO2)))
Run Code Online (Sandbox Code Playgroud)
给予:
Call:
lm(formula = cbind(conc, uptake) ~ Type + Treatment, data = CO2)
Coefficients:
conc uptake
(Intercept) 4.350e+02 3.697e+01
TypeMississippi -5.582e-14 -1.266e+01
Treatmentchilled 0.000e+00 -6.860e+00
Run Code Online (Sandbox Code Playgroud)