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

R运行提速优化 #53

Open Captain-Pam opened 4 years ago

Captain-Pam commented 4 years ago

关于因变量,我有200多个因变量,自变量有两种,第一种A,大概335个,第二种B,401个,每一个因变量,都要进行一下操作:

  1. 首先确定335个变量的rank,方法是线性回归算AIC,AIC小的排在前面;同理第二种变量也要这样确定他们的rank;
  2. 计算按照rank 添加自变量,每添加一个都要做一次80%train-20%test 的,并计算预测的值,再计算预测自与真实值相关系数的平方,也就是R2;
  3. 在第一种变量的R2中确定加入多少自变量时最大,最大第一种变量的个数,然后在这基础上用AIC确定第二种变量的rank,在算两种变量组合后R2。

我写好了处理的函数,但是用for循环实现太慢了,主要原因是在for循环里有两个自定义函数,且变量较多,算每次算AIC确定rank非常慢。我觉得两种变量各自AIC确定rank 能并行,R2的计算能并行应该提速。当然AIC确定的顺序提速也行。数据和代码我发你邮箱里


@Cobbybaby 我修改了下描述。

JiaxiangBU commented 4 years ago

@Cobbybaby

library(tidyverse)
library(fs)

我看了下整体代码,你做这样的修改

fun <- function(x,y) print(x,y)
for (i in 1:3) {
    for (j in 1:3) {
        fun(i,j)
    }
}
## [1] 1
## [1] 1
## [1] 1
## [1] 2
## [1] 2
## [1] 2
## [1] 3
## [1] 3
## [1] 3
i <- 1:3
j <- 1:3
map2_chr(i,j,fun)
## [1] 1
## [1] 2
## [1] 3

## [1] "1" "2" "3"
Captain-Pam commented 4 years ago

谢谢家翔哥,我试着用map做了一个,但是跑不起来,估计是没明白map吧,里面可以source 其他函数吗?这是我的代码,在上一个基础上改的,辛苦啦!

------------------ 原始邮件 ------------------ 发件人: "Jiaxiang Li"<notifications@github.com>; 发送时间: 2020年6月9日(星期二) 中午1:57 收件人: "JiaxiangBU/tutoring2"<tutoring2@noreply.github.com>; 抄送: "指挥官"<276951867@qq.com>;"Mention"<mention@noreply.github.com>; 主题: Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

@Cobbybaby library(tidyverse) library(fs)

我看了下整体代码,你做这样的修改 fun <- function(x,y) print(x,y) for (i in 1:3) { for (j in 1:3) { fun(i,j) } }

[1] 1 ## [1] 1 ## [1] 1 ## [1] 2 ## [1] 2 ## [1] 2 ## [1] 3 ## [1] 3 ## [1] 3 i <- 1:3 j <- 1:3 map2_chr(i,j,fun)

[1] 1 ## [1] 2 ## [1] 3 ## [1] "1" "2" "3"

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

JiaxiangBU commented 4 years ago

@Cobbybaby

这一段我没有看懂你的代码,你能够这样处理出来么?

df <- data.frame(arg1 = ..., arg2)
# 取一行
fun <- function(x,y) {...}
# 取第一行两个参数函数 fun 能跑通
fun(df[1,1],df[1,2])
# 离线保存 df 给我?
df %>% write_excel_csv("path ...")
Captain-Pam commented 4 years ago

家翔哥,我试着更新了一下map,在我给你的代码里改为map(files,rank_R2,phe_snp_cpg=phe_snp_cpg) files你那边可能看不到,其实就是以phe_res数据框的列名命名的文件夹,每个列名是一个因变量。我执行起来了,只是遇到了snp_add_cpg_R2<-getR2(phe_snp_cpg,x,snp_add_cpg,sc=TRUE),这步出错,找不到snp_R2这个数据框,这个数据框是在这个函数之外生成的,正常应该向上查找才对吧。 家翔哥选取,snp,cpg的小子集试试,将files选两个phe_res的列名就行。

Captain-Pam commented 4 years ago

简化版,我在代码的注释里写上了一些问题吧,主要是snp_R2不能调用外面的。getR2函数有时候计算有NA报错。辛苦啦

------------------ 原始邮件 ------------------ 发件人: "Jiaxiang Li"<notifications@github.com>; 发送时间: 2020年6月9日(星期二) 晚上6:11 收件人: "JiaxiangBU/tutoring2"<tutoring2@noreply.github.com>; 抄送: "指挥官"<276951867@qq.com>;"Mention"<mention@noreply.github.com>; 主题: Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

@Cobbybaby

这一段我没有看懂你的代码,你能够这样处理出来么? df <- data.frame(arg1 = ..., arg2) # 取一行 fun <- function(x,y) {...} # 取第一行两个参数函数 fun 能跑通 fun(df[1,1],df[1,2]) # 离线保存 df 给我? df %>% write_excel_csv("path ...")
— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

JiaxiangBU commented 4 years ago

家翔哥,我试着更新了一下map,在我给你的代码里改为map(files,rank_R2,phe_snp_cpg=phe_snp_cpg) files你那边可能看不到,其实就是以phe_res数据框的列名命名的文件夹,每个列名是一个因变量。我执行起来了,只是遇到了snp_add_cpg_R2<-getR2(phe_snp_cpg,x,snp_add_cpg,sc=TRUE),这步出错,找不到snp_R2这个数据框,这个数据框是在这个函数之外生成的,正常应该向上查找才对吧。 家翔哥选取,snp,cpg的小子集试试,将files选两个phe_res的列名就行。

嗯,我需要一个 minimal 的例子,一共两列,一列是参数1,一列是参数2,你存为一个 csv,我调用即可,然后我需要你定义好的 fun 函数,函数自定义域,包含你需要的两个参数,这样我可以避免去改写你的代码其他部分。

其中,如你的数据集地址,都是 hard 实际上是不能执行的。 @Cobbybaby

Captain-Pam commented 4 years ago

test2.R 是residuals_df中单独的一个y(因变量)的示例,最终希望每个y都做这个操作。代码中保存数据和画图我注释掉了。辛苦啦,家翔哥。

------------------ 原始邮件 ------------------ 发件人: "Jiaxiang Li"<notifications@github.com>; 发送时间: 2020年6月9日(星期二) 晚上7:57 收件人: "JiaxiangBU/tutoring2"<tutoring2@noreply.github.com>; 抄送: "指挥官"<276951867@qq.com>;"Mention"<mention@noreply.github.com>; 主题: Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

家翔哥,我试着更新了一下map,在我给你的代码里改为map(files,rank_R2,phe_snp_cpg=phe_snp_cpg) files你那边可能看不到,其实就是以phe_res数据框的列名命名的文件夹,每个列名是一个因变量。我执行起来了,只是遇到了snp_add_cpg_R2<-getR2(phe_snp_cpg,x,snp_add_cpg,sc=TRUE),这步出错,找不到snp_R2这个数据框,这个数据框是在这个函数之外生成的,正常应该向上查找才对吧。 家翔哥选取,snp,cpg的小子集试试,将files选两个phe_res的列名就行。

嗯,我需要一个 minimal 的例子,一共两列,一列是参数1,一列是参数2,你存为一个 csv,我调用即可,然后我需要你定义好的 fun 函数,函数自定义域,包含你需要的两个参数,这样我可以避免去改写你的代码其他部分。

其中,如你的数据集地址,都是 hard 实际上是不能执行的。 @Cobbybaby

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.

JiaxiangBU commented 4 years ago

我没有看到你的代码。

------------------ 原始邮件 ------------------ 发件人: "Cobby_baby"<notifications@github.com>; 发送时间: 2020年6月9日(星期二) 晚上9:07 收件人: "JiaxiangBU/tutoring2"<tutoring2@noreply.github.com>; 抄送: "李家翔"<alex.lijiaxiang@foxmail.com>;"Assign"<assign@noreply.github.com>; 主题: Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

test2.R 是residuals_df中单独的一个y(因变量)的示例,最终希望每个y都做这个操作。代码中保存数据和画图我注释掉了。辛苦啦,家翔哥。

------------------&nbsp;原始邮件&nbsp;------------------ 发件人:&nbsp;"Jiaxiang Li"<notifications@github.com&gt;; 发送时间:&nbsp;2020年6月9日(星期二) 晚上7:57 收件人:&nbsp;"JiaxiangBU/tutoring2"<tutoring2@noreply.github.com&gt;; 抄送:&nbsp;"指挥官"<276951867@qq.com&gt;;"Mention"<mention@noreply.github.com&gt;; 主题:&nbsp;Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

家翔哥,我试着更新了一下map,在我给你的代码里改为map(files,rank_R2,phe_snp_cpg=phe_snp_cpg) files你那边可能看不到,其实就是以phe_res数据框的列名命名的文件夹,每个列名是一个因变量。我执行起来了,只是遇到了snp_add_cpg_R2<-getR2(phe_snp_cpg,x,snp_add_cpg,sc=TRUE),这步出错,找不到snp_R2这个数据框,这个数据框是在这个函数之外生成的,正常应该向上查找才对吧。 家翔哥选取,snp,cpg的小子集试试,将files选两个phe_res的列名就行。

嗯,我需要一个 minimal 的例子,一共两列,一列是参数1,一列是参数2,你存为一个 csv,我调用即可,然后我需要你定义好的 fun 函数,函数自定义域,包含你需要的两个参数,这样我可以避免去改写你的代码其他部分。

其中,如你的数据集地址,都是 hard 实际上是不能执行的。 @Cobbybaby

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe. — You are receiving this because you were assigned. Reply to this email directly, view it on GitHub, or unsubscribe.

Captain-Pam commented 4 years ago

test2.R 是residuals_df中单独的一个y(因变量)的示例,最终希望每个y都做这个操作。代码中保存数据和画图我注释掉了。辛苦啦,家翔哥。

------------------ 原始邮件 ------------------ 发件人: "Jiaxiang Li"<notifications@github.com>; 发送时间: 2020年6月9日(星期二) 晚上7:57 收件人: "JiaxiangBU/tutoring2"<tutoring2@noreply.github.com>; 抄送: "指挥官"<276951867@qq.com>;"Mention"<mention@noreply.github.com>; 主题: Re: [JiaxiangBU/tutoring2] R运行提速优化 (#53)

家翔哥,我试着更新了一下map,在我给你的代码里改为map(files,rank_R2,phe_snp_cpg=phe_snp_cpg) files你那边可能看不到,其实就是以phe_res数据框的列名命名的文件夹,每个列名是一个因变量。我执行起来了,只是遇到了snp_add_cpg_R2<-getR2(phe_snp_cpg,x,snp_add_cpg,sc=TRUE),这步出错,找不到snp_R2这个数据框,这个数据框是在这个函数之外生成的,正常应该向上查找才对吧。 家翔哥选取,snp,cpg的小子集试试,将files选两个phe_res的列名就行。

嗯,我需要一个 minimal 的例子,一共两列,一列是参数1,一列是参数2,你存为一个 csv,我调用即可,然后我需要你定义好的 fun 函数,函数自定义域,包含你需要的两个参数,这样我可以避免去改写你的代码其他部分。

其中,如你的数据集地址,都是 hard 实际上是不能执行的。 @Cobbybaby

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or unsubscribe.