将正确的变量传递给 R 中的 lm 函数
Passing correct variables to an lm function in R
我有一些系列的生化数据要按性别中的药物剂量(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
公式方法,只需稍微修改您的函数即可。看看这是不是你需要的:
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)
我有一些系列的生化数据要按性别中的药物剂量(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
公式方法,只需稍微修改您的函数即可。看看这是不是你需要的:
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)