繁体   English   中英

遍历R中的变量

[英]loop through variables in R

我有一个结果Y和10个预测变量(X1-X10)的数据。

set.seed(1001)
n <- 100
Y < c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
X1 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.4,0.5))
X2 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.5,0.25,0.25))
X3 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.3,0.4,0.4))
X4 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
X5 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.2,0.7))
X6 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.8,0.1,0.1))
X7 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.1,0.1,0.8))
X8 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
X9 <- sample(x=c(0,1,2), size=n, replace=TRUE, prob=c(0.35,0.35,0.3))
X10 <- c(0,2,2,2,2,2,2,2,0,2,0,2,2,0,0,0,0,0,2,0,0,2,2,0,0,2,2,2,0,2,0,2,0,2,1,2,1,1,1,1,1,1,1,1,1,1,1,0,1,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,0,0,0,0)

datasim <- data.frame(Y,X1,X2,X3,X4,X5,X6,X7,X8,X9,X10)

我的目标是使逻辑模型适合每个预测变量,并计算偏差差异(dDeviance)。 然后稍后将dDeviance引导1000次(R = 1000)。我尝试了以下函数,一次可处理一个变量。 您能建议我如何增强代码,以使它在变量1到10之间循环,计算dDeviance并稍后重新引导值。

glmfunction <- function(data,indices)
{
glm.snp1 <- glm(Y~X1, family="binomial", data=data[indices,])
null <- glm.snp1$null.deviance
residual <- glm.snp1$deviance
dDeviance <-(null-residual)
return(dDeviance)
}

result <- boot(datasim,glmfunction, R=1000)

解决这一问题的方法可能很多,但是我将按照以下方法进行处理。 我首先创建一个要在模型中使用的自变量向量:

#vector of independent variables
iv <- grep("X",colnames(datasim), value=T)

然后,将它们循环以适合模型并提取dDeviance。 这样可以确保我的启动功能不会返回一个值,而是返回一个长度为矢量(自变量数量)的向量。

glmfunction <- function(data,indices, iv){
  res <- sapply(iv, function(x){
    fit <- glm(formula=sprintf("Y~%s",x), family="binomial", data=data[indices,])
    #deviance
    dDeviance <- with(fit, null.deviance - deviance)
    return(dDeviance)
  })
  res
}

我选择将iv作为引导功能的正式参数,因此您必须指定它,并且不要遇到意外的作用域问题,以实现灵活性和更轻松的调试。 然后,您可以运行引导程序:

result <- boot(datasim,glmfunction, iv = iv, R=10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM