R.对变量对逐列迭代的多元线性回归

时间:2020-09-29 16:11:27

标签: r linear-regression

我有一个数据帧dfA(真正的数据帧有1000行和40万列)。从第6列开始,变量名称是由x组成的“三元组”,带有x个不同的前缀(GT_x,N_x,E_x),其中x = rs1,rs7,rs300,rs502等:

ID    SEX    PV    GAN    GAE    GT_rs1    N_rs1    E_rs1    GT_rs7    N_rs7    E_rs7    ...
2    0    7.8    0.3    0.4    0    1    1    1    0    2    ...
6    1    6.4    0.35    0.55    0    0    1    1    1    2    ...

以下是我的数据的可复制示例:

dfA = data.frame(rbind(c("ID","SEX","PV","GAN","GAE","GT_rs1","N_rs1","E_rs1","GT_rs7","N_rs7","E_rs7"), 
                   c(2,0,7.8,0.3,0.4,0,1,1,1,0,2),
                   c(6,1,6.4,0.35,0.55,0,0,1,1,1,2)))
dfA = dfA %>% row_to_names(row_number = 1)

使用R,我想运行以下形式的线性回归:

lm(PV ~ SEX + GAN + GT_x + N_x)

其中x是rs1,rs7等。因此,我需要对成对的变量逐列进行迭代。我想获取不同协变量(SEX,GAN,GT_x和N_x)的估计值,std.error,统计量和p.value。 SEX =分类变量; PV,GAN =定量变量; GT_x,N_x,E_x =加性变量。

3 个答案:

答案 0 :(得分:2)

这是在一个简单管道中使用purrr的解决方案。

您只需要创建GT_xN_x的列表即可使用。您可以使用一些正则表达式来做到这一点。

library(purrr)

nn <- names(df)
pattern <- "^GT_|^N_"

vars <- nn[grepl(pattern, nn)] # get the variables that start with GT_ and N_
x <- sub(pattern, "", vars)    # get every x

split(vars, x) %>%
 map(paste, collapse = " + ") %>% 
 sprintf("PV ~ SEX + GAN + %s", .) %>% 
 map(lm, data = df) %>% 
 map_dfr(broom::tidy, .id = "model")

这将返回唯一的数据框。每个模型由列model标识。 如果您希望使用列表,只需将map_dfr替换为map并删除.id


在这里,我为您的数据创建了一个可复制的示例:

set.seed(1)
df <- data.frame(ID = 1:1000,
                 SEX = sample(0:1, 1000, replace = TRUE),
                 PV  = rnorm(1000),
                 GAN = rnorm(1000),
                 GAE = rnorm(1000))
newcols <- unlist(lapply(c("GT_rs", "N_rs", "E_rs"), paste0, sample(100, 50)))
df[newcols] <- replicate(50, rnorm(1000))

df

答案 1 :(得分:1)

您可以通过将字符串粘贴在一起来构建公式-我们只需要知道要粘贴在一起的字符串即可。

这应该有效-未经测试,因为您共享的数据未与fruitInstance共享,因此无法复制/粘贴,并且只有一组协变量,因此不能说明问题的复杂性。如果遇到问题,请共享复制/粘贴的数据以进行说明,我将尝试调试。

dput

答案 2 :(得分:1)

自从江户编辑了解决方案以来,我添加了它的变体:

library(purrr)
library(dplyr)
library(broom)

list("GT_rs", "N_rs") %>% 
    map(~dfA %>%  
             select(matches(paste0(.x,"\\d+"))) %>% 
             names %>% 
             sub(pattern = .x, replacement = "")) %>% 
    reduce(intersect) %>% # until here we get the variables GT_rsx, N_rsx
    sprintf("PV ~ SEX + GAN + GT_rs%s + N_rs%s", ., .) %>%
    map(lm, data = dfA) %>%
    map_dfr(tidy, .id = "model") %>% 
    group_by(model) %>% 
    mutate(suffix = sub("N_rs", "", term[grepl("^N_rs\\d+$", term)]))