如何将公式传递给 lm() 没有错误?

Jzl*_*a10 0 r formula lm

我尝试将公式传递给 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)

有谁知道问题出在哪里?

G. *_*eck 6

有一个警告(不是错误),因为问题中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)