这是一个非常快速的问题,我想使用MASS运行回归。因变量分别为val1,val2,val3,自变量为a,b,c,d。
只看假数据。
library(data.table)
library(MASS)
test <- data.table(val1 = 1:10, val2 = 11:20, val3 = 21:30, a = rnorm(10), b = rnorm(10), c = rnorm(10), d = rnorm(10))
summary1 <- glm.nb(val1 ~ a + b + c + d, data = test)
summary2 <- glm.nb(val2 ~ a + b + c + d, data = test)
summary3 <- glm.nb(val3 ~ a + b + c + d, data = test)
我认为代码很难看。我试过这个
for (i in c("val1", "val2", "val3")){
paste("sum_", c("val1", "val2", "val3"), sep = "") <- glm.nb(i ~ a + b + c + d, data = simple)
}
但它没有用。有关改进的任何建议吗?
在原始数据中,有大约26个独立变量,如果代码是这样的sum1 <- glm.nb(val3 ~ a + b + c + d + e + f+ g + h + i + j + k + l, data = test)
我知道以下代码可能会有所帮助,但我不知道如何使用它们:...(
diff <- setdiff(colnames(test),c('val1','val2','val3'))
另外,我想知道lapply函数是否可以在data.table中实现这一点?
非常感谢!
答案 0 :(得分:5)
最好将数据放在长格式中:
library(plyr)
library(reshape2)
xx <- melt(test,measure.vars=paste0('val',1:3))
ddply(xx,.(variable),function(x){
coef(glm.nb(value~.,data=subset(x,select=-variable)))
})
variable (Intercept) a b c d
1 val1 1.583602 -0.045909060 -0.018189342 0.026293033 0.29708648
2 val2 2.704601 -0.014641683 -0.003836401 0.006711503 0.10445377
3 val3 3.217729 -0.008925782 -0.001863267 0.003475509 0.06292286
如果您希望所有模型不仅仅是系数:
dlply(xx,.(variable),function(x){
glm.nb(value~.,data=subset(x,select=-variable))
})
答案 1 :(得分:2)
使用循环方法我只需将所有模型存储在类似的列表中
results <- list()
for (i in c("val1", "val2", "val3")){
frml <- paste(i, "~ a + b + c + d")
frml <- as.formula(frml)
results[[i]] <- glm.nb(frml, data = simple)
}
然后通过查看results$val1
等来访问列表中的模型
答案 2 :(得分:1)
以下是lapply
的解决方案:
summary.list<-lapply(test[,grep('val',names(test)),with=FALSE],
function(i) glm.nb(i ~ a + b + c + d, data = test))