【问题标题】:Passing correct variables to an lm function in R将正确的变量传递给 R 中的 lm 函数
【发布时间】:2015-04-12 11:40:04
【问题描述】:

我有一些生化数据要按性别中的药物剂量(3 个水平)进行分析,所以我使用 Eduardo Leoni in this answer to a similar question 的函数建议创建了一个基础 lm 函数,我可以继续调用几乎每一个我需要为两种药物分别分析 20 种生物化学分析物。

显然,x 会因每种药物而异,y 会因每种分析物而异。 z 将始终是相同的数据帧。

这个功能很好用:

 GrpReg <- function(x,y,z) {
   ## coef and se in a data frame
   mr <- data.frame(coef(summary(lm(y ~ x,data=z))))
   ## put row names (predictors/indep variables)
   mr$predictor <- rownames(mr)
   mr
   }

当我用女性测试它时,它给了我正确的输出:

 GrpReg(subset(MyData$DrugE, MyData$Sex=="F"), 
      subset(MyData$Triglycerides, MyData$Sex=="F"),subset(MyData, Sex=="F"))

但是当我希望它为每个性别分别输出时,我无法让该功能工作。首先我尝试了:

 TriEch <- by(MyData, MyData$Sex, GrpReg(MyData$DrugE, MyData$Triglycerides))
  Show Traceback

  Rerun with Debug
  Error in summary(lm(y ~ x, data = z)) : 
   error in evaluating the argument 'object' in selecting a method for function 'summary': 
  Error in model.frame.default(formula = y ~ x, data = z, drop.unused.levels = TRUE) : 
   argument "z" is missing, with no default 

所以我修改了函数内容以包含所有变量,然后得到这个错误:

 TriDrugE <- by(MyData, MyData$Sex, GrpReg(MyData$DrugE, MyData$Triglycerides, MyData))
 Error in FUN(X[[1L]], ...) : could not find function "FUN"

我无法找到将三个变量传递给我可以复制的函数的示例。

这里有一些播放数据可供使用:

 MyData<- as.data.frame(c(rnorm(10, 0.5, 0.1),rnorm(10, 0.6, 0.15),rnorm(10, 0.5, 0.08),rnorm(10, 0.61, 0.15),rnorm(10, 0.45, 0.11),rnorm(10, 0.55, 0.12),
    rnorm(10, 0.45, 0.12), rnorm(10, 0.45, 0.15)))
 colnames(MyData)<- "Triglycerides"
 MyData$Sex <- c(rep("F",10),rep("M",10),rep("F",10),rep("M",10),rep("F",10),rep("M",10),rep("F",10),rep("M",10))
 MyData$DrugE <- rep(c(0, 2, 4, 8), each=20)

【问题讨论】:

    标签: r function lm


    【解决方案1】:

    你想多了(很容易做到)。分离出子集,不要尝试在实际的函数调用中进行。以这种方式阅读它要容易得多。而且,您可以利用内置的R 公式方法,只需稍微修改您的函数。看看这是不是你需要的:

    GrpReg <- function(formula, data) {
       mr <- data.frame(coef(summary(lm(formula, data))))
       mr$predictor <- rownames(mr) # you don't really need this
       return(mr)
       }
    
    males <- subset(MyData, Sex == "M") # Subset before calling function
    male_results <- GrpReg(DrugE ~ Triglycerides, males)
    

    要处理其中几个数据集,这样的方法可能会起作用:

    resp <- paste("Drug", LETTERS[5:1], sep = "")
    pred <- c("Triglycerides", "LDL", "HDL", "Cholesterol", "Potassium")
    forms <- paste(resp, pred, sep = "~")
    
    doAll <- function(forms, data) { # will fail on 2nd iteration (no data)
        for (i in 1:length(forms)) {
            tmp <- GrpReg(as.formula(forms[i]), males)
            print(tmp)
            }
        }
    
    doAll(forms, males)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 2015-01-31
      • 2011-02-26
      • 2013-10-08
      • 1970-01-01
      • 2012-03-03
      相关资源
      最近更新 更多