我在R中使用一个适合特定形式的回归模型的包。但是,与允许x和y为单独对象的基本lm()函数不同,我正在使用的函数要求它们位于同一数据帧中。
我的问题出现了,因为我有很多变量,我想独立回归。因此,我有一个包含10个预测变量(x1,x2 ... x10)和一个标准变量(y)的数据帧,总共11列。我可以使用for循环来运行十个单独的回归,但我想避免它并使用apply函数。但是,如果我在我的数据框架上调用apply,那么在最后一步中它将对y本身进行回归,我想避免这种情况。是否有类似于apply的功能,我可以运行并指定thiat我只希望它运行10次而不是11次,或者是否有另一种解决方法来解决这个问题?
这是一个tidyverse
解决方案:
library( tidyverse )
xx <- c("disp", "hp", "drat", "wt") # Names of predictor variables
y <- "mpg" # Name of response
str_c( y, xx, sep="~" ) %>%
map( as.formula ) %>% # Optional (see below)
map( lm, data = mtcars )
str_c
只是将公式构建为字符串(例如,"mpg~disp"
)。虽然lm
直接接受字符串,但您的特定回归模型可能不会。如果它需要一个实际的公式,你可以使用as.formula
将字符串转换为公式(感谢您的建议,@ J.Doe!)。除此之外,只需将lm
替换为您的特定型号和mtcars
与您的数据框。
这是使用基本R而没有任何其他包的相同解决方案:
strs <- paste( y, xx, sep="~" )
strs <- lapply( strs, as.formula ) # Optional
lapply( strs, lm, data=mtcars )
使用具有列anscombe
,x1
,x2
,x3
,x4
,y1
,y2
,y3
的内置y4
数据框,假设我们想要分别对y1
,x1
,x2
,x3
中的x4
进行回归。
首先创建一个自变量名称xnames
的字符向量,并使用lapply
在其上运行指示的run_lm
。该函数将所需的公式粘贴在一起,并执行返回lm
类对象的"lm"
。 L
,结果,是这些对象的列表,每个回归一个。
没有使用包裹。
xnames <- names(anscombe)[1:4]
run_lm <- function(nm) lm(paste("y1 ~", nm), anscombe)
L <- lapply(xnames, run_lm)
或者,这个较短版本的run_lm
也适用于上面的lapply
,但Call:
输出线不是很好:
run_lm <- function(nm) lm(anscombe[c("y1", nm)])