JiaxiangBU / tutoring2

The collection of Python and R code scripts to tutor others.
https://jiaxiangbu.github.io/tutoring2/
Other
8 stars 7 forks source link

两层循环的解决方法 #16

Closed Captain-Pam closed 4 years ago

Captain-Pam commented 4 years ago

简述问题

家祥哥,好! 1,我最近在做个逻辑回归模型(主要是两个函数)。简单介绍回归的过程:数据共有684行471列。第一,二列是要分别用的两个因变量Y。首先用MPB与除MPB_binary的所有列做线性回归,会得出每个变量的p值,对p值进行排序后(不要截距的p值),作为后面第二个Y(MPB_binary)与这些变量逻辑回归加入的顺序。第二次逻辑回归中,每个变量(除MPB)分别依次累积加入逻辑回归模型中MPB_binary ,自变量加入的顺序是按照上面P值得顺序,累积加入是指:y~a1, y~a1+a2, y~a1+a2+a3,...每个逻辑回归分别进行留一法交叉验证,并计算逻辑回归的AUC。 2,getAUC函数中被注释掉的代码是对预测概率的保存,因为目前这个计算量有点大结果还没出来,我不知道我这样做是不是有错误或者使用不是很好,也烦请家祥哥帮我看看哦!

希望输出的结果

主要是想我这样做两层的循环运行太慢了,不知道是否有更好的方法呢?

(最后是画每个AUC与自变量的散点图并连接成线)

过程中产生的报错 (可选)

计算量还是有点大,结果还没出来,昨晚提交服务器的,现在也没出来。 ...

有关联的问题

直接把链接复制在此。

JiaxiangBU commented 4 years ago
model = lm(MPB ~ ., data = Data)
coef = as.data.frame(summary(model)$coefficients)

这里我建议使用一下 lasso 和 ridge 进行正则化。 @Cobbybaby

JiaxiangBU commented 4 years ago
data_train <- Data[-j,]
      data_test <- Data[j,]
      flt = paste0('MPB_binary~', paste(rank_r1[1:i], collapse = "+"))
      model = glm(formula(flt), data = data_train, family = binomial())
      prob <-
        c(prob,
          predict(model, newdata = data_test, type = "response"))

这里是一步交叉验证的方式,但是我觉得可以不需要那么细致,做到 fold=5就差不多了。 @Cobbybaby 因为样本本身不多,这么多的k-fold 会导致每个 bag 的重叠度很高,泛化能力下降。

JiaxiangBU commented 4 years ago
for (j in 1:nrow(Data))
> nrow(geno_binary)
[1] 684

这行代码导致每个变量需要跑 684 次 folds 所以很慢,这里换成 k-fold = 5 试试就好了。

JiaxiangBU commented 4 years ago

@Cobbybaby 复现代码见 commit https://github.com/JiaxiangBU/tutoring2/commit/d2294130dd02da412993790bf53f332155969899