<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>小生这厢有礼了(BioFaceBook Personal Blog) &#187; 生物信息</title>
	<atom:link href="https://www.biofacebook.com/?cat=12&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://www.biofacebook.com</link>
	<description>记录生物信息学点滴足迹（NGS,Genome,Meta,Linux)</description>
	<lastBuildDate>Sun, 23 Aug 2020 03:28:53 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.41</generator>
	<item>
		<title>Metagenomics standard operating procedure v2</title>
		<link>https://www.biofacebook.com/?p=1527</link>
		<comments>https://www.biofacebook.com/?p=1527#comments</comments>
		<pubDate>Sun, 23 Aug 2020 03:28:53 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[三代测序]]></category>
		<category><![CDATA[二代测序]]></category>
		<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1527</guid>
		<description><![CDATA[<p>http://www.360doc.com/content/20/0823/10/71250389_931761136.shtml</p> <p>https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2</p> <p>Note that this workflow is continually being updated. If you want to use the below commands be sure to keep track of them locally.</p> <p>Last updated: 9 Oct 2018 (see revisions above for earlier minor versions and Metagenomics SOPs on the SOP for earlier major versions)</p> <p>Important points to keep in mind:</p> The [...]]]></description>
				<content:encoded><![CDATA[<p><strong><em>http://www.360doc.com/content/20/0823/10/71250389_931761136.shtml</em></strong></p>
<p>https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2</p>
<p><em>Note that this workflow is continually being updated. If you want to use the below commands be sure to keep track of them locally.</em></p>
<p><em>Last updated: 9 Oct 2018 (see <code>revisions</code> above for earlier minor versions and <code>Metagenomics SOPs</code> on the SOP for earlier major versions)</em></p>
<p>Important points to keep in mind:</p>
<ul>
<li>The below options are not necessarily best for your data; it is important to explore different options, especially at the read quality filtering stage.</li>
<li>If you are confused about a particular step be sure to check out the pages under <code>Metagenomic Resources</code> on the right side-bar.</li>
<li>You should check that only the FASTQs of interest are being specified at each step (e.g. with the <code>ls</code> command). If you are re-running commands multiple times or using optional steps the input filenames and/or folders could differ.</li>
<li>The tool <code>parallel</code> comes up several times in this workflow. Be sure to check out our tutorial on this tool <a href="https://github.com/LangilleLab/microbiome_helper/wiki/Quick-Introduction-to-GNU-Parallel">here</a>.</li>
<li>You can always run <code>parallel</code> with the <code>--dry-run</code> option to see what commands are being run to double-check they are doing what you want!</li>
</ul>
<p>This workflow starts with raw paired-end MiSeq or NextSeq data in demultiplexed FASTQ format assumed to be located within a folder called <code>raw_data</code>.</p>
<h2><a id="user-content-1-first-steps" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#1-first-steps"></a>1. First Steps</h2>
<h3><a id="user-content-11-join-lanes-together-all-illumina-except-miseq" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#11-join-lanes-together-all-illumina-except-miseq"></a>1.1 Join lanes together (all Illumina, except MiSeq)</h3>
<p>Concatenate multiple lanes of sequencing together (e.g. for NextSeq data). If you do <strong>NOT</strong> do this step, remember to change <code>cat_lanes</code> to <code>raw_data</code> in the further commands below that have assumed you are working with the most common type of metagenome data.</p>
<pre><code>concat_lanes.pl raw_data/* -o cat_lanes -p 4
</code></pre>
<h3><a id="user-content-12-inspect-read-quality" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#12-inspect-read-quality"></a>1.2 Inspect read quality</h3>
<p>Run <code>fastqc</code> to allow manual inspection of the quality of sequences.</p>
<pre><code>mkdir fastqc_out
fastqc -t 4 cat_lanes/* -o fastqc_out/
</code></pre>
<h3><a id="user-content-13-optional-stitch-fr-reads" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#13-optional-stitch-fr-reads"></a>1.3 (Optional) Stitch F+R reads</h3>
<p>Stitch paired-end reads together (summary of stitching results are written to &#8220;pear_summary_log.txt&#8221;). Note: it is important to check the % of reads assembled. It may be better to concatenate the forward and reverse reads together if the assembly % is too low (see step 2.2).</p>
<pre><code>run_pear.pl -p 4 -o stitched_reads cat_lanes/*
</code></pre>
<p><strong><em>If you don&#8217;t stitch your reads together at this step you will need to unzip your FASTQ files before continuing with the below commands.</em></strong></p>
<h2><a id="user-content-2-read-quality-control-and-contaminant-screens" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#2-read-quality-control-and-contaminant-screens"></a>2. Read Quality-Control and Contaminant Screens</h2>
<h3><a id="user-content-21-running-kneaddata" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#21-running-kneaddata"></a>2.1 Running KneadData</h3>
<p>Use <code>kneaddata</code> to run pre-processing tools. First Trimmomatic is run to remove low quality sequences. Then Bowtie2 is run to screen out contaminant sequences. Below we are screening out reads that map to the human or PhiX genomes. Note KneadData is being run below on all unstitched FASTQ pairs with <code>parallel</code>, you can see our quick tutorial on this tool <a href="https://github.com/LangilleLab/microbiome_helper/wiki/Quick-Introduction-to-GNU-Parallel">here</a>. For a detailed breakdown of the options in the below command see <a href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-Sequencing-Pre-processing">this page</a>. The forward and reverse reads will be specified by &#8220;_1&#8243; and &#8220;_2&#8243; in the output files, ignore the &#8220;R1&#8243; in each filename. Note that the <code>\</code> characters at the end of each line are just to split the command over multiple lines to make it easier to read.</p>
<pre><code>parallel -j 1 --link 'kneaddata -i {1} -i {2} -o kneaddata_out/ \
-db /home/shared/bowtiedb/GRCh38_PhiX --trimmomatic /usr/local/prg/Trimmomatic-0.36/ \
-t 4 --trimmomatic-options "SLIDINGWINDOW:4:20 MINLEN:50" \
--bowtie2-options "--very-sensitive --dovetail" --remove-intermediate-output' \
 ::: cat_lanes/*_R1.fastq ::: cat_lanes/*_R2.fastq
</code></pre>
<p>Clean up the output directory (helps downstream commands) by moving the discarded sequences to a subfolder:</p>
<pre><code>mkdir kneaddata_out/contam_seq

mv kneaddata_out/*_contam*.fastq kneaddata_out/contam_seq
</code></pre>
<p>You can produce a logfile summarizing the kneadData output with this command:</p>
<pre><code>kneaddata_read_count_table --input kneaddata_out --output kneaddata_read_counts.txt
</code></pre>
<h3><a id="user-content-22-concatenate-unstitched-output-omit-if-data-stitched-above" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#22-concatenate-unstitched-output-omit-if-data-stitched-above"></a>2.2 Concatenate unstitched output (Omit if data stitched above)</h3>
<p>If you did not stitch your paired-end reads together with <code>pear</code>, then you can concatenate the forward and reverse FASTQs together now. Note this is done after quality filtering so that both reads in a pair are either discarded or retained. It&#8217;s important to only specify the &#8220;paired&#8221; FASTQs outputted by <code>kneaddata</code> in the below command.</p>
<pre><code>concat_paired_end.pl -p 4 --no_R_match -o cat_reads kneaddata_out/*_paired_*.fastq 
</code></pre>
<p>You should check over the commands that are printed to screen to make sure the correct FASTQs are being concatenated together.</p>
<h2><a id="user-content-3-determine-functions-with-humann2" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#3-determine-functions-with-humann2"></a>3. Determine Functions with HUMAnN2</h2>
<h3><a id="user-content-31-run-humann2" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#31-run-humann2"></a>3.1 Run HUMAnN2</h3>
<p>Run <code>humann2</code> with <code>parallel</code> to calculate abundance of UniRef90 gene families and MetaCyc pathways. If you are processing environment data (e.g. soil samples) the vast majority of the reads may not map using this approach. Instead, you can try mapping against the UniRef50 database (which you can point to with the <code>--protein-database</code> option).</p>
<pre><code>mkdir humann2_out

parallel -j 4 'humann2 --threads 1 --input {} --output humann2_out/{/.}' ::: cat_reads/*fastq
</code></pre>
<h3><a id="user-content-32-merge-individual-sample-data-together" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#32-merge-individual-sample-data-together"></a>3.2 Merge individual sample data together</h3>
<p>Join HUMAnN2 output per sample into one table.</p>
<pre><code>mkdir humann2_final_out

humann2_join_tables -s --input humann2_out/ --file_name pathabundance --output humann2_final_out/humann2_pathabundance.tsv
humann2_join_tables -s --input humann2_out/ --file_name pathcoverage --output humann2_final_out/humann2_pathcoverage.tsv
humann2_join_tables -s --input humann2_out/ --file_name genefamilies --output humann2_final_out/humann2_genefamilies.tsv
</code></pre>
<h3><a id="user-content-33-table-output-normalization" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#33-table-output-normalization"></a>3.3 Table output normalization</h3>
<p>Re-normalize gene family and pathway <strong>abundances</strong> (so that all samples are in units of copies per million).</p>
<pre><code>humann2_renorm_table --input humann2_final_out/humann2_pathabundance.tsv --units cpm --output humann2_final_out/humann2_pathabundance_cpm.tsv
humann2_renorm_table --input humann2_final_out/humann2_genefamilies.tsv --units cpm --output humann2_final_out/humann2_genefamilies_cpm.tsv
</code></pre>
<h3><a id="user-content-34-separate-out-taxonomic-contributions" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#34-separate-out-taxonomic-contributions"></a>3.4 Separate out taxonomic contributions</h3>
<p>Split HUMAnN2 output abundance tables in stratified and unstratified tables (stratified tables include the taxa associated with a functional profile).</p>
<pre><code>humann2_split_stratified_table --input humann2_final_out/humann2_pathabundance_cpm.tsv --output humann2_final_out
humann2_split_stratified_table --input humann2_final_out/humann2_genefamilies_cpm.tsv --output humann2_final_out
humann2_split_stratified_table --input humann2_final_out/humann2_pathcoverage.tsv --output humann2_final_out
</code></pre>
<h3><a id="user-content-35-format-stamp-function-file" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#35-format-stamp-function-file"></a>3.5 Format STAMP function file</h3>
<p>Convert unstratified HUMAnN2 abundance tables to STAMP format by changing header-line. These commands remove the comment character and the spaces in the name of the first column. Trailing descriptions of the abundance datatype are also removed from each sample&#8217;s column name.</p>
<pre><code>sed 's/_Abundance-RPKs//g' humann2_final_out/humann2_genefamilies_cpm_unstratified.tsv | sed 's/# Gene Family/GeneFamily/' &gt; humann2_final_out/humann2_genefamilies_cpm_unstratified.spf
sed 's/_Abundance//g' humann2_final_out/humann2_pathabundance_cpm_unstratified.tsv | sed 's/# Pathway/Pathway/' &gt; humann2_final_out/humann2_pathabundance_cpm_unstratified.spf
sed 's/_Coverage//g' humann2_final_out/humann2_pathcoverage_unstratified.tsv | sed 's/# Pathway/Pathway/' &gt; humann2_final_out/humann2_pathcoverage_unstratified.spf
</code></pre>
<h3><a id="user-content-36-extract-metaphlan2-taxonomic-compositions" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#36-extract-metaphlan2-taxonomic-compositions"></a>3.6 Extract MetaPhlAn2 taxonomic compositions</h3>
<p>Since HUMAnN2 also runs MetaPhlAn2 as an initial step, we can use the output tables already created to get the taxonomic composition of our samples. First we need to gather all the output MetaPhlAn2 results per sample into a single directory and then merge them into a single table using MetaPhlAn2&#8217;s <code>merge_metaphlan_tables.py</code> command. After this file is created we can fix the header so that each column corresponds to a sample name without the trailing &#8220;_metaphlan_bugs_list&#8221; description. Note that MetaPhlAn2 works best for well-characterized environments, like the human gut, and has low sensitivity in other environments.</p>
<pre><code>mkdir metaphlan2_out
cp humann2_out/*/*/*metaphlan_bugs_list.tsv metaphlan2_out/
/usr/local/metaphlan2/utils/merge_metaphlan_tables.py metaphlan2_out/*metaphlan_bugs_list.tsv &gt; metaphlan2_merged.txt
sed -i 's/_metaphlan_bugs_list//g' metaphlan2_merged.txt
</code></pre>
<h3><a id="user-content-37-format-stamp-taxonomy-file" class="anchor" href="https://github.com/LangilleLab/microbiome_helper/wiki/Metagenomics-standard-operating-procedure-v2#37-format-stamp-taxonomy-file"></a>3.7 Format STAMP taxonomy file</h3>
<p>Lastly we can convert this MetaPhlAn2 abundance table to STAMP format</p>
<pre><code>metaphlan_to_stamp.pl metaphlan2_merged.txt &gt; metaphlan2_merged.spf</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1527</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>肠型分析学习</title>
		<link>https://www.biofacebook.com/?p=1521</link>
		<comments>https://www.biofacebook.com/?p=1521#comments</comments>
		<pubDate>Wed, 01 Jul 2020 05:24:02 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[Linux相关]]></category>
		<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1521</guid>
		<description><![CDATA[<p>肠型，Enterotype，是2011年在这篇文章中提出的，即将过去的2018年又有20多们肠道微生物的大佬对肠型的概念进行了回顾和确认。一直比较好奇怎样来用代码分析肠型，今天找到了这个教程，放在这：</p> <p>这是那篇原始的文章：Arumugam, M., Raes, J., et al. (2011) Enterotypes of the human gut microbiome, Nature,doi://10.1038/nature09944 在谷歌上一搜，作者竟然做了个分析肠型的教程在这，学习一下：http://enterotyping.embl.de/enterotypes.html 这是2018年大佬们的共识文章：这是国人翻译的这篇文章，http://blog.sciencenet.cn/blog-3334560-1096828.html 当然，如果你只需要获得自己的结果或者自己课题的结果，不需要跑代码的，有最新的网页版分型，更好用，网址也放在这，同样也是上面翻译的那篇文章里提到的网址：http://enterotypes.org/ 只需要把菌属的含量比例文件上就能很快得到结果。</p> <p>下面我就边学习边做来尝试着来个分析，并把代码放在这里备忘。其实作者已经整理好了代码，我学习一下，争取实现对手上的数据进行分析。</p> 首先下载测试数据， wget http://enterotyping.embl.de/MetaHIT_SangerSamples.genus.txt wget http://enterotyping.embl.de/enterotypes_tutorial.sanger.R 跑跑示例数据，排排错 <p>我表示对R语言还只是一知半解的状态，所以，先跑下，然后能用上自己的数据， 当个工具用就暂知足啦。我是黑苹果10.11的系统，运行这个软件提示少了Xquartz，于是装了个，windows和linux应该不需要。原代码中还提示『没有&#8221;s.class&#8221;这个函数』，百度了一下发现有个老兄的新浪博客说了是这个包，于是加了句library(ade4)就ok了。 Xquartz的下载地址Mac 10.6+：https://dl.bintray.com/xquartz/downloads/XQuartz-2.7.11.dmg</p> <p>&#160;</p> #Uncomment next two lines if R packages are already installed #install.packages("cluster") #install.packages("clusterSim") library(cluster) library(clusterSim) #BiocManager::install("genefilter") library(ade4)#Download the example data and set the working directory [...]]]></description>
				<content:encoded><![CDATA[<p>肠型，Enterotype，是2011年在这篇文章中提出的，即将过去的2018年又有20多们肠道微生物的大佬对肠型的概念进行了回顾和确认。一直比较好奇怎样来用代码分析肠型，今天找到了这个教程，放在这：</p>
<blockquote><p><em>这是那篇原始的文章：Arumugam, M., Raes, J., et al. (2011) Enterotypes of the human gut microbiome, Nature,doi://10.1038/nature09944 在谷歌上一搜，作者竟然做了个分析肠型的教程在这，学习一下：http://enterotyping.embl.de/enterotypes.html 这是2018年大佬们的共识文章：这是国人翻译的这篇文章，http://blog.sciencenet.cn/blog-3334560-1096828.html 当然，如果你只需要获得自己的结果或者自己课题的结果，不需要跑代码的，有最新的网页版分型，更好用，网址也放在这，同样也是上面翻译的那篇文章里提到的网址：http://enterotypes.org/ 只需要把菌属的含量比例文件上就能很快得到结果。</em></p></blockquote>
<p>下面我就边学习边做来尝试着来个分析，并把代码放在这里备忘。其实作者已经整理好了代码，我学习一下，争取实现对手上的数据进行分析。</p>
<h2 id="%E9%A6%96%E5%85%88%E4%B8%8B%E8%BD%BD%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%EF%BC%8C"><strong>首先下载测试数据，</strong></h2>
<pre class="prism-token token  language-javascript">wget http<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>enterotyping<span class="token punctuation">.</span>embl<span class="token punctuation">.</span>de<span class="token operator">/</span>MetaHIT_SangerSamples<span class="token punctuation">.</span>genus<span class="token punctuation">.</span>txt
wget http<span class="token punctuation">:</span><span class="token operator">/</span><span class="token operator">/</span>enterotyping<span class="token punctuation">.</span>embl<span class="token punctuation">.</span>de<span class="token operator">/</span>enterotypes_tutorial<span class="token punctuation">.</span>sanger<span class="token punctuation">.</span>R</pre>
<h2 id="%E8%B7%91%E8%B7%91%E7%A4%BA%E4%BE%8B%E6%95%B0%E6%8D%AE%EF%BC%8C%E6%8E%92%E6%8E%92%E9%94%99"><strong>跑跑示例数据，排排错</strong></h2>
<p>我表示对R语言还只是一知半解的状态，所以，先跑下，然后能用上自己的数据， 当个工具用就暂知足啦。我是黑苹果10.11的系统，运行这个软件提示少了Xquartz，于是装了个，windows和linux应该不需要。原代码中还提示『没有&#8221;s.class&#8221;这个函数』，百度了一下发现有个老兄的新浪博客说了是这个包，于是加了句<code>library(ade4)</code>就ok了。 Xquartz的下载地址Mac 10.6+：https://dl.bintray.com/xquartz/downloads/XQuartz-2.7.11.dmg</p>
<p>&nbsp;</p>
<pre class="prism-token token  language-javascript">#Uncomment next two lines <span class="token keyword">if</span> R packages are already installed
#install<span class="token punctuation">.</span><span class="token function">packages</span><span class="token punctuation">(</span><span class="token string">"cluster"</span><span class="token punctuation">)</span>
#install<span class="token punctuation">.</span><span class="token function">packages</span><span class="token punctuation">(</span><span class="token string">"clusterSim"</span><span class="token punctuation">)</span>
<span class="token function">library</span><span class="token punctuation">(</span>cluster<span class="token punctuation">)</span>
<span class="token function">library</span><span class="token punctuation">(</span>clusterSim<span class="token punctuation">)</span>
#BiocManager<span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token function">install</span><span class="token punctuation">(</span><span class="token string">"genefilter"</span><span class="token punctuation">)</span>
<span class="token function">library</span><span class="token punctuation">(</span>ade4<span class="token punctuation">)</span>#Download the example data and <span class="token keyword">set</span> the working directory
#<span class="token function">setwd</span><span class="token punctuation">(</span><span class="token string">'&lt;path_to_working_directory&gt;'</span><span class="token punctuation">)</span>
data<span class="token operator">=</span>read<span class="token punctuation">.</span><span class="token function">table</span><span class="token punctuation">(</span><span class="token string">"../MetaHIT_SangerSamples.genus.txt"</span><span class="token punctuation">,</span> header<span class="token operator">=</span>T<span class="token punctuation">,</span> row<span class="token punctuation">.</span>names<span class="token operator">=</span><span class="token number">1</span><span class="token punctuation">,</span> dec<span class="token operator">=</span><span class="token string">"."</span><span class="token punctuation">,</span> sep<span class="token operator">=</span><span class="token string">"\t"</span><span class="token punctuation">)</span>
data<span class="token operator">=</span>data<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">,</span><span class="token punctuation">]</span>dist<span class="token punctuation">.</span>JSD <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">,</span> pseudocount<span class="token operator">=</span><span class="token number">0.000001</span><span class="token punctuation">,</span> <span class="token operator">...</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
 KLD <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span> <span class="token function">sum</span><span class="token punctuation">(</span>x <span class="token operator">*</span><span class="token function">log</span><span class="token punctuation">(</span>x<span class="token operator">/</span>y<span class="token punctuation">)</span><span class="token punctuation">)</span>
 JSD<span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>y<span class="token punctuation">)</span> <span class="token function">sqrt</span><span class="token punctuation">(</span><span class="token number">0.5</span> <span class="token operator">*</span> <span class="token function">KLD</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span> <span class="token punctuation">(</span>x<span class="token operator">+</span>y<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">0.5</span> <span class="token operator">*</span> <span class="token function">KLD</span><span class="token punctuation">(</span>y<span class="token punctuation">,</span> <span class="token punctuation">(</span>x<span class="token operator">+</span>y<span class="token punctuation">)</span><span class="token operator">/</span><span class="token number">2</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
 matrixColSize <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token function">length</span><span class="token punctuation">(</span><span class="token function">colnames</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">)</span><span class="token punctuation">)</span>
 matrixRowSize <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token function">length</span><span class="token punctuation">(</span><span class="token function">rownames</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">)</span><span class="token punctuation">)</span>
 colnames <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token function">colnames</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">)</span>
 resultsMatrix <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token function">matrix</span><span class="token punctuation">(</span><span class="token number">0</span><span class="token punctuation">,</span> matrixColSize<span class="token punctuation">,</span> matrixColSize<span class="token punctuation">)</span> inMatrix <span class="token operator">=</span> <span class="token function">apply</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">,</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span> <span class="token function">ifelse</span> <span class="token punctuation">(</span>x<span class="token operator">==</span><span class="token number">0</span><span class="token punctuation">,</span>pseudocount<span class="token punctuation">,</span>x<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">for</span><span class="token punctuation">(</span>i <span class="token keyword">in</span> <span class="token number">1</span><span class="token punctuation">:</span>matrixColSize<span class="token punctuation">)</span> <span class="token punctuation">{</span>
   <span class="token keyword">for</span><span class="token punctuation">(</span>j <span class="token keyword">in</span> <span class="token number">1</span><span class="token punctuation">:</span>matrixColSize<span class="token punctuation">)</span> <span class="token punctuation">{</span>
     resultsMatrix<span class="token punctuation">[</span>i<span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token operator">=</span><span class="token function">JSD</span><span class="token punctuation">(</span><span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">vector</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">[</span><span class="token punctuation">,</span>i<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">,</span>
                            <span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">vector</span><span class="token punctuation">(</span>inMatrix<span class="token punctuation">[</span><span class="token punctuation">,</span>j<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
   <span class="token punctuation">}</span>
 <span class="token punctuation">}</span>
 colnames <span class="token operator">-</span><span class="token operator">&gt;</span> <span class="token function">colnames</span><span class="token punctuation">(</span>resultsMatrix<span class="token punctuation">)</span> <span class="token operator">-</span><span class="token operator">&gt;</span> <span class="token function">rownames</span><span class="token punctuation">(</span>resultsMatrix<span class="token punctuation">)</span>
 <span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">dist</span><span class="token punctuation">(</span>resultsMatrix<span class="token punctuation">)</span><span class="token operator">-</span><span class="token operator">&gt;</span>resultsMatrix
 <span class="token function">attr</span><span class="token punctuation">(</span>resultsMatrix<span class="token punctuation">,</span> <span class="token string">"method"</span><span class="token punctuation">)</span> <span class="token operator">&lt;</span><span class="token operator">-</span> <span class="token string">"dist"</span>
 <span class="token keyword">return</span><span class="token punctuation">(</span>resultsMatrix<span class="token punctuation">)</span>
<span class="token punctuation">}</span>data<span class="token punctuation">.</span>dist<span class="token operator">=</span>dist<span class="token punctuation">.</span><span class="token function">JSD</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span>pam<span class="token punctuation">.</span><span class="token function-variable function">clustering</span><span class="token operator">=</span><span class="token keyword">function</span><span class="token punctuation">(</span>x<span class="token punctuation">,</span>k<span class="token punctuation">)</span> <span class="token punctuation">{</span> # x is a distance matrix and k the number <span class="token keyword">of</span> clusters
 <span class="token function">require</span><span class="token punctuation">(</span>cluster<span class="token punctuation">)</span>
 cluster <span class="token operator">=</span> <span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">vector</span><span class="token punctuation">(</span><span class="token function">pam</span><span class="token punctuation">(</span><span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">dist</span><span class="token punctuation">(</span>x<span class="token punctuation">)</span><span class="token punctuation">,</span> k<span class="token punctuation">,</span> diss<span class="token operator">=</span>TRUE<span class="token punctuation">)</span>$clustering<span class="token punctuation">)</span>
 <span class="token keyword">return</span><span class="token punctuation">(</span>cluster<span class="token punctuation">)</span>
<span class="token punctuation">}</span>data<span class="token punctuation">.</span>cluster<span class="token operator">=</span>pam<span class="token punctuation">.</span><span class="token function">clustering</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>dist<span class="token punctuation">,</span> k<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">)</span><span class="token function">require</span><span class="token punctuation">(</span>clusterSim<span class="token punctuation">)</span>
nclusters <span class="token operator">=</span> index<span class="token punctuation">.</span><span class="token function">G1</span><span class="token punctuation">(</span><span class="token function">t</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">,</span> data<span class="token punctuation">.</span>cluster<span class="token punctuation">,</span> d <span class="token operator">=</span> data<span class="token punctuation">.</span>dist<span class="token punctuation">,</span> centrotypes <span class="token operator">=</span> <span class="token string">"medoids"</span><span class="token punctuation">)</span>nclusters<span class="token operator">=</span><span class="token function">NULLfor</span> <span class="token punctuation">(</span>k <span class="token keyword">in</span> <span class="token number">1</span><span class="token punctuation">:</span><span class="token number">20</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
 <span class="token keyword">if</span> <span class="token punctuation">(</span>k<span class="token operator">==</span><span class="token number">1</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
   nclusters<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator">=</span>NA
 <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
   data<span class="token punctuation">.</span>cluster_temp<span class="token operator">=</span>pam<span class="token punctuation">.</span><span class="token function">clustering</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>dist<span class="token punctuation">,</span> k<span class="token punctuation">)</span>
   nclusters<span class="token punctuation">[</span>k<span class="token punctuation">]</span><span class="token operator">=</span>index<span class="token punctuation">.</span><span class="token function">G1</span><span class="token punctuation">(</span><span class="token function">t</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">,</span>data<span class="token punctuation">.</span>cluster_temp<span class="token punctuation">,</span>  d <span class="token operator">=</span> data<span class="token punctuation">.</span>dist<span class="token punctuation">,</span>
                         centrotypes <span class="token operator">=</span> <span class="token string">"medoids"</span><span class="token punctuation">)</span>
 <span class="token punctuation">}</span>
<span class="token punctuation">}</span><span class="token function">plot</span><span class="token punctuation">(</span>nclusters<span class="token punctuation">,</span> type<span class="token operator">=</span><span class="token string">"h"</span><span class="token punctuation">,</span> xlab<span class="token operator">=</span><span class="token string">"k clusters"</span><span class="token punctuation">,</span> ylab<span class="token operator">=</span><span class="token string">"CH index"</span><span class="token punctuation">,</span>main<span class="token operator">=</span><span class="token string">"Optimal number of clusters"</span><span class="token punctuation">)</span>obs<span class="token punctuation">.</span>silhouette<span class="token operator">=</span><span class="token function">mean</span><span class="token punctuation">(</span><span class="token function">silhouette</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>cluster<span class="token punctuation">,</span> data<span class="token punctuation">.</span>dist<span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token punctuation">,</span><span class="token number">3</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token function">cat</span><span class="token punctuation">(</span>obs<span class="token punctuation">.</span>silhouette<span class="token punctuation">)</span> #<span class="token number">0.1899451</span>#data<span class="token operator">=</span>noise<span class="token punctuation">.</span><span class="token function">removal</span><span class="token punctuation">(</span>data<span class="token punctuation">,</span> percent<span class="token operator">=</span><span class="token number">0.01</span><span class="token punctuation">)</span>## plot <span class="token number">1</span>
obs<span class="token punctuation">.</span>pca<span class="token operator">=</span>dudi<span class="token punctuation">.</span><span class="token function">pca</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span><span class="token function">frame</span><span class="token punctuation">(</span><span class="token function">t</span><span class="token punctuation">(</span>data<span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">,</span> scannf<span class="token operator">=</span>F<span class="token punctuation">,</span> nf<span class="token operator">=</span><span class="token number">10</span><span class="token punctuation">)</span>
obs<span class="token punctuation">.</span>bet<span class="token operator">=</span><span class="token function">bca</span><span class="token punctuation">(</span>obs<span class="token punctuation">.</span>pca<span class="token punctuation">,</span> fac<span class="token operator">=</span><span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">factor</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>cluster<span class="token punctuation">)</span><span class="token punctuation">,</span> scannf<span class="token operator">=</span>F<span class="token punctuation">,</span> nf<span class="token operator">=</span>k<span class="token number">-1</span><span class="token punctuation">)</span>
dev<span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
s<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">(</span>obs<span class="token punctuation">.</span>bet$ls<span class="token punctuation">,</span> fac<span class="token operator">=</span><span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">factor</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>cluster<span class="token punctuation">)</span><span class="token punctuation">,</span> grid<span class="token operator">=</span>F<span class="token punctuation">,</span>sub<span class="token operator">=</span><span class="token string">"Between-class analysis"</span><span class="token punctuation">,</span> col<span class="token operator">=</span><span class="token function">c</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span>#plot <span class="token number">2</span>
obs<span class="token punctuation">.</span>pcoa<span class="token operator">=</span>dudi<span class="token punctuation">.</span><span class="token function">pco</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>dist<span class="token punctuation">,</span> scannf<span class="token operator">=</span>F<span class="token punctuation">,</span> nf<span class="token operator">=</span><span class="token number">3</span><span class="token punctuation">)</span>
dev<span class="token punctuation">.</span><span class="token keyword">new</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
s<span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">(</span>obs<span class="token punctuation">.</span>pcoa$li<span class="token punctuation">,</span> fac<span class="token operator">=</span><span class="token keyword">as</span><span class="token punctuation">.</span><span class="token function">factor</span><span class="token punctuation">(</span>data<span class="token punctuation">.</span>cluster<span class="token punctuation">)</span><span class="token punctuation">,</span> grid<span class="token operator">=</span>F<span class="token punctuation">,</span>sub<span class="token operator">=</span><span class="token string">"Principal coordiante analysis"</span><span class="token punctuation">,</span> col<span class="token operator">=</span><span class="token function">c</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">,</span><span class="token number">2</span><span class="token punctuation">,</span><span class="token number">4</span><span class="token punctuation">)</span><span class="token punctuation">)</span></pre>
<h2 id="%E4%B8%8A%E5%9B%BE%EF%BC%8C%E7%A8%8D%E5%BE%AE%E8%B0%83%E6%95%B4%E4%B8%8B"><strong>上图，稍微调整下</strong></h2>
<p><code>, col=c(3,2,4)</code>这个代码是给三个聚类上不同的颜色，还没搞清楚怎么给画的圈上色来实现理好看的效果，相信对于熟悉R语言的同学是小菜一碟。<code>, cell=0, cstar=0</code>是不显示圈和边线，只显示散点。 不加这两个参数，只用上面的代码，图如下：</p>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-1075469/j1jqq1y6uv.png?imageView2/2/w/1620" alt="" /></div>
</figure>
<p>加上两个参数的图片，就和教程里的最后面的两张图一样：</p>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-1075469/g6fnw7cmwb.png?imageView2/2/w/1620" alt="" /></div>
</figure>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1521</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pandas and Sklearn</title>
		<link>https://www.biofacebook.com/?p=1512</link>
		<comments>https://www.biofacebook.com/?p=1512#comments</comments>
		<pubDate>Fri, 05 Jun 2020 03:02:14 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[生物信息]]></category>
		<category><![CDATA[统计学习]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1512</guid>
		<description><![CDATA[pandas isnull函数检查数据是否有缺失 pandas isnull sum with column headers <p>&#160;</p> for col in main_df: print(sum(pd.isnull(data[col]))) <p>I get a list of the null count for each column:</p> 0 1 100 <p>What I&#8217;m trying to do is create a new dataframe which has the column header alongside the null count, e.g.</p> col1 &#124; 0 col2 &#124; 1 col3 [...]]]></description>
				<content:encoded><![CDATA[<h1 class="title-article">pandas isnull函数检查数据是否有缺失</h1>
<h1 class="grid--cell fs-headline1 fl1 ow-break-word mb8"><a class="question-hyperlink" href="https://stackoverflow.com/questions/41681693/pandas-isnull-sum-with-column-headers">pandas isnull sum with column headers</a></h1>
<p>&nbsp;</p>
<pre><code>for col in main_df:
    print(sum(pd.isnull(data[col])))
</code></pre>
<p>I get a list of the null count for each column:</p>
<pre><code>0
1
100
</code></pre>
<p>What I&#8217;m trying to do is create a new dataframe which has the column header alongside the null count, e.g.</p>
<pre><code>col1 | 0
col2 | 1
col3 | 100</code></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>#print every column using:</p>
<p>&nbsp;</p>
<pre><code>nulls = df.isnull().sum().to_frame()
for index, row in nulls.iterrows():
    print(index, row[0])
</code></pre>
<p>&nbsp;</p>
<pre><code>for col in df:
    print(df[col].unique())



</code></pre>
<h1 class="article-title J-articleTitle">pandas.get_dummies 的用法 (One-Hot Encoding)</h1>
<p>&nbsp;</p>
<p>get_dummies 是利用pandas实现one hot encode的方式。详细参数请查看<a href="https://pandas.pydata.org/pandas-docs/stable/generated/pandas.get_dummies.html" target="_blank" rel="nofollow noopener noreferrer" data-from="10680">官方文档</a></p>
<blockquote><p>pandas.get_dummies(data, prefix=None, prefix_sep=’_’, dummy_na=False, columns=None, sparse=False, drop_first=False)[source]</p></blockquote>
<p>参数说明：</p>
<ul class="ul-level-0">
<li>data : array-like, Series, or DataFrame 输入的数据</li>
<li>prefix : string, list of strings, or dict of strings, default None get_dummies转换后，列名的前缀</li>
<li>columns : list-like, default None 指定需要实现类别转换的列名</li>
<li>dummy_na : bool, default False 增加一列表示空缺值，如果False就忽略空缺值</li>
<li>drop_first : bool, default False 获得k中的k-1个类别值，去除第一个</li>
</ul>
<p><strong>离散特征的编码分为两种情况：</strong></p>
<p>1、离散特征的取值之间没有大小的意义，比如color：[red,blue],那么就使用one-hot编码</p>
<p>2、离散特征的取值有大小的意义，比如size:[X,XL,XXL],那么就使用数值的映射{X:1,XL:2,XXL:3}</p>
<p>例子：</p>
<pre class="prism-token token  language-javascript"><span class="token keyword">import</span> pandas <span class="token keyword">as</span> pd

df <span class="token operator">=</span> pd<span class="token punctuation">.</span><span class="token function">DataFrame</span><span class="token punctuation">(</span><span class="token punctuation">[</span>  
            <span class="token punctuation">[</span><span class="token string">'green'</span> <span class="token punctuation">,</span> <span class="token string">'A'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>   
            <span class="token punctuation">[</span><span class="token string">'red'</span>   <span class="token punctuation">,</span> <span class="token string">'B'</span><span class="token punctuation">]</span><span class="token punctuation">,</span>   
            <span class="token punctuation">[</span><span class="token string">'blue'</span>  <span class="token punctuation">,</span> <span class="token string">'A'</span><span class="token punctuation">]</span><span class="token punctuation">]</span><span class="token punctuation">)</span>  

df<span class="token punctuation">.</span>columns <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token string">'color'</span><span class="token punctuation">,</span>  <span class="token string">'class'</span><span class="token punctuation">]</span> 
pd<span class="token punctuation">.</span><span class="token function">get_dummies</span><span class="token punctuation">(</span>df<span class="token punctuation">)</span></pre>
<p>get_dummies 前：</p>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-4908043/zzw0nx7acu.png?imageView2/2/w/1620" alt="" /></div>
</figure>
<p>get_dummies 后：</p>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-4908043/91815t6ls4.png?imageView2/2/w/1620" alt="" /></div>
</figure>
<p>上述执行完以后再打印df 出来的还是get_dummies 前的图，因为你没有写</p>
<pre class="prism-token token  language-javascript">df <span class="token operator">=</span> pd<span class="token punctuation">.</span><span class="token function">get_dummies</span><span class="token punctuation">(</span>df<span class="token punctuation">)</span></pre>
<p>可以对指定列进行get_dummies</p>
<pre class="prism-token token  language-javascript">pd<span class="token punctuation">.</span><span class="token function">get_dummies</span><span class="token punctuation">(</span>df<span class="token punctuation">.</span>color<span class="token punctuation">)</span></pre>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-4908043/qoplyil41o.png?imageView2/2/w/1620" alt="" /></div>
</figure>
<p>将指定列进行get_dummies 后合并到元数据中</p>
<pre class="prism-token token  language-javascript">df <span class="token operator">=</span> df<span class="token punctuation">.</span><span class="token function">join</span><span class="token punctuation">(</span>pd<span class="token punctuation">.</span><span class="token function">get_dummies</span><span class="token punctuation">(</span>df<span class="token punctuation">.</span>color<span class="token punctuation">)</span><span class="token punctuation">)</span></pre>
<figure>
<div class="image-block"><img class="" src="https://ask.qcloudimg.com/http-save/yehe-4908043/m0sb5qrqaz.png?imageView2/2/w/1620" alt="" /></div>
</figure>
<p>参考：<a href="https://blog.csdn.net/maymay_/article/details/80198468" target="_blank" rel="nofollow noopener noreferrer" data-from="10680">https://blog.csdn.net/maymay_/article/details/80198468</a></p>
<pre> 
&gt;&gt;&gt; train_filter.info()
&lt;class 'pandas.core.frame.DataFrame'&gt;
RangeIndex: 1482 entries, 0 to 1481
Columns: 182 entries, SampleID to BS120
dtypes: float64(177), int64(2), object(3)
memory usage: 2.1+ MB
&gt;&gt;&gt; train_filter.dtypes
SampleID object
Streptococcus Infection float64
Duration_of_gestation object
Gestation_age float64
Gestation_age_G1 float64
Gestation_age_G2 float64
GDM_HDP float64
Age int64
Age_group int64
Blood_type float64
Medication_use float64
Progesterone_use float64
Pregnancy_mode float64
Native_place float64
Combined_disease float64
Infection float64
Scar_uterus float64
Risk_rating float64
Anamnesis float64
Thalassemia float64
Ovary_disease float64
Hepatopathy float64
Allergic_history float64
Thyroid_disease float64
Hysteromyoma float64
Breast_disease float64
Weight_at_delivery object
Weight_before_pregnancy float64
Height float64
BMI_before_pregnancy float64
 ... 
B_A/G float64
B_r_GT_G float64
B_r_GT float64
B_TBA_G float64
B_TBA float64
B_ALT_G float64
B_ALT float64
B_AST_G float64
B_AST float64
B_TBIL_G float64
B_TBIL float64
B_DBIL_G float64
B_DBIL float64
B_IBIL_G float64
B_IBIL float64
B_Crea_G float64
B_Crea float64
B_CysC_G float64
B_CysC float64
B_UA_G float64
B_UA float64
B_Urea_G float64
B_Urea float64
B_GLU_G float64
B_GLU float64
HbA1c_G float64
HbA1c float64
BS float64
BS60 float64
BS120 float64
Length: 182, dtype: object



</pre>
<p>scikit-learn 是基于 Python 语言的机器学习工具</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>http://www.scikitlearn.com.cn/</p>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1512</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>DBS  model training</title>
		<link>https://www.biofacebook.com/?p=1499</link>
		<comments>https://www.biofacebook.com/?p=1499#comments</comments>
		<pubDate>Thu, 14 May 2020 08:39:21 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1499</guid>
		<description><![CDATA[<p>phenotype gproNOG.annotations bitscores</p> <p>This is the complete workflow used to generate a random forest model using output data from an hmmsearch of your protein coding genes against eggNOG gamma proteobacterial protein HMMs. Before running this notebook, run the parse_hmmsearch.pl script to get a tab-delimited file containing bitscores for all isolates.</p> <p>&#8220;`{r, read in data} # [...]]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/05/phenotype.tsv">phenotype</a> <a href="http://www.biofacebook.com/wp-content/uploads/2020/05/gproNOG.annotations.tsv">gproNOG.annotations</a> <a href="http://www.biofacebook.com/wp-content/uploads/2020/05/bitscores.tsv">bitscores</a></p>
<p>This is the complete workflow used to generate a random forest model using output data from an hmmsearch of your protein coding genes against eggNOG gamma proteobacterial protein HMMs. Before running this notebook, run the parse_hmmsearch.pl script to get a tab-delimited file containing bitscores for all isolates.</p>
<p>&#8220;`{r, read in data}<br />
# library(gplots)<br />
library(caret)<br />
library(randomForest)<br />
set.seed(1)<br />
# set the directory you are working from<br />
directory &lt;- &#8220;/home/shenzy/UNISED/CII_ECOR_update_final_164genes&#8221;<br />
# Reading in the eggNOG model scores, checking to make sure that top eggNOG model hit for each protein in the orthogroup is the same<br />
traindata &lt;- read.delim(paste(directory, &#8220;/bitscores.tsv&#8221;, sep=&#8221;&#8221;))<br />
traindata &lt;- t(traindata)<br />
phenotype &lt;- read.delim(paste(directory, &#8220;/phenotype.tsv&#8221;, sep=&#8221;&#8221;), header=F)<br />
phenotype[,1] &lt;- make.names(phenotype[,1])<br />
traindata &lt;- cbind.data.frame(traindata, phenotype=phenotype[match(row.names(traindata), phenotype[,1]),2])<br />
traindata[is.na(traindata)] &lt;- 0<br />
# traindata &lt;- na.roughfix(traindata)<br />
traindata &lt;- traindata[,-nearZeroVar(traindata)]<br />
names(traindata) &lt;- make.names(names(traindata))<br />
&#8220;`</p>
<p>The following section is an optional step for picking the best values of mtry (number of gnees sampled per node) and ntree (number of trees in your random forest) for building your model. Instead of running all of the code at once, proceed through each step or model building and examine the figures produced. These will give you an indication of the point at which the performance of your model starts to level off.</p>
<p>In general, greater values of ntree and mtry will give you better stability in the top genes that are identified by the model. You can alternatively skip this step and proceed immediately to the next one, where values of 10,000 trees and p/10 genes per node (where p is total number of genes in the training data) have been chosen as a good starting point.</p>
<p>&#8220;`{r, train model}<br />
# this section is for picking out the best parameters for building your model<br />
set.seed(1)<br />
# varying ntree<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=i)<br />
error &lt;- c(error, model$err.rate[length(model$err.rate)])<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(traindata)-1))<br />
}<br />
# varying mtry<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(traindata)-1<br />
for(i in c(1, round(param/10), round(param/5), round(param/3), round(param/2), param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=10000, mtry=i)<br />
error2 &lt;- c(error2, model$err.rate[length(model$err.rate)])<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(traindata)-1))<br />
}<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
png(paste(directory, &#8220;/model_training/m1_error_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=error, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m1_sparsity_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=sparsity, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m1_error_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=error2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m1_sparsity_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=sparsity2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
train2 &lt;- traindata[,match(names(model$importance[model$importance[,1]&gt;0,]), colnames(traindata))]<br />
train2 &lt;- cbind(train2, phenotype=traindata$phenotype)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train2, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(train2)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(train2)-1<br />
for(i in c(1, round(param/10), round(param/5), round(param/3), round(param/2), param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train2, ntree=10000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(train2)-1))<br />
}<br />
model &lt;- randomForest(phenotype ~ ., data=train2, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
png(paste(directory, &#8220;/model_training/m2_error_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=error, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m2_sparsity_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=sparsity, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m2_error_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=error2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m2_sparsity_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=sparsity2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
train3 &lt;- train2[,match(names(model$importance[model$importance[,1]&gt;quantile(model$importance[,1], 0.5),]), colnames(train2))]<br />
train3 &lt;- cbind(train3, phenotype=train2$phenotype)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
param &lt;- ncol(train3)-1<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train3, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(train3)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
for(i in c(1, round(param/10), round(param/5), round(param/3), round(param/2), param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train3, ntree=10000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(train3)-1))<br />
}<br />
model &lt;- randomForest(phenotype ~ ., data=train3, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
png(paste(directory, &#8220;/model_training/m3_error_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=error, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m3_sparsity_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=sparsity, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m3_error_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=error2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m3_sparsity_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=sparsity2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
train4 &lt;- train3[,match(names(model$importance[model$importance[,1]&gt;quantile(model$importance[,1], 0.5),]), colnames(train3))]<br />
train4 &lt;- cbind(train4, phenotype=train3$phenotype)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train4, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(train4)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(train4)-1<br />
for(i in c(1, round(param/10), round(param/5), round(param/3), round(param/2), param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train4, ntree=10000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(train4)-1))<br />
}<br />
model &lt;- randomForest(phenotype ~ ., data=train4, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
png(paste(directory, &#8220;/model_training/m4_error_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=error, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m4_sparsity_vs_ntree.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000), y=sparsity, xlab=&#8221;Number of trees&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m4_error_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=error2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;OOB error rate&#8221;, pch=16)<br />
dev.off()<br />
png(paste(directory, &#8220;/model_training/m4_sparsity_vs_mtry.png&#8221;, sep=&#8221;&#8221;), width=350, height = 350)<br />
plot(x=c(1, round(param/10), round(param/5), round(param/3), round(param/2), param), y=sparsity2, xlab=&#8221;Number of genes sampled per tree&#8221;, ylab=&#8221;% genes uninformative&#8221;, pch=16)<br />
dev.off()<br />
model$predicted<br />
names(model$importance[order(model$importance, decreasing=T),][1:10])<br />
save(model, train2, train3, train4, file=paste(directory, &#8220;/traindatanew.Rdata&#8221;, sep=&#8221;&#8221;))<br />
&#8220;`</p>
<p>This section allows you to build a model through iterative feature selection, using parameters that we feel are sensible. You can substitute in your own parameters chosen from the process above if you prefer.</p>
<p>&#8220;`{r, quicker model building}<br />
set.seed(1)<br />
param &lt;- ncol(traindata)-1<br />
model1 &lt;- randomForest(phenotype ~ ., data=traindata, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
model1<br />
png(paste(directory, &#8220;/VI_fullnew.png&#8221;, sep=&#8221;&#8221;), width=400, height=350)<br />
plot(1:param, model1$importance[order(model1$importance, decreasing=T)], xlim=c(1,1000), ylab=&#8221;Variable importance&#8221;, xlab=&#8221;Top genes&#8221;)<br />
dev.off()<br />
pdf(paste(directory, &#8220;VI_fullnew.pdf&#8221;, sep=&#8221;&#8221;), width=5, height=5)<br />
plot(1:param, model1$importance[order(model1$importance, decreasing=T)], xlim=c(1,1000), ylab=&#8221;Variable importance&#8221;, xlab=&#8221;Top genes&#8221;)<br />
dev.off()<br />
train2 &lt;- traindata[,match(names(model1$importance[model1$importance[,1]&gt;0,]), colnames(traindata))]<br />
train2 &lt;- cbind(train2, phenotype=traindata$phenotype)<br />
param &lt;- ncol(train2)-1<br />
model2 &lt;- randomForest(phenotype ~ ., data=train2, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
model2<br />
train3 &lt;- train2[,match(names(model2$importance[model2$importance[,1]&gt;quantile(model2$importance[,1], 0.5),]), colnames(train2))]<br />
train3 &lt;- cbind(train3, phenotype=train2$phenotype)<br />
param &lt;- ncol(train3)-1<br />
model3 &lt;- randomForest(phenotype ~ ., data=train3, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
model3<br />
train4 &lt;- train3[,match(names(model3$importance[model3$importance[,1]&gt;quantile(model3$importance[,1], 0.5),]), colnames(train3))]<br />
train4 &lt;- cbind(train4, phenotype=train3$phenotype)<br />
param &lt;- ncol(train4)-1<br />
model4 &lt;- randomForest(phenotype ~ ., data=train4, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
model4<br />
train5 &lt;- train4[,match(names(model4$importance[model4$importance[,1]&gt;quantile(model4$importance[,1], 0.5),]), colnames(train4))]<br />
train5 &lt;- cbind(train5, phenotype=train4$phenotype)<br />
param &lt;- ncol(train5)-1<br />
model5 &lt;- randomForest(phenotype ~ ., data=train5, ntree=10000, mtry=param/10, na.action=na.roughfix, proximity=T)<br />
model5<br />
train6 &lt;- train5[,match(names(model5$importance[model5$importance[,1]&gt;quantile(model5$importance[,1], 0.5),]), colnames(train5))]<br />
train6 &lt;- cbind(train6, phenotype=train5$phenotype)<br />
param &lt;- ncol(train6)-1<br />
model6 &lt;- randomForest(phenotype ~ ., data=train6, ntree=10000, mtry=param/10, na.action=na.roughfix, proximity=T)<br />
model6<br />
train7 &lt;- train6[,match(names(model6$importance[model6$importance[,1]&gt;quantile(model6$importance[,1], 0.5),]), colnames(train6))]<br />
train7 &lt;- cbind(train7, phenotype=train6$phenotype)<br />
param &lt;- ncol(train7)-1<br />
model7 &lt;- randomForest(phenotype ~ ., data=train7, ntree=10000, mtry=param/10, na.action=na.roughfix, proximity=T)<br />
model7<br />
model7$predicted<br />
names(model7$importance[order(model7$importance[,1], decreasing=T),])[1:10]<br />
png(paste(directory, &#8220;final_model_VInew.png&#8221;, sep=&#8221;&#8221;), width=400, height=350)</p>
<p>plot(1:param, model7$importance[order(model7$importance, decreasing=T),], xlab=&#8221;&#8221;, ylab=&#8221;Variable importance&#8221;)<br />
dev.off()<br />
save(model1, model2, model3, model4, model5,model6, model7, traindata, train2, train3, train4, train5, train6, train7, file=paste(directory, &#8220;finalmodelnew.Rdata&#8221;, sep=&#8221;&#8221;))<br />
&#8220;`</p>
<p>The following section will show you how the performance of your model has improved as you iterated through cycles of feature selection. It will give you an idea of whether you have performed enough cycles, or whether you need to carry on.</p>
<p>You can look at both the out-of-bag votes, which are just votes cast by trees on data they were not trained on. This gives you a good idea of how the model would score strains that are distantly related to your training data. The second plot shows you votes cast by all of the trees on all of the serovars, and gives you a better idea of how your model would scores similar strains.</p>
<p>&#8220;`{r, looking at votes}<br />
votedata &lt;- rbind.data.frame(cbind.data.frame(model=rep(&#8220;1&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model1$votes[,2]), cbind.data.frame(model=rep(&#8220;2&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model2$votes[,2]), cbind.data.frame(model=rep(&#8220;3&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model3$votes[,2]), cbind.data.frame(model=rep(&#8220;4&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model4$votes[,2]), cbind.data.frame(model=rep(&#8220;5&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model5$votes[,2]), cbind.data.frame(model=rep(&#8220;6&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model6$votes[,2]), cbind.data.frame(model=rep(&#8220;7&#8243;, 9), Serovar=row.names(model1$votes), Invasive=model7$votes[,2]))<br />
votedata$Phenotype &lt;- phenotype[match(votedata$Serovar, phenotype[,1]),2]<br />
ggplot(votedata, aes(x=model, y=Invasive, col=Phenotype)) + geom_jitter(width=0.1) + theme_classic(8) + ylab(&#8220;Proportion of votes for seletected strains phenotype&#8221;) + xlab(&#8220;Model iteration&#8221;) + geom_hline(yintercept=0.5, lty=2, col=&#8221;grey&#8221;) + theme(legend.key.size = unit(0.3, &#8220;cm&#8221;))<br />
ggsave(&#8220;votesnew.png&#8221;, width=7, height=2.5)<br />
ggsave(&#8220;votesnew.pdf&#8221;, width=7, height=2.5)<br />
votedata$Phenotype &lt;- phenotype[match(votedata$Serovar, phenotype[,1]),2]<br />
ggplot(votedata, aes(x=model, y=Invasive, col=Serovar)) + geom_jitter(width=0.1) + theme_classic(8) + ylab(&#8220;Proportion of votes for seletected strains phenotype&#8221;) + xlab(&#8220;Model iteration&#8221;) + geom_hline(yintercept=0.5, lty=2, col=&#8221;grey&#8221;) + theme(legend.key.size = unit(0.3, &#8220;cm&#8221;))<br />
ggsave(&#8220;votes.png&#8221;, width=7, height=2.5)<br />
ggsave(&#8220;votes.pdf&#8221;, width=7, height=2.5)<br />
fullvotes &lt;- rbind.data.frame(cbind.data.frame(model=rep(&#8220;1&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model1, traindata, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;2&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model2, train2, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;3&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model3, train3, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;4&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model4, train4, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;5&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model5, train5, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;6&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model6, train6, type=&#8221;vote&#8221;)[,2]), cbind.data.frame(model=rep(&#8220;7&#8243;, 9), Serovar=row.names(model1$votes), Invasive=predict(model7, train7, type=&#8221;vote&#8221;)[,2]))<br />
fullvotes$Phenotype &lt;- phenotype[match(fullvotes$Serovar, phenotype[,1]),2]<br />
ggplot(fullvotes, aes(x=model, y=Invasive, col=Phenotype)) + geom_jitter(width=0.1) + theme_classic(8) + ylab(&#8220;Proportion of votes for invasive phenotype&#8221;) + xlab(&#8220;Model iteration&#8221;) + geom_hline(yintercept=0.5, lty=2, col=&#8221;grey&#8221;) + theme(legend.key.size = unit(0.3, &#8220;cm&#8221;))<br />
ggsave(&#8220;full_votesnew.png&#8221;, width=7, height=2.5)<br />
ggsave(&#8220;full_votesnew.pdf&#8221;, width=7, height=2.5)<br />
&#8220;`</p>
<p>This section shows you how frequently particular genes are identified as top predictors across different iterations of model building, and how much importance they are assigned. Because model building involved a lot of stochasticity, you may find that your top predictors are quite subject to change across iterations.</p>
<p>&#8220;`{r, assessing stability of predictors}<br />
set.seed(1)<br />
usefulgenes &lt;- data.frame()<br />
topgenes &lt;- data.frame()<br />
for(i in 1:10) {<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
usefulgenes &lt;- rbind(usefulgenes, cbind(model=i, gene=names(model$importance[model$importance&gt;0,]), model$importance[model$importance&gt;0]))<br />
topgenes &lt;- rbind(topgenes, cbind(model=i, gene=names(model$importance[order(model$importance, decreasing=T),][1:20]), model$importance[order(model$importance, decreasing=T),][1:20]))<br />
}<br />
png(paste(directory, &#8220;/gene_usefulnessnew.png&#8221;, sep=&#8221;&#8221;))<br />
hist(table(usefulgenes$gene), col=&#8221;grey&#8221;, main=&#8221;&#8221;, xlab=&#8221;Number of times each gene was useful (VI &gt;) in a model&#8221;)<br />
dev.off()<br />
sum(table(usefulgenes$gene)==10)<br />
sum(table(usefulgenes$gene)&lt;10)<br />
topgenes$V3 &lt;- as.numeric(as.character(topgenes$V3))<br />
ggplot(topgenes, aes(x=model, y=gene, fill=as.numeric(V3))) + geom_tile() + ggtitle(&#8220;Imporance values for top genes across model iterations&#8221;) + scale_fill_continuous(&#8220;Importance&#8221;)<br />
table(topgenes$gene)<br />
png(paste(directory, &#8220;/topgenesnew.png&#8221;, sep=&#8221;&#8221;))<br />
hist(table(topgenes$gene), col=&#8221;grey&#8221;, main=&#8221;&#8221;, xlab=&#8221;Number of times each gene appeared in the\ntop 20 predictors&#8221;)<br />
dev.off()<br />
save(usefulgenes, topgenes, file=paste(directory, &#8220;/allgenemodels.Rdata&#8221;, sep=&#8221;&#8221;))<br />
&#8220;`</p>
<p>This section allows you to look at the COG categories of your top predictor genes, compared to the COG categories in your original training set, to see if any are over-represented.</p>
<p>&#8220;`{r, COG analysis}<br />
annotations &lt;- read.delim(paste(directory, &#8220;/gproNOG.annotations.tsv&#8221;, sep=&#8221;&#8221;), header=F) # matcing annotation file for your chosen model set can be downloaded from http://eggnogdb.embl.de/#/app/downloads<br />
nogs &lt;- read.delim(paste(directory, &#8220;/models_used_20ref.tsv&#8221;, sep=&#8221;&#8221;), header=F)<br />
nogs[,2] &lt;- sub(&#8220;.*NOG\\.&#8221;, &#8220;&#8221;, nogs[,2])<br />
nogs[,2] &lt;- sub(&#8220;.meta_raw&#8221;, &#8220;&#8221;, nogs[,2])<br />
info &lt;- annotations[match(nogs[,2], annotations[,2]),]<br />
info$V5 &lt;- as.character(info$V5)<br />
# proportion of each COG catergory that comes up in the top indicators<br />
background &lt;- nogs[match(colnames(traindata), make.names(nogs[,1])),2]<br />
background_COGs &lt;- annotations[match(background, annotations[,2]),5]<br />
library(plyr)<br />
bg_COGs2 &lt;- aaply(as.character(background_COGs), 1, function(i){<br />
if(!is.na(i)) {<br />
if(nchar(i)&gt;1) {<br />
char &lt;- substr(i,1,1)<br />
for(n in 2:nchar(i)) {<br />
char &lt;- paste(char,substr(i,n,n),sep=&#8221;.&#8221;)<br />
}<br />
return(char)<br />
} else {<br />
return(i)<br />
}<br />
} else{<br />
return(NA)<br />
}<br />
})</p>
<p>background_COGs2 &lt;- unlist(strsplit(bg_COGs2, &#8220;[.]&#8221;))<br />
predictors &lt;- nogs[match(colnames(train6), make.names(nogs[,1])),2]<br />
predictor_COGs &lt;- annotations[match(predictors, annotations[,2]),5]<br />
p_COGs2 &lt;- aaply(as.character(predictor_COGs), 1, function(i){<br />
if(!is.na(i)) {<br />
if(nchar(i)&gt;1) {<br />
char &lt;- substr(i,1,1)<br />
for(n in 2:nchar(i)) {<br />
char &lt;- paste(char,substr(i,n,n),sep=&#8221;.&#8221;)<br />
}<br />
return(char)<br />
} else {<br />
return(i)<br />
}<br />
} else{<br />
return(NA)<br />
}<br />
})<br />
predictor_COGs2 &lt;- unlist(strsplit(p_COGs2, &#8220;[.]&#8221;))<br />
barplot(rbind(table(background_COGs2), table(predictor_COGs2)[match(names(table(background_COGs2)), names(table(predictor_COGs2)))]))<br />
&#8220;`</p>
<p>This section allows you to compare the performance of your model predicting true phenotype and a random phenotype.</p>
<p>&#8220;`{r, control}<br />
set.seed(2)<br />
control &lt;- traindata<br />
control$phenotype &lt;- sample(traindata$phenotype)<br />
param &lt;- ncol(control)-1<br />
cmodel1 &lt;- randomForest(phenotype ~ ., data=control, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
cmodel1<br />
png(paste(directory, &#8220;/VI_full_control.png&#8221;, sep=&#8221;&#8221;), width=400, height=350)<br />
plot(1:param, cmodel1$importance[order(cmodel1$importance, decreasing=T)], xlim=c(1,1000), ylab=&#8221;Variable importance&#8221;, xlab=&#8221;Top genes&#8221;)<br />
dev.off()<br />
pdf(paste(directory, &#8220;VI_full_control.pdf&#8221;, sep=&#8221;&#8221;), width=5, height=5)<br />
plot(1:param, cmodel1$importance[order(cmodel1$importance, decreasing=T)], xlim=c(1,1000), ylab=&#8221;Variable importance&#8221;, xlab=&#8221;Top genes&#8221;)<br />
dev.off()<br />
ctrain2 &lt;- control[,match(names(cmodel1$importance[cmodel1$importance[,1]&gt;0,]), colnames(control))]<br />
ctrain2 &lt;- cbind(ctrain2, phenotype=control$phenotype)<br />
param &lt;- ncol(ctrain2)-1<br />
cmodel2 &lt;- randomForest(phenotype ~ ., data=ctrain2, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
cmodel2<br />
ctrain3 &lt;- ctrain2[,match(names(cmodel2$importance[cmodel2$importance[,1]&gt;quantile(cmodel2$importance[,1], 0.5),]), colnames(ctrain2))]<br />
ctrain3 &lt;- cbind(ctrain3, phenotype=ctrain2$phenotype)<br />
param &lt;- ncol(ctrain3)-1<br />
cmodel3 &lt;- randomForest(phenotype ~ ., data=ctrain3, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
cmodel3<br />
ctrain4 &lt;- ctrain3[,match(names(cmodel3$importance[cmodel3$importance[,1]&gt;quantile(cmodel3$importance[,1], 0.5),]), colnames(ctrain3))]<br />
ctrain4 &lt;- cbind(ctrain4, phenotype=ctrain3$phenotype)<br />
param &lt;- ncol(ctrain4)-1<br />
cmodel4 &lt;- randomForest(phenotype ~ ., data=ctrain4, ntree=10000, mtry=param/10, na.action=na.roughfix)<br />
cmodel4<br />
ctrain5 &lt;- ctrain4[,match(names(cmodel4$importance[cmodel4$importance[,1]&gt;quantile(cmodel4$importance[,1], 0.5),]), colnames(ctrain4))]<br />
ctrain5 &lt;- cbind(ctrain5, phenotype=ctrain4$phenotype)<br />
param &lt;- ncol(ctrain5)-1<br />
cmodel5 &lt;- randomForest(phenotype ~ ., data=ctrain5, ntree=10000, mtry=param/10, na.action=na.roughfix, proximity=T)<br />
cmodel5<br />
ctrain6 &lt;- ctrain5[,match(names(cmodel5$importance[cmodel5$importance[,1]&gt;quantile(cmodel5$importance[,1], 0.5),]), colnames(ctrain5))]<br />
ctrain6 &lt;- cbind(ctrain6, phenotype=ctrain5$phenotype)<br />
param &lt;- ncol(ctrain6)-1<br />
cmodel6 &lt;- randomForest(phenotype ~ ., data=ctrain6, ntree=10000, mtry=param/10, na.action=na.roughfix, proximity=T)<br />
cmodel6</p>
<p>cmodel6$predicted<br />
names(cmodel6$importance[order(cmodel6$importance[,1], decreasing=T),])[1:10]<br />
# compare votes and phenotypes for the control and real datasets<br />
cbind(cmodel6$votes, control$phenotype, model6$votes, train6$phenotype)</p>
<p>&#8220;`</p>
<p>This approach repeats the full model-building process 5 times to see how similar the top predictor genes are.</p>
<p>&#8220;`{r, testing the robustness of the top result}<br />
topgenes &lt;- vector()<br />
# picking out the top predictors from the model<br />
for(i in 1:5) {<br />
set.seed(i)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(traindata)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(control)-1<br />
for(i in c(1, param/10, param/5, param/3, param/2, param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=traindata, ntree=1000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(traindata)-1))<br />
}<br />
train2 &lt;- traindata[,match(names(model$importance[model$importance[,1]&gt;0,]), colnames(traindata))]<br />
train2 &lt;- cbind(train2, phenotype=traindata$phenotype)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train2, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(train2)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(control)-1<br />
for(i in c(1, param/10, param/5, param/3, param/2, param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train2, ntree=20000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(train2)-1))<br />
}<br />
train3 &lt;- train2[,match(names(model$importance[model$importance[,1]&gt;quantile(model$importance[,1], 0.5),]), colnames(train2))]<br />
train3 &lt;- cbind(train3, phenotype=train2$phenotype)<br />
error &lt;- vector()<br />
sparsity &lt;- vector()<br />
for(i in c(1, 10, 50, 250, 500, 1000, 1500, 2000, 5000, 10000)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train3, ntree=i, na.action=na.roughfix)<br />
error &lt;- c(error, median(model$err.rate))<br />
sparsity &lt;- c(sparsity, (sum(model$importance[,1]&lt;=0))/(ncol(train3)-1))<br />
}<br />
error2 &lt;- vector()<br />
sparsity2 &lt;- vector()<br />
param &lt;- ncol(control)-1<br />
for(i in c(1, param/10, param/5, param/3, param/2, param)) {<br />
model &lt;- randomForest(phenotype ~ ., data=train3, ntree=2000, mtry=i, na.action=na.roughfix)<br />
error2 &lt;- c(error2, median(model$err.rate))<br />
sparsity2 &lt;- c(sparsity2, (sum(model$importance[,1]&lt;=0))/(ncol(train3)-1))<br />
}<br />
train4 &lt;- train3[,match(names(model$importance[model$importance[,1]&gt;quantile(model$importance[,1], 0.5),]), colnames(train3))]<br />
train4 &lt;- cbind(train4, phenotype=train3$phenotype)<br />
topgenes &lt;- c(topgenes, colnames(train4))<br />
}<br />
table(topgenes)</p>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1499</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>微生物多样研究—差异分析</title>
		<link>https://www.biofacebook.com/?p=1483</link>
		<comments>https://www.biofacebook.com/?p=1483#comments</comments>
		<pubDate>Fri, 27 Mar 2020 07:29:11 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[生物信息]]></category>
		<category><![CDATA[统计学习]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1483</guid>
		<description><![CDATA[ <p>1. 随机森林模型</p> <p>随机森林是一种基于决策树（Decisiontree）的高效的机器学习算法，可以用于对样本进行分类（Classification），也可以用于回归分析（Regression）。</p> <p>它属于非线性分类器，因此可以挖掘变量之间复杂的非线性的相互依赖关系。通过随机森林分析，可以找出能够区分两组样本间差异关键OTU。</p> <p>Feature Importance Scores表格-来源于随机森林结果</p> <p>记录了各OTU对组间差异的贡献值大小。</p> </p> <p>注：一般地，选取Mean_decrease_in_accuracy值大于0.05的OTU，作进一步分析；对于组间差异较小的样本，该值可能会降至0.03。</p> <p>2. 交叉验证分析</p> <p>交叉验证（Crossvalidation)，是一种统计学上将数据样本切割成较小子集的实用方法。先在一个子集上做分析，而其它子集则用来做后续对此分析的确认及验证。一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。</p> <p>其中最常见的为k-foldercross-validation，它指的是将所有数据分成k个子集，每个子集均做一次测试集，其余的作为训练集。交叉验证重复k次，每次选择一个子集作为测试集，并将k次的平均交叉验证识别正确率作为结果。</p> <p>所有的样本都被作为了训练集和测试集，每个样本都被验证一次。</p> <p>对随机森林方法筛选出的关键OTU的组合进行遍历，以期用最少的OTU数目组合构建一个错误率最低高效分类器。</p> <p>一般地，对随机森林分析筛选出的关键OTU，按照不同组合进行10倍交叉验证分析，找出能够最准确区分组间差异的最少的OTU组合，再做进一步的分析，如ROC分析等。</p> <p>注：图中横坐标表示不同数量的OTU组合，纵坐标表示该数量OTU组合下分类的错误率。OTU组合数越少，且错误率越低，则该OTU组合被认为是能够区分组间差异的最少的OTU组合。</p> <p>3. ROC曲线</p> <p>接收者操作特征曲线（Receiveroperating characteristic curve，ROC 曲线）也是一种有效的有监督学习方法。ROC分析属于二元分类算法，用来处理只有两种分类的问题，可以用于选择最佳的判别模型,选择最佳的诊断界限值。</p> <p>可依据专业知识，对疾病组和参照组测定结果进行分析，确定测定值的上下限、组距以及截断点(cut-offpoint)，按选择的组距间隔列出累积频数分布表，分别计算出所有截断点的敏感性(Sensetivity)、特异性和假阳性率(1-特异性:Specificity)。以敏感性为纵坐标代表真阳性率，(1-特异性)为横坐标代表假阳性率，作图绘成ROC曲线。ROC曲线越靠近左上角，诊断的准确性就越高。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较，哪一种试验的AUC最大，则哪一种试验的诊断价值最佳。</p> <p></p> <p>注：图中横坐标为假阳性率false positive rate（FPR）：Specificity，纵坐标为真阳性率true positive rate（TPR）：Sensetivity。最靠近左上角的ROC曲线的点是错误最少的最好阈值，其假阳性和假阴性的总数最少。ROC曲线下的面积值在1.0和0.5之间。在AUC&#62;0.5的情况下，AUC越接近于1，说明诊断效果越好。AUC在 0.5~0.7时有较低准确性，AUC在0.7~0.9时有一定准确性，AUC在0.9以上时有较高准确性。AUC=0.5时，说明诊断方法完全不起作用，无诊断价值。AUC&#60;0.5不符合真实情况，在实际中极少出现。</p> <p>4. Wilcoxon秩和检验分析</p> <p>Wilcoxonrank-sum test，也叫曼-惠特尼U检验（Mann–WhitneyU test），是两组独立样本非参数检验的一种方法。其原假设为两组独立样本来自的两总体分布无显著差异，通过对两组样本平均秩的研究来实现判断两总体的分布是否存在差异，该分析可以对两组样品的物种进行显著性差异分析，并对p值计算假发现率（FDR）q值。</p> <p></p> <p>注：mean分别为两组样品物种的平均相对丰度，sd分别是两组样本物种相对丰度的标准差。P值为对两组检验原假设为真的概率值，p&#60;0.05表示存在差异，p&#60;0.01表示差异显著，q值为假发现率。</p> <p>5. 差异菌群Heatmap分析</p> <p>以10倍交叉验证（10-foldcross-validation）估计泛化误差（Generalizationerror）的大小，其余参数使用默认设置。建模结果同时包含“基线”误差（Baselineerror）的期望值，即数据集中属于最优势分类的样本全部被错误分类的概率。每个OTU根据其被移除后模型预报错误率增加的大小确定其重要度数值，重要度越高，该OTU对模型预报准确率的贡献越大。</p> <p>根据挑选出来的差异OTU，根据其在每个样品中的丰度信息，对物种进行聚类，绘制成热图，便于观察哪些物种在哪些样品中聚集较多或含量较低。</p> <p></p> <p>注：图中越接近蓝色表示物种丰度越低，越接近橙红色表示丰度越高。左边的聚类树是根据各物种间的spearman相关性距离进行聚类；上边的聚类树是采用样本间距离算法中最常用的Bray-Curtis算法进行聚类。</p> <p>6. 两组样本Welch’s t-test分析</p> <p>两组不同方差的样本可使用Welch’st-test进行差异比较分析，通过此分析可获得在两组中有显著性差异的物种[或差异基因丰度—适用于元（宏）基因组]。</p> <p> <p>注：上图所示为不同基因丰度（或物种）在两组样品中的丰度比例，中间所示为95%置信度区间内，物种丰度的差异比例，最右边的值为p值，p值＜0.05，表示差异显著。</p> <p>7. Shannon多样性指数比较盒状图</p> <p>将不同分类或环境的多组样本的Shannon多样性指数进行四分位计算，比较不同样本组的组间Shannon指数差异。同时进行非参数Mann-Whitney判断样本组间的显著性差异</p> [...]]]></description>
				<content:encoded><![CDATA[<div>
<div>
<p><b>1. 随机森林模型</b></p>
<p>随机森林是一种基于决策树（Decisiontree）的高效的机器学习算法，可以用于对样本进行分类（Classification），也可以用于回归分析（Regression）。</p>
<p>它属于非线性分类器，因此可以挖掘变量之间复杂的非线性的相互依赖关系。通过随机森林分析，可以找出能够区分两组样本间差异关键OTU。</p>
<p><i>Feature Importance Scores表格-来源于随机森林结果</i></p>
</div>
<p>记录了各OTU对组间差异的贡献值大小。</p></div>
<div><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-a855cbdb5a069bb1.png"><img class="aligncenter size-large wp-image-1484" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-a855cbdb5a069bb1-1024x337.png" alt="18585978-a855cbdb5a069bb1" width="640" height="211" /></a></p>
<div>
<div>
<p>注：一般地，选取Mean_decrease_in_accuracy值大于0.05的OTU，作进一步分析；对于组间差异较小的样本，该值可能会降至0.03。</p>
<p><b>2. 交叉验证分析</b></p>
<p>交叉验证（Crossvalidation)，是一种统计学上将数据样本切割成较小子集的实用方法。先在一个子集上做分析，而其它子集则用来做后续对此分析的确认及验证。一开始的子集被称为训练集。而其它的子集则被称为验证集或测试集。</p>
<p>其中最常见的为k-foldercross-validation，它指的是将所有数据分成k个子集，每个子集均做一次测试集，其余的作为训练集。交叉验证重复k次，每次选择一个子集作为测试集，并将k次的平均交叉验证识别正确率作为结果。</p>
<p>所有的样本都被作为了训练集和测试集，每个样本都被验证一次。</p>
<p>对随机森林方法筛选出的关键OTU的组合进行遍历，以期用最少的OTU数目组合构建一个错误率最低高效分类器。</p>
<p>一般地，对随机森林分析筛选出的关键OTU，按照不同组合进行10倍交叉验证分析，找出能够最准确区分组间差异的最少的OTU组合，再做进一步的分析，如ROC分析等。</p>
</div>
</div>
<div><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-ffceaf913a867414.png"><br />
<img class="aligncenter size-full wp-image-1485" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-ffceaf913a867414.png" alt="18585978-ffceaf913a867414" width="773" height="723" /></a></div>
<div>
<div>
<p>注：图中横坐标表示不同数量的OTU组合，纵坐标表示该数量OTU组合下分类的错误率。OTU组合数越少，且错误率越低，则该OTU组合被认为是能够区分组间差异的最少的OTU组合。</p>
<p><b>3. ROC曲线</b></p>
<p>接收者操作特征曲线（Receiveroperating characteristic curve，ROC 曲线）也是一种有效的有监督学习方法。ROC分析属于二元分类算法，用来处理只有两种分类的问题，可以用于选择最佳的判别模型,选择最佳的诊断界限值。</p>
<p>可依据专业知识，对疾病组和参照组测定结果进行分析，确定测定值的上下限、组距以及截断点(cut-offpoint)，按选择的组距间隔列出累积频数分布表，分别计算出所有截断点的敏感性(Sensetivity)、特异性和假阳性率(1-特异性:Specificity)。以敏感性为纵坐标代表真阳性率，(1-特异性)为横坐标代表假阳性率，作图绘成ROC曲线。ROC曲线越靠近左上角，诊断的准确性就越高。亦可通过分别计算各个试验的ROC曲线下的面积(AUC)进行比较，哪一种试验的AUC最大，则哪一种试验的诊断价值最佳。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-07a26b63fea21bf8.png"><img class="aligncenter size-full wp-image-1486" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-07a26b63fea21bf8.png" alt="18585978-07a26b63fea21bf8" width="685" height="688" /></a></p>
<div>
<div>
<p>注：图中横坐标为假阳性率false positive rate（FPR）：Specificity，纵坐标为真阳性率true positive rate（TPR）：Sensetivity。最靠近左上角的ROC曲线的点是错误最少的最好阈值，其假阳性和假阴性的总数最少。ROC曲线下的面积值在1.0和0.5之间。在AUC&gt;0.5的情况下，AUC越接近于1，说明诊断效果越好。AUC在 0.5~0.7时有较低准确性，AUC在0.7~0.9时有一定准确性，AUC在0.9以上时有较高准确性。AUC=0.5时，说明诊断方法完全不起作用，无诊断价值。AUC&lt;0.5不符合真实情况，在实际中极少出现。</p>
<p><b>4. Wilcoxon秩和检验分析</b></p>
<p>Wilcoxonrank-sum test，也叫曼-惠特尼U检验（Mann–WhitneyU test），是两组独立样本非参数检验的一种方法。其原假设为两组独立样本来自的两总体分布无显著差异，通过对两组样本平均秩的研究来实现判断两总体的分布是否存在差异，该分析可以对两组样品的物种进行显著性差异分析，并对p值计算假发现率（FDR）q值。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-6714c4d277105abd.png"><img class="aligncenter size-large wp-image-1487" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-6714c4d277105abd-1024x218.png" alt="18585978-6714c4d277105abd" width="640" height="136" /></a></p>
<div>
<div>
<p>注：mean分别为两组样品物种的平均相对丰度，sd分别是两组样本物种相对丰度的标准差。P值为对两组检验原假设为真的概率值，p&lt;0.05表示存在差异，p&lt;0.01表示差异显著，q值为假发现率。</p>
<p><b>5. 差异菌群Heatmap分析</b></p>
<p>以10倍交叉验证（10-foldcross-validation）估计泛化误差（Generalizationerror）的大小，其余参数使用默认设置。建模结果同时包含“基线”误差（Baselineerror）的期望值，即数据集中属于最优势分类的样本全部被错误分类的概率。每个OTU根据其被移除后模型预报错误率增加的大小确定其重要度数值，重要度越高，该OTU对模型预报准确率的贡献越大。</p>
<p>根据挑选出来的差异OTU，根据其在每个样品中的丰度信息，对物种进行聚类，绘制成热图，便于观察哪些物种在哪些样品中聚集较多或含量较低。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-391e366b1420fa92.png"><img class="aligncenter size-full wp-image-1488" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-391e366b1420fa92.png" alt="18585978-391e366b1420fa92" width="660" height="650" /></a></p>
<div>
<div>
<p>注：图中越接近蓝色表示物种丰度越低，越接近橙红色表示丰度越高。左边的聚类树是根据各物种间的spearman相关性距离进行聚类；上边的聚类树是采用样本间距离算法中最常用的Bray-Curtis算法进行聚类。</p>
<p><b>6. 两组样本Welch’s t-test分析</b></p>
<p>两组不同方差的样本可使用Welch’st-test进行差异比较分析，通过此分析可获得在两组中有显著性差异的物种[或差异基因丰度—适用于元（宏）基因组]。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-8453377e0336274c.png"><img class="aligncenter size-large wp-image-1489" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-8453377e0336274c-1024x531.png" alt="18585978-8453377e0336274c" width="640" height="332" /></a></div>
<div>
<div>
<div>
<p>注：上图所示为不同基因丰度（或物种）在两组样品中的丰度比例，中间所示为95%置信度区间内，物种丰度的差异比例，最右边的值为p值，p值＜0.05，表示差异显著。</p>
<p><b>7. Shannon多样性指数比较盒状图</b></p>
<p>将不同分类或环境的多组样本的Shannon多样性指数进行四分位计算，比较不同样本组的组间Shannon指数差异。同时进行非参数Mann-Whitney判断样本组间的显著性差异</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-5c097b33070b52e3.png"><img class="aligncenter size-full wp-image-1490" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-5c097b33070b52e3.png" alt="18585978-5c097b33070b52e3" width="338" height="350" /></a></div>
<div>
<div>
<p>注：横坐标表示样本分组，纵坐标表示相对应的Alpha多样性指数值；图形可以显示5个统计量（最小值，第一个四分位，中位数，第三个中位数和最大值，及由下到上5条线）。p＜0.05，表示差异显著；P&lt;0.01，表示差异极显著。</p>
<p><b>8. 基于距离的箱式图</b></p>
<p>将不同分类或环境的多组样本的距离进行四分位计算，比较不同样本组的组内和组间的距离分布差异。同时进行multipleStudent&#8217;s two-sample t-tests判断样本组间差异的显著性。</p>
<p>箱式图的作用：识别数据异常值；粗略估计和判断数据特征；比较几批数据的形状，同一数轴上，几批数据的箱形图并行排列，几批数据的中位数、尾长、异常值、分布区间等形状信息一目了然。</p>
<p>箱线图（Boxplot）也称箱须图（Box-whiskerPlot），是利用数据中的五个统计量：最小值、第一四分位数、中位数、第三四分位数与最大值来描述数据的一种方法，它也可以粗略地看出数据是否具有对称性，分布的分散程度等信息，特别可以用于对几组样本的比较。简单箱线图由五部分组成，分别是最小值、中位数、最大值和两个四分位数。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-1605130e5d641edc.png"><img class="aligncenter size-full wp-image-1491" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-1605130e5d641edc.png" alt="18585978-1605130e5d641edc" width="740" height="682" /></a></div>
<div>
<div>
<div>
<p>注：第一四分位数 (Q1)，又称“下四分位数”，等于该样本中所有数值由小到大排列后第25%的数字。第二四分位数 (Q2)，又称“中位数”，等于该样本中所有数值由小到大排列后第50%的数字。 第三四分位数 (Q3)，又称“上四分位数”，等于该样本中所有数值由小到大排列后第75%的数字。</p>
<p><b>9. LEfSe分析</b></p>
<p>LEfSe是一种用于发现高维生物标识和揭示基因组特征的软件。包括基因，代谢和分类，用于区别两个或两个以上生物条件（或者是类群）。该算法强调的是统计意义和生物相关性。让研究人员能够识别不同丰度的特征以及相关联的类别。</p>
<p>LEfSe通过生物学统计差异使其具有强大的识别功能。然后，它执行额外的测试，以评估这些差异是否符合预期的生物学行为。</p>
<p>具体来说，首先使用non-parametric factorial Kruskal-Wallis (KW) sum-rank test（非参数因子克鲁斯卡尔—沃利斯和秩验检）检测具有显著丰度差异特征，并找到与丰度有显著性差异的类群。最后，LEfSe采用线性判别分析（LDA）来估算每个组分（物种）丰度对差异效果影响的大小。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-9453e2fea01fb73b.png"><img class="aligncenter size-large wp-image-1492" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-9453e2fea01fb73b-1024x377.png" alt="18585978-9453e2fea01fb73b" width="640" height="236" /></a></div>
<div>
<div>
<div>
<p>说明：左边的图为统计两个组别当中有显著作用的微生物类群通过LDA分析（线性回归分析）后获得的LDA分值。右边的图为聚类树，节点大小表示丰度，默认从门到属依次向外排列。红色区域和绿色区域表示不同分组，树枝中红色节点表示在红色组别中起到重要作用的微生物类群，绿色节点表示在绿色组别中起到重要作用的微生物类群，黄色节点表示的是在两组中均没有起到重要作用的微生物类群。图中英文字母表示的物种名称在右侧图例中进行展示。</p>
<p><b>10. ANOSIM相似性分析</b></p>
<p>相似性分析(ANOSIM)是一种非参数检验，用来检验组间（两组或多组）的差异是否显著大于组内差异，从而判断分组是否有意义。首先利用Bray-Curtis算法计算两两样品间的距离，然后将所有距离从小到大进行排序，按以下公式计算R值，之后将样品进行置换，重新计算R*值，R*大于R的概率即为P值。</p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-e0960fa6644a18ff.png"><img class="aligncenter size-full wp-image-1493" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-e0960fa6644a18ff.png" alt="18585978-e0960fa6644a18ff" width="454" height="135" /></a></p>
<div>
<div>
<p>其中，</p>
<p>r ̅ _b：表示组间（Between groups）距离排名的平均值；</p>
<p>r ̅ _w：表示组内（Within groups）距离排名的平均值；</p>
<p>n：表示样品总数。</p>
<p><b>Table. Anosimanalysis</b></p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-d456795bc0cddde8.png"><img class="aligncenter size-large wp-image-1494" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-d456795bc0cddde8-1024x344.png" alt="18585978-d456795bc0cddde8" width="640" height="215" /></a></div>
<div>
<div>
<div>
<p>注：理论上，R值范围为-1到+1，实际中R值一般从0到1，R值接近1表示组间差异越大于组内差异，R值接近0则表示组间和组内没有明显差异。P值则反映了分析结果的统计学显著性，P值越小，表明各样本分组之间的差异显著性越高，P&lt; 0.05表示统计具有显著性；Number of permutation表示置换次数。</p>
<p><b>11. Adonis多因素方差分析</b></p>
<p>Adonis又称置换多因素方差分析（permutationalMANOSVA）或非参数多因素方差分析（nonparametricMANOVA）。它利用半度量(如Bray-Curtis)或度量距离矩阵(如Euclidean)对总方差进行分解，分析不同分组因素对样品差异的解释度，并使用置换检验对划分的统计学意义进行显著性分析。</p>
<p><b>Table permutational MANOVA analysis</b></p>
</div>
<p><a href="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-7fa68baa52da9d13.png"><img class="aligncenter size-large wp-image-1495" src="http://www.biofacebook.com/wp-content/uploads/2020/03/18585978-7fa68baa52da9d13-1024x132.png" alt="18585978-7fa68baa52da9d13" width="640" height="83" /></a></p>
<div>
<div>
<p>注：</p>
<p>Group：表示分组；</p>
<p>Df：表示自由度；</p>
<p>SumsOfSqs：总方差，又称离差平方和；</p>
<p>MeanSqs：平均方差，即SumsOfSqs/Df；</p>
<p>F.Model：F检验值；</p>
<p>R2：表示不同分组对样品差异的解释度，即分组方差与总方差的比值，即分组所能解释的原始数据中差异的比例，R2越大表示分组对差异的解释度越高；</p>
<p>Pr(&gt;F)：通过置换检验获得的P值，P值越小，表明组间差异显著性越强。</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<p>作者：JarySun<br />
链接：https://www.jianshu.com/p/87f24cceaa43<br />
来源：简书<br />
著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。</p></div>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1483</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>v2ray</title>
		<link>https://www.biofacebook.com/?p=1446</link>
		<comments>https://www.biofacebook.com/?p=1446#comments</comments>
		<pubDate>Fri, 21 Feb 2020 09:42:29 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[docker]]></category>
		<category><![CDATA[Linux相关]]></category>
		<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1446</guid>
		<description><![CDATA[<p>https://github.com/Jrohy/multi-v2ray</p> <p>&#160;</p> Docker运行 <p>默认创建mkcp + 随机一种伪装头配置文件：</p> docker run -d --name v2ray --privileged --restart always --network host jrohy/v2ray <p>自定义v2ray配置文件:</p> docker run -d --name v2ray --privileged -v /path/config.json:/etc/v2ray/config.json --restart always --network host jrohy/v2ray <p>查看v2ray配置:</p> docker exec v2ray bash -c "v2ray info" <p>warning: 如果用centos，需要先关闭防火墙</p> systemctl stop firewalld.service systemctl disable firewalld.service ]]></description>
				<content:encoded><![CDATA[<p>https://github.com/Jrohy/multi-v2ray</p>
<p>&nbsp;</p>
<h2>Docker运行</h2>
<p>默认创建mkcp + 随机一种伪装头配置文件：</p>
<pre><code>docker run -d --name v2ray --privileged --restart always --network host jrohy/v2ray
</code></pre>
<p>自定义v2ray配置文件:</p>
<pre><code>docker run -d --name v2ray --privileged -v /path/config.json:/etc/v2ray/config.json --restart always --network host jrohy/v2ray
</code></pre>
<p>查看v2ray配置:</p>
<pre><code>docker exec v2ray bash -c "v2ray info"
</code></pre>
<p><strong>warning</strong>: 如果用centos，需要先关闭防火墙</p>
<pre><code>systemctl stop firewalld.service
systemctl disable firewalld.service
</code></pre>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1446</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>alpha多样性</title>
		<link>https://www.biofacebook.com/?p=1436</link>
		<comments>https://www.biofacebook.com/?p=1436#comments</comments>
		<pubDate>Tue, 18 Feb 2020 03:24:22 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[生物信息]]></category>
		<category><![CDATA[统计学习]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1436</guid>
		<description><![CDATA[ 扩增子数据分析之多样性指数： alpha多样性 <p>多样性指数（Diversity index）和计算公式可以见： wikipedia</p> <p>Alpha多样性（Alpha Diversity）是对某个样品中物种多样性的分析，包含样品中的物种类别的多样性——丰富度（Richness）和物种组成多少的整体分布——均匀度（Evenness）两个因素，通常用Richness,Chao1，Shannon，Simpson，Dominance和Equitability等指数来评估样本的物种多样性。</p> <p>丰富度指数</p> <p>Richness, Chao1，Shannon三个指数是常用的评估丰富度的指标，数值越高表明样品包含的物种丰富度就越高。</p> Richness指数: 指样本中被检测到的OTU量； Chao1指数 : 通过低丰度OTUs来进一步预测样品中的OTUs数量； Shannon指数 : 计算考虑到样品中的OTUs及其相对丰度信息， 通过对数（如以2为底的shannon_2，以自然对数为底的shannon_e 以10为底的shannon_10）转换来预测样品中的分类多样性。 <p>均匀度指数</p> <p>Simpson，Dominance和Equitability三个指数是常用的评估均匀度的指标。</p> Simpson指数 : 表示随机选取两条序列属于同一个分类（如OTUs）的概率（故数值在0~1之间）， 数值越接近1表示表明OTUs的丰度分部越不均匀； Dominancez指数 : 取值为1-Simpson，表示随机选取两条序列属于不同分类（如OTUs）的概率； Equitability指数: 根据Shannon指数值计算，当其值为1时表明样品中的物种丰度分布绝对均匀， 而其值越小这表明物种丰度分布呈现出越高的偏向。 <p>汇总表：</p> 指数 单位 计算方式 richness OTUs 样本中至少包含一条序列的OTU数目 chao1 OTUs N + S^2 / (2D^2)，其中N为OTU个数, S为丰度为1的OTUs个数，D为丰度为2的OTUs数目； shannon_2 bits sum(f), 对所有OTU频率计算p*log(p,2)和, p为OTU的频率； shannon_e nats [...]]]></description>
				<content:encoded><![CDATA[<div class="post-headline">
<h1>扩增子数据分析之多样性指数： alpha多样性</h1>
</div>
<div class="post-bodycopy clearfix">
<p>多样性指数（Diversity index）和计算公式可以见： <a href="https://en.wikipedia.org/wiki/Diversity_index#Shannon_index">wikipedia</a></p>
<p>Alpha多样性（Alpha Diversity）是对某个样品中物种多样性的分析，包含样品中的物种类别的多样性——丰富度（Richness）和物种组成多少的整体分布——均匀度（Evenness）两个因素，通常用Richness,Chao1，Shannon，Simpson，Dominance和Equitability等指数来评估样本的物种多样性。</p>
<p><strong>丰富度指数</strong></p>
<p>Richness, Chao1，Shannon三个指数是常用的评估丰富度的指标，数值越高表明样品包含的物种丰富度就越高。</p>
<pre><code>Richness指数: 指样本中被检测到的OTU量；
Chao1指数   : 通过低丰度OTUs来进一步预测样品中的OTUs数量；
Shannon指数 : 计算考虑到样品中的OTUs及其相对丰度信息，
             通过对数（如以2为底的shannon_2，以自然对数为底的shannon_e
             以10为底的shannon_10）转换来预测样品中的分类多样性。
</code></pre>
<p><strong>均匀度指数</strong></p>
<p>Simpson，Dominance和Equitability三个指数是常用的评估均匀度的指标。</p>
<pre><code>Simpson指数     : 表示随机选取两条序列属于同一个分类（如OTUs）的概率（故数值在0~1之间），
                  数值越接近1表示表明OTUs的丰度分部越不均匀；
Dominancez指数  : 取值为1-Simpson，表示随机选取两条序列属于不同分类（如OTUs）的概率；
Equitability指数: 根据Shannon指数值计算，当其值为1时表明样品中的物种丰度分布绝对均匀，
                  而其值越小这表明物种丰度分布呈现出越高的偏向。
</code></pre>
<p><strong>汇总表：</strong></p>
<table>
<thead>
<tr class="alt">
<th>指数</th>
<th>单位</th>
<th>计算方式</th>
</tr>
</thead>
<tbody>
<tr>
<td>richness</td>
<td>OTUs</td>
<td>样本中至少包含一条序列的OTU数目</td>
</tr>
<tr class="alt">
<td>chao1</td>
<td>OTUs</td>
<td>N + S^2 / (2D^2)，其中N为OTU个数, S为丰度为1的OTUs个数，D为丰度为2的OTUs数目；</td>
</tr>
<tr>
<td>shannon_2</td>
<td>bits</td>
<td>sum(f), 对所有OTU频率计算p*log(p,2)和, p为OTU的频率；</td>
</tr>
<tr class="alt">
<td>shannon_e</td>
<td>nats</td>
<td>sum(f), 对所有OTU频率计算p*log(p,e)和, p为OTU的频率；</td>
</tr>
<tr>
<td>shannon_10</td>
<td>dits</td>
<td>sum(f), 对所有OTU频率计算p*log(p,10)和, p为OTU的频率；</td>
</tr>
<tr class="alt">
<td>simpson</td>
<td>Probability</td>
<td>sum(f^2)， f为所有OTU频率的和</td>
</tr>
<tr>
<td>dominance</td>
<td>Probability</td>
<td>1-simpson</td>
</tr>
<tr class="alt">
<td>equitability</td>
<td></td>
<td>shannon/log(N), N为OTU数(logs to base 2)</td>
</tr>
</tbody>
</table>
<p><strong>实例：</strong></p>
<p><strong>USEARCH alpha_div</strong></p>
<p>USEARCH 提供了alpha_div函数进行计算各种指数, 可通<code>·-metrics</code> 指定需要计算指数，支持的指数有： berger_parker、buzas_gibson、chao1、dominance、equitability、jost、jost1、reads、richness、robbins、simpson shannon_e、shannon_2、shannon_10</p>
<pre><code>usearch -alpha_div otutable.txt -output alpha.txt
usearch -alpha_div otutable.txt -output gini.txt  -metrics gini_simpson
usearch -alpha_div otutable.txt -output alpha.txt -metrics chao1,
</code></pre>
<p><strong>QIIME diversity alpha</strong></p>
<p>qiime2 数据分析流程通过 <code>qiime diversity</code>接口提供了分析`alpha多样性·的各种命令：</p>
<pre><code>--i-table  : FeatureTable
--p-metric : enspie|michaelis_menten_fit|strong|lladser_pe|fisher_alpha
             |goods_coverage|doubles|simpson|margalef|observed_otus|osd
             |shannon|pielou_e|chao1|brillouin_d|menhinick|simpson_e
             |kempton_taylor_q|robbins|dominance|lladser_ci|heip_e
             |singles|chao1_ci|mcintosh_d|ace|mcintosh_e|gini_index
             |berger_parker_d|esty_ci
--o-alpha-diversity: 输出alpha多样性；
--output-dir： 输出目录（如不指定--o-distance-matrix）；
</code></pre>
<p>执行：</p>
<pre><code>qiime diversity alpha          \
   --i-table  table.qza       \
   --p-metric  goods_coverage \
   --o-alpha-diversity  goods_coverage.qza

</code></pre>
<div>物多样性测定主要有三个空间尺度：α多样性，β多样性，γ多样性。</div>
<div></div>
<div> <wbr></wbr>  <wbr></wbr>  <wbr></wbr><b>α多样性</b>主要关注局域均匀生境下的物种数目，因此也被称为生境内的多样性（within-habitat diversity）</div>
<div></div>
<div> <wbr></wbr>  <wbr></wbr>  <wbr></wbr> <b>β多样性</b>指沿环境梯度不同生境群落之间物种组成的的相异性或物种沿环境梯度的更替速率也被称为生境间的多样性（between-habitat diversity），控制β多样性的主要生态因子有土壤、地貌及干扰等。</div>
<div>
<div>不同群落或某环境梯度上不同点之间的共有种越少，β多样性越大。精确地测定<a href="http://baike.baidu.com/view/3815769.htm" target="_blank">β多样性</a>具有重要的意义。这是因为：①它可以指示生境被物种隔离的程度；②β多样性的测定值可以用来比较不同地段的生境多样性；③β多样性与<a href="http://baike.baidu.com/view/3815768.htm" target="_blank">α多样性</a>一起构成了总体多样性或一定地段的生物异质性。</div>
<div>γ多样性描述区域或大陆尺度的多样性，是指区域或大陆尺度的物种数量，也被称为区域多样性（regional diversity）。控制<a href="http://baike.baidu.com/view/3815770.htm" target="_blank">γ多样性</a>的<a href="http://baike.baidu.com/view/3273923.htm" target="_blank">生态过程</a>主要为水热动态，气候和<a href="http://baike.baidu.com/view/702554.htm" target="_blank">物种形成</a>及演化的历史。主要指标为物种数（S）。γ多样性测定沿海拔梯度具有两种分布格局：偏锋分布和显著的负相关格局。</div>
</div>
<pre><code>
<span style="font-family: Consolas,Monaco,monospace;">https://rdrr.io/cran/otuSummary/man/alphaDiversity.html

</span></code></pre>
<div class="b_title">
<h2><a href="https://www.mothur.org/wiki/Invsimpson" target="_blank">Invsimpson &#8211; mothur</a></h2>
<div class="b_suffix b_secondaryText nowrap">
<div>The invsimpson calculator is the inverse of the classical Simpson diversity estimator. This parameter is preferred to other measures of <strong>alpha</strong>-diversity because it is an indication of the richness in a community with uniform evenness that would have the same level of diversity.</div>
</div>
</div>
<div class="b_caption">
<div class="b_attribution"><cite>https://www.mothur.org/wiki/<strong>Invsimpson</strong></cite></div>
</div>
<pre><strong>Biological diversity - the great variety of life !</strong></pre>
<div id="ct" class="ct2 wp cl">
<div class="mn">
<div class="bm">
<div class="bm_c">
<div class="vw mbm">
<div id="blog_article" class="d cl">
<p>在探索simpson指数之前，我们需要理解几个很重要的概念：</p>
<p>生物多样性可以用很多种方式定量，其中两个主要的因素是丰富度（richness）和均匀度（evenness）。</p>
<p>1. Richness</p>
<p>丰富度即每个样本的物种数，样本中物种越多，样本越“丰富”。</p>
<p>物种丰富度从概念上讲，并不考虑（样本中）每个物种有多少个个体。它给于个体数少的物种与个体数多的数种相同的权重。因此，在某地区1朵雏菊与1000朵金凤花对丰富度的影响是一样的。</p>
<p>2. Evenness</p>
<p>均匀度即不同物种的相对丰度（abundance）,它与丰富度互相补充，相辅相成（make up）。</p>
<p>[译者注] 这里其实有三个概念：Richness, Evennes 和abundance。例如A组：类1有3个，类2有5个，类3有6个；B组：类1有4个，类2有4个，类3有4个。那么A组有3类，B组也有3类，所以它们的richness是一样的；A组中3个类所含个体数均不相同，而B组中3个类所含个体数相同，因此A组和B组的evennes不同；A组类1有3个，B组类1有4个，所以就类1而言B组的abundance更高。</p>
<p>我们对两个地区不同的野花进行取样，以此为例。第1个地区包括300朵雏菊，335朵蒲公英和365朵金凤花。第2个地区包括20朵雏菊，49朵蒲公英和931朵金凤花，如下表。两个样本丰富度相同（均有3个物种），总的个体数也相同（均为1000朵）。然而第1个地区样本的均匀度比第2个地区样本的均匀度更高。这是因为（在第1个地区）3个物种个体分布较均匀，第2个地区大多数是金凤花，仅有少数雏菊和蒲公英。因此认为样本2比样本1的多样性更低。</p>
<p><a href="http://image.sciencenet.cn/home/201708/04/164923bgmoicctp4kq90bl.png" target="_blank"><img src="http://image.sciencenet.cn/home/201708/04/164923bgmoicctp4kq90bl.png" alt="" /></a></p>
<p><em>相比于由相</em><em>似</em><em>丰度的许多物种组成的群落</em><em>，由一两个优势物种组成的群落具有更低的多样性。</em></p>
<p>多样性随物种丰富度和均匀度的增加而增加。Simpson指数兼顾丰富度和均匀度。</p>
<p>Simpson多样性指数实际上涉及三个相似的指数：</p>
<p><strong>Simpson’s Index (D) </strong></p>
<p>它反映的是在同一个样本中随机的抽取2个个体，这两个个体来自同一个类的概率。有以下两个版本的公式来计算simpson指数。两者不矛盾，均可接受。</p>
<table border="3" width="60%" align="CENTER">
<tbody>
<tr>
<td><a href="http://image.sciencenet.cn/home/201708/04/165216cljy66u6cjthffh6.png" target="_blank"><img src="http://image.sciencenet.cn/home/201708/04/165216cljy66u6cjthffh6.png" alt="" /></a></td>
<td><a href="http://image.sciencenet.cn/home/201708/04/1652207ot61olwjjpf9o1k.png" target="_blank"><img src="http://image.sciencenet.cn/home/201708/04/1652207ot61olwjjpf9o1k.png" alt="" /></a></td>
</tr>
<tr>
<td colspan="2" rowspan="1"><strong>n = the total number of organisms of a particular species</strong><strong><br />
</strong><strong>N = the total number of organisms of all species</strong></td>
</tr>
</tbody>
</table>
<p>D值在0-1之间。0表示无限多样，1表示没有多样性。也就是说D值越大，多样性越低。这与直觉和逻辑不符，为了解决这个问题，通常会用1减去D：</p>
<p><strong>Simpson’s Index of Diversity 1-D</strong></p>
<p>这个值也在0-1之间，但是此时，值越大多样性越高，这就变得更直观了。这种情况下，指数代表的意义是在同一个样本中随机的抽取2个个体，这两个个体来自不同类的概率。</p>
<p>对于违背直觉的D值，还有另一种处理办法，即用1除以D:</p>
<p><strong>Simpson&#8217;s Reciprocal Index 1 / D</strong></p>
<p>1/D的最小值为1。当它为1时表示样本仅由1个物种组成。值越大，多样性越高。最大值是样本中的物种数。例如，假设一个样本中有5个物种，则1/D的最大值为5。</p>
<p>[译者注] 当样本中这5个物种的丰度都相等时1/D达到最大值5。大家可以通过求二阶偏导来求出极值，因非本文重点，证明从略。</p>
<p>以上三个指数想用哪一个取决于使用者的分析需求，但是在研究中需指明使用哪一个指标作为simpson指数！[译者注：该文作者着重强调了这一点，请注意！]</p>
<p># ====================== 译文结束 =======================</p>
<p>这篇材料提供的案例很好，但是遗憾的是仅说明了simpson指数与evennes关系。为了进行单因素比较，作者将两组丰富度设为相同。那么如果丰富度不同呢？而且simpson指数是否与shannon指数一样与丰度无关呢？这里再举一个例子(因为各组相互独立，这里就不给生物学意义，直接上数字了，具体可查看另一篇shannon指数博文[2])：</p>
<p>A组：2, 4, 6, 8</p>
<p>B组：20, 40, 60, 80</p>
<p>C组：5, 5, 5, 5</p>
<p>D组：5, 5, 5, 5, 5</p>
<p>代入公式1-D计算（因为微生物16SrRNA经典流程QIIME使用的scikit库是利用这个公式计算的〔3〕），我们可以得出：</p>
<p>A组simpson指数为： 1-((2/20)^2+(4/20)^2+(6/20)^2+(8/20)^2) = 0.7</p>
<p>A组shannon指数为 1.846439（计算公式见博文[2]，下同）</p>
<p>B组simpson指数为： 1-((20/200)^2+(40/200)^2+(60/200)^2+(80/200)^2) = 0.7</p>
<p>B组shannon指数为 1.846439</p>
<p>C组simpson指数为： 1-((5/20)^2)*4 = 0.75</p>
<p>C组shannon指数为 2.0</p>
<p>D组simpson指数为： 1-((5/25)^2)*5 = 0.8</p>
<p>D组shannon指数为 2.321928</p>
<p>从上面的计算过程很明显看出A组和B组相等，C组和D组不相等，A组和C组也不相等。</p>
<p>AB组结果相同显示出在丰富度一致时simpson指数与丰度无关，它只与相对丰度（均匀度）有关。这和shannon指数一致，归根结底是因为公式中自变量都是相对丰度pi！</p>
<p>CD组结果不同显示出在均匀度一致时simpson指数与丰富度有关，丰富度越大，simpson指数越小。这一点也和shannon指数的情况一致，归根结底，原因在于公式中都有加和项，而且加和部分无论是simpson指数的(pi)<sup>2</sup>还是shannon指数的x*log2(x)在区间（0，1〕上均大于0（有关x*log2(x)&gt;0, x∈（0，1〕可以查看博文〔2〕中的y= &#8211; x*log2(x)那张图）。因此，无论是shannon指数还是simpson指数每多加一项（即丰富度增加），值都会越来越小。回到抽样上来讲，当样本中每种个体数都相同时，在一个样本中随机抽取两个个体，种类越多抽到的这两个个体来自同一个种类的概率越大。</p>
<p>AC组显示出当丰富度相同时，样本中种类越均一，simpson指数越大，即种类越均一，随机抽取两个个体属于同一个种类的概率越大。这一点可以查看博文〔2〕中的分析过程。对应shannon指数的y = &#8211; x*log2(x)， simpson指数的y = &#8211; x<sup>2 </sup>在（0，1〕间区上，也是一个斜率逐渐减小的单调递减函数。</p>
<p>综上，simpson和shannon指数都是均匀度和丰富度的综合指标。</p>
<p>〔1〕 <a href="http://www.countrysideinfo.co.uk/simpsons.htm" target="_blank">http://www.countrysideinfo.co.uk/simpsons.htm</a></p>
<p>〔2〕 <a href="http://blog.sciencenet.cn/blog-2970729-1069399.html" target="_blank">http://blog.sciencenet.cn/blog-2970729-1069399.html</a></p>
<p>〔3〕 <a href="http://scikit-bio.org/docs/latest/generated/generated/skbio.diversity.alpha.simpson.html#skbio.diversity.alpha.simpson" target="_blank">http://scikit-bio.org/docs/latest/generated/generated/skbio.diversity.alpha.simpson.html#skbio.diversity.alpha.simpson</a></p>
<p><label>本文来自卢锐科学网博客。<br />
链接地址：</label><a href="http://blog.sciencenet.cn/blog-2970729-1069539.html" target="_blank">http://blog.sciencenet.cn/blog-2970729-1069539.html </a></div>
</div>
</div>
</div>
</div>
</div>
<pre><code><span style="font-family: Consolas,Monaco,monospace;"> </span></code></pre>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1436</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TORMES and gapFinisher</title>
		<link>https://www.biofacebook.com/?p=1429</link>
		<comments>https://www.biofacebook.com/?p=1429#comments</comments>
		<pubDate>Mon, 30 Dec 2019 05:34:47 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1429</guid>
		<description><![CDATA[TORMES: an automated pipeline for whole bacterial genome analysis Narciso M Quijada, David Rodríguez-Lázaro, Jose María Eiros, Marta Hernández Bioinformatics, Volume 35, Issue 21, 1 November 2019, Pages 4207–4212, https://doi.org/10.1093/bioinformatics/btz220 gapFinisher: A reliable gap filling pipeline for SSPACE-LongRead scaffolder output Juhana I. Kammonen , Olli-Pekka Smolander, Lars Paulin, Pedro A. B. Pereira, Pia Laine, Patrik [...]]]></description>
				<content:encoded><![CDATA[<h1 class="wi-article-title article-title-main">TORMES: an automated pipeline for whole bacterial genome analysis<i class="" title=""></i></h1>
<div class="wi-authors">
<div class="al-authors-list"><span class="al-author-name-more"><a class="linked-name">Narciso M Quijada</a><span class="delimiter">,</span></span> <span class="al-author-name-more"><a class="linked-name">David Rodríguez-Lázaro</a><span class="delimiter">,</span></span> <span class="al-author-name-more"><a class="linked-name">Jose María Eiros</a><span class="delimiter">,</span></span> <span class="al-author-name-more"><a class="linked-name">Marta Hernández</a><i class="icon-general-mail"></i></span></div>
</div>
<div class="pub-history-wrap clearfix">
<div class="pub-history-row clearfix">
<div class="ww-citation-primary"><em>Bioinformatics</em>, Volume 35, Issue 21, 1 November 2019, Pages 4207–4212, <a href="https://doi.org/10.1093/bioinformatics/btz220">https://doi.org/10.1093/bioinformatics/btz220</a></div>
<div class="ww-citation-primary"></div>
<div class="ww-citation-primary"></div>
<div class="ww-citation-primary">
<div class="title-authors">
<h1 id="artTitle">gapFinisher: A reliable gap filling pipeline for SSPACE-LongRead scaffolder output</h1>
<ul id="author-list" class="author-list clearfix" data-js-tooltip="tooltip_container">
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="0">Juhana I. Kammonen ,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="1">Olli-Pekka Smolander,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="2">Lars Paulin,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="3">Pedro A. B. Pereira,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="4">Pia Laine,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="5">Patrik Koskinen,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="6">Jukka Jernvall,</a></li>
<li data-js-tooltip="tooltip_trigger"><a class="author-name" data-author-id="7">Petri Auvinen</a></li>
</ul>
</div>
<div id="floatTitleTop" class="float-title" data-js-floater="title_author">
<div class="set-grid">
<div class="float-title-inner"></div>
<div id="titleTopCloser" class="logo-close"><img src="https://journals.plos.org/plosone/resource/img/logo.plos.95.png" alt="PLOS" /></p>
<div class="close-floater" title="close"></div>
</div>
</div>
</div>
<ul class="date-doi">
<li id="artPubDate">Published: September 9, 2019</li>
<li id="artDoi"><a href="https://doi.org/10.1371/journal.pone.0216885">https://doi.org/10.1371/journal.pone.0216885</a></li>
</ul>
</div>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1429</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ClinVAP: A reporting strategy from variants to therapeutic options</title>
		<link>https://www.biofacebook.com/?p=1424</link>
		<comments>https://www.biofacebook.com/?p=1424#comments</comments>
		<pubDate>Mon, 16 Dec 2019 09:37:26 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[兴趣杂项]]></category>
		<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1424</guid>
		<description><![CDATA[<p>https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/btz924/5674039</p> <p>&#160;</p> ClinVAP: A reporting strategy from variants to therapeutic options <p>&#160;</p> Abstract Motivation <p>Next-generation sequencing (NGS) has become routine in oncology and opens up new avenues of therapies, particularly in personalized oncology setting. An increasing number of cases also implies a need for a more robust, automated, and reproducible processing of long lists of [...]]]></description>
				<content:encoded><![CDATA[<p><a href="https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/btz924/5674039">https://academic.oup.com/bioinformatics/advance-article/doi/10.1093/bioinformatics/btz924/5674039</a></p>
<p>&nbsp;</p>
<h1 class="wi-article-title article-title-main">ClinVAP: A reporting strategy from variants to therapeutic options</h1>
<p>&nbsp;</p>
<h2 id="190031274" class="abstract-title">Abstract</h2>
<section class="abstract"></section>
<section class="sec">
<div class="title">Motivation</div>
<p>Next-generation sequencing (NGS) has become routine in oncology and opens up new avenues of therapies, particularly in personalized oncology setting. An increasing number of cases also implies a need for a more robust, automated, and reproducible processing of long lists of variants for cancer diagnosis and therapy. While solutions for the large-scale analysis of somatic variants have been implemented, existing solutions often have issues with reproducibility, scalability, and interoperability.</p>
</section>
<section class="sec">
<div class="title">Results</div>
<p>ClinVAP is an automated pipeline which annotates, filters, and prioritizes somatic single nucleotide variants (SNVs) provided in variant call format. It augments the variant information with documented or predicted clinical effect. These annotated variants are prioritized based on driver gene status and druggability. ClinVAP is available as a fully containerized, self-contained pipeline maximizing reproducibility and scalability allowing the analysis of larger scale data. The resulting JSON-based report is suited for automated downstream processing, but ClinVAP can also automatically render the information into a user-defined template to yield a human-readable report.</p>
</section>
<section class="sec">
<div class="title">Availability and Implementation</div>
<p>ClinVAP is available at <a class="link link-uri" href="https://github.com/PersonalizedOncology/ClinVAP" target="">https://github.com/PersonalizedOncology/ClinVAP</a></p>
</section>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1424</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vipie: web pipeline for parallel characterization of viral populations from multiple NGS samples</title>
		<link>https://www.biofacebook.com/?p=1401</link>
		<comments>https://www.biofacebook.com/?p=1401#comments</comments>
		<pubDate>Mon, 16 Sep 2019 06:12:35 +0000</pubDate>
		<dc:creator><![CDATA[szypanther]]></dc:creator>
				<category><![CDATA[二代测序]]></category>
		<category><![CDATA[生物信息]]></category>

		<guid isPermaLink="false">http://www.biofacebook.com/?p=1401</guid>
		<description><![CDATA[Background <p>Next generation sequencing (NGS) technology allows laboratories to investigate virome composition in clinical and environmental samples in a culture-independent way. There is a need for bioinformatic tools capable of parallel processing of virome sequencing data by exactly identical methods: this is especially important in studies of multifactorial diseases, or in parallel comparison of laboratory [...]]]></description>
				<content:encoded><![CDATA[<h3 class="c-article__sub-heading u-h3" data-test="abstract-sub-heading">Background</h3>
<p>Next generation sequencing (NGS) technology allows laboratories to investigate virome composition in clinical and environmental samples in a culture-independent way. There is a need for bioinformatic tools capable of parallel processing of virome sequencing data by exactly identical methods: this is especially important in studies of multifactorial diseases, or in parallel comparison of laboratory protocols.</p>
<p>&nbsp;</p>
<p>https://sourceforge.net/projects/vipie/</p>
]]></content:encoded>
			<wfw:commentRss>https://www.biofacebook.com/?feed=rss2&#038;p=1401</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
