【问题标题】:R: Using a pasted formula in SapplyR:在 Sapply 中使用粘贴的公式
【发布时间】:2015-10-14 20:29:06
【问题描述】:

我正在尝试识别相关的解释变量并消除。我正在使用 Sapply 将回归应用于我感兴趣的变量,并手动删除 FIV > 10 的变量。但是,当我尝试重现它以快速运行许多 vif 时,我无法获得我的回归脚本使用包含我要保留的名称的粘贴公式对象运行。下面:

    regressiondata <- data.frame(matrix(ncol=9,nrow=100,runif(900,1,100)))
colnames(regressiondata) <- c("indep1","indep2","indep3","indep4","var1","var2","var3","var4","var5")
vifs1_model <- sapply(regressiondata[,indep_variables],function(x) vif(lm(x~var1+var2+var3+var4+var5, 
                                                                      data = regressiondata, 
                                                                      na.action=na.exclude)))
vifs1 <- rowMeans(vifs1_model)
formula_variables <- paste(names(vifs1),collapse="+")
final_model <- t(round(sapply(regressiondata[,indep_variables], 
           function(x) lm(x ~ formula_variables,data=regressiondata,na.action=na.exclude)$coef),2))

当我运行“final_model”时出现此错误:

t(round(sapply(regressiondata[, indep_variables], function(x) lm(x ~ : 在为函数“t”选择方法时评估参数“x”时出错:model.frame.default 中的错误(公式 = x ~ 公式_变量,数据 = 回归数据,: 可变长度不同(为 'formula_variables' 找到)

【问题讨论】:

    标签: r regression sapply


    【解决方案1】:

    我认为你有几个问题:

    1. 您在数据帧上使用 sapply,而您似乎只是想在自变量名称的向量上使用 sapply
    2. 您对 lm 的最后一次嵌套调用似乎混合了表达式和字符串

    这是我的演练。您的代码引用了一些丢失的对象,所以我添加了一些我认为您遗漏的行

    library(car) # for fiv()
    regressiondata <- data.frame(matrix(ncol=9,nrow=100,runif(900,1,100)))
    colnames(regressiondata) <- c("indep1",
                                  "indep2",
                                  "indep3",
                                  "indep4",
                                  "var1",
                                  "var2",
                                  "var3",
                                  "var4",
                                  "var5")
    
    indep_variables <- names(regressiondata)[1:4] # object did not exist
    

    为了清楚起见,我打破了匿名函数:

    f1 <- function(x) {
        vif(lm(x~var1+var2+var3+var4+var5,
            data = regressiondata, 
            na.action=na.exclude))
    }
    

    现在你的回归

    vifs1_model <- sapply(regressiondata[,indep_variables], f1)
    vifs1 <- rowMeans(vifs1_model)
    formula_variables <- paste(names(vifs1),collapse="+")
    

    我将这个函数命名为拉取系数并将整个公式交给 lm 一个字符向量(字符串):

    getCoefs <- function(x) {
        lm(paste(x, "~", formula_variables), data=regressiondata,
        na.action=na.exclude)$coef
    }
    

    现在,只需对名称向量进行 sapply,然后转置和四舍五入:

    final_model <- sapply(indep_variables, getCoefs)
    final_model <- t(round(final_model ,2)) 
    

    【讨论】:

      【解决方案2】:

      这是一种 dplyr 的做事方式。大部分工作由 sub_regression 函数完成,它进行回归,通过 vif 过滤自变量,然后重做回归

      library(dplyr)
      library(tidyr)
      library(magrittr)
      library(car)
      
      sub_regression = function(sub_data_frame)
        lm(independent_value ~ var1+var2+var3+var4+var5, 
           data = sub_data_frame , 
           na.action="na.exclude") %>%
        vif %>%
        Filter(function(x) x <= 10, .) %>%
        names %>%
        paste(collapse = " + ") %>%
        paste("independent_value ~ ", .) %>%
        as.formula %>%
        lm(. , sub_data_frame, na.action="na.exclude") %>%
        coefficients %>%
        round(3) %>%
        as.list %>%
        data.frame(check.names = FALSE)
      
      matrix(ncol=9,nrow=100,runif(900,1,100)) %>%
        data.frame %>%
        setNames(c("indep1","indep2","indep3","indep4","var1","var2","var3","var4","var5")) %>%
        gather(independent_variable, independent_value, 
               indep1, indep2, indep3, indep4) %>%
        group_by(independent_variable) %>%
        do(sub_regression(.))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-10
        相关资源
        最近更新 更多