R中lappy的标签输出
我对R相当陌生(到目前为止一直在使用SAS/Stata),我主要用于生物统计学R中lappy的标签输出,r,R,我对R相当陌生(到目前为止一直在使用SAS/Stata),我主要用于生物统计学 我正在尝试对20个ish解释变量进行单变量线性回归,并将其中具有p值的变量移动到中,而不是将数据分离到不同的数据帧中,保留单个数据帧并输入预测变量的列名。下面是一个使用内置mtcars数据框的示例 my_lms = lapply(names(mtcars)[-grep("mpg", names(mtcars))], function(n) { lm(paste("mpg ~ ", n), data=mtcars)
我正在尝试对20个ish解释变量进行单变量线性回归,并将其中具有p值的变量移动到中,而不是将数据分离到不同的数据帧中,保留单个数据帧并输入预测变量的列名。下面是一个使用内置
mtcars
数据框的示例
my_lms = lapply(names(mtcars)[-grep("mpg", names(mtcars))], function(n) {
lm(paste("mpg ~ ", n), data=mtcars)
})
然后可以打印摘要或置信区间,变量的实际列名将显示在输出中
lapply(my_lms, summary)
lapply(my_lms, confint)
在上面生成模型的代码中,我们使用data
参数告诉lm
使用哪个数据帧。然后我们在模型公式中使用列名,可以输入列名,就像我们在这里所做的那样,使用字符串而不是公式表达式。使用这种方法,实际变量名将显示在摘要输出中
如您所述,从模型公式中的一个或多个数据帧中获取向量会导致模型变量的列名不包含在摘要中。这也会导致一些辅助功能无法正常工作。例如:
m1 = lm(mtcars[,1] ~ mtcars[,6])
predict(m1, newdata=data.frame(wt=1:10))
这会产生一条警告信息:“newdata”有10行,但找到的变量有32行,并且predict
使用用于拟合模型的数据而不是我们输入函数的新数据输出预测
如果使用列名的命名向量,则将命名由lappy
输出的列表元素。这使得生成包含多个模型输出的单个数据帧成为可能,并添加一列来标记给定行所属的模型。例如:
library(broom)
library(purrr)
vars = names(mtcars)[-grep("mpg", names(mtcars))]
my_lms = lapply(setNames(vars, vars), function(n) {
lm(paste("mpg ~ ", n), data=mtcars)
})
map_df(my_lms, tidy, .id="Predictor Variable")
map_df(my_lms, confint_tidy, .id="Predictor Variable")
map_df(my_lms, augment, .id="Predictor Variable")
map_df(my_lms, glance, .id="Predictor Variable")
要收集其他模型信息,可以执行以下操作,例如:
library(broom)
library(purrr)
vars = names(mtcars)[-grep("mpg", names(mtcars))]
my_lms = lapply(setNames(vars, vars), function(n) {
lm(paste("mpg ~ ", n), data=mtcars)
})
map_df(my_lms, tidy, .id="Predictor Variable")
map_df(my_lms, confint_tidy, .id="Predictor Variable")
map_df(my_lms, augment, .id="Predictor Variable")
map_df(my_lms, glance, .id="Predictor Variable")
更新:回应评论:
names(mtcars)[-grep(“mpg”,names(mtcars))]
names(mtcars)
返回包含所有名称的向量,但我们希望排除mpg
,因为这是结果变量grep(“mpg”,names(mtcars))
返回mtcars
数据帧中mpg
的索引位置,它恰好是1
,因为mpg
是数据帧的第一列。因此,names(mtcars)[-grep(“mpg”,names(mtcars))]
相当于names(mtcars)[-1]
,这意味着返回mtcars
的所有列名的向量,位置1处的值除外。但是,我们使用了grep
,因为它允许我们排除具有给定名称的列,而不必知道其在数据帧中的索引位置。使用名称(mtcars)[-match(“mpg”,名称(mtcars))]
可以获得相同的结果
(事实上,后者更安全,因为names(mtcars)[-grep(“mpg”,names(mtcars))]
将排除任何包含mpg
作为其名称一部分的列;要强制grep
只匹配mpg
,您可以执行grep(^mpg$”,names(mtcars))
,但这涉及到字符串匹配的细节,您现在可能不想担心这些细节。)
您可以通过单独运行这些部分来了解这些函数的工作方式。例如,运行grep(“mpg”,名称(mtcars))
setNames(vars,vars)
处两次输入参数vars
vars
是列名的向量setNames(vars,vars)
为向量的每个元素指定一个名称。(运行setNames(vars,vars)
查看输出并比较它与vars
setNames
有两个参数。第一个参数是要为其设置名称的对象。第二个参数是要指定的名称。setNames(vars,字母[1:length(vars)])
将字母表的前10个字母指定为名称。)这将导致lappy
使用这些名称作为my_lms
中列表元素的名称。如果默认情况下,lappy
只是使用输入值vars
命名输出列表元素,那就太好了,但是它没有。避免setNames
的一种方法是使用sapply
而不是lapply
,但随后必须添加参数simplify=FALSE
my_lms = sapply(vars, function(n) {
lm(paste("mpg ~ ", n), data=mtcars)
}, simplify=FALSE)
lm(粘贴(“mpg~”,n)
时,您如何知道哪些变量R将使用mpg
进行线性回归
查看上面的sapply
函数,它创建my_lms
:sapply
和lappy
获取输入向量或列表(vars
)并在该输入向量或列表的每个元素上运行一个函数。在这种情况下,我们指定要运行的函数是lm
n
是一个“伪函数”返回到输入向量vars
的参数。因此,在函数n
的第一次迭代中,是vars
的第一个元素,即cyl
。在第二次迭代中,n
是disp
,以此类推map\u df
是来自purrr
包(它是tidyverse
包套件的一部分)的函数。map
相当于lappy
或sapply
map\u df
很方便,因为它返回数据帧而不是列表要了解更多关于这些东西的信息,你可能会发现这本免费的书很有帮助。你只需做:
名称(摘要)啊,好吧,如果有一种更方便的方法来保留更多的信息那就好了。但是,如果没有这种方法,我会这样做。另外,通过上面的方法,我意识到总结输出并没有给我95%的贝塔系数置信区间。有没有一种方法可以有效地输出呢?对任何人来说东北铜