chxp 2017-07-22T08:36:39+00:00 kejinlu@gmail.com 使用Stardict和Anki联合记单词 2014-04-05T00:00:00+00:00 chxp http://chxp.github.io/2014/04/Stardict-and-Anki

Table of Contents

介绍

Anki1

Anki是一个基于间格重复(Spaced Repetition)的字卡软件,同样基于该原理的软件还有商业软件SuperMemo(这个要钱的)和免费软件Mnemosyne。

Anki对SuperMemo的SM2算法予以改进,使其可以根据记忆卡的优先级、紧急程度进行优化调整。SuperMemo的算法已经更新到好多,据Anki作者解释,因为后面的算法比较复杂,而通常用不到,所以就采用了SM2算法。如果你不是很相信这种算法的话,可以使用SuperMemo来比对下。

值得指出的是Anki记忆卡采用HTML语言编写,支持插入图片、音频以及LaTeX公式,这样方便了我们创造出丰富多彩的卡片格式,也是本文使用的前提。

Anki支持多平台客户端,包括PC、安卓、iOS、塞班等,也可以直接登录Ankiweb进行学习。除此之外,注册一个免费账户,便可实现平台之间的同步,不过这种同步不能太过于依赖(作者表示记得考试前几天在手机上修改了卡片,到最后竟然不能同步,郁闷死本人了)。另外有个奇葩的问题,Anki的IOS版本是要收费的,而且很不便宜,其他平台如Android版本竟然免费。据作者解释,这是因为有些合作开发的人提出还是要求来着在Android版本上免费,让我们真心感谢这些合作开发者(跪拜大神)。

星际译王(stardict)

星际译王(StarDict)是一套自由的桌面字典软件。它并不包含字典档,使用者须自行下载配合使用。它可以运行于多种不同的平台,如Linux,Microsoft Windows,FreeBSD及Solaris,并使用GPL授权。

我们这次并不一定用到这个软件,只要用到其命令行下的命令sdcv以及其词典(注意有些词典是破解版)。

步骤

如果平时你使用星际译王查询陌生单词,是否会想将其记下来然后以后再反复的记忆?于是我们就有了将星际译王和Anki联合的想法。

一搜网上,有人已经写了这么的一个插件 StarDict-history-to-Anki ,帮我们实现了这一个功能。但是作为一个审美观念极强的人,我实在不喜欢这个代码实现的纯黑白的卡片,一直想美化它,于是也就有了下文。

通过星际译王查词记录获得词汇

原作者的思路很清晰,StarDict每次关闭后(请注意!要关闭StarDict!!!),StarDict目录下会产生一个history文件记录你这次查询的单词记录,再通过sdcv提取出每个义项的解释,略加修饰既可导入anki中。

原作者初始版本的代码请参考上面链接,我在这里展示已经修饰过的代码。

#!/bin/bash
# This is a simple script that research the words in the searching history of StarDict.
#
# The explanations of each word are saved in a file "~/ankifile" in your $HOME, 
# which can be loaded later into anki with an option "Fields separated by: Tab". 
# (when loading "ankifile", remember to check the option "Allow HTML in fields", if your explanations contains html tags)

######## how to install ? ########
# put it in a folder like "~/bin", and make it executable
#   $ chmod +x dict2anki

####### how to use ? #######
# run it without any arguments in terminal
# $ dict2anki
#
# then a file called ~/ankifile is ready to import into Anki

# Note: StarDict creates the history file when it is closed. 
#       Please run dict2anki with StarDict closed.

######## how to change the name/location of the output file ? #########
# check the variable "outputFileName", assign you prefered filename

############ how to add more dicts ? ############
# put a line like the following after the line of "meanings=`sdcv -n \"
#   -u "dict-name" \

########### how to find the above "dict-name" ##############
# dict names can be found by searhing a word mannuly with sdcv in terminal.
#
# Here in the following is the output of sdcv after searching hello by "$ sdcv hello" on my PC.
# It promotes all my dict names, e.g., "XDICT英汉辞典", "Collins COBUILD V3", "我爱法语-英法词典". 
#
# Found 15 items, similar to hello.
# 0)XDICT英汉辞典-->hello
# 1)懒虫简明英汉词典-->hello
# 2)朗道英汉字典5.0-->hello
# 3)Merriam-Webster Collegiate® Dictionary-->hello
# 4)XDICT英汉辞典-->hello
# 5)CMU American English spelling-->hello
# 6)Collins COBUILD V3-->hello
# 7)The CMU Pronouncing Dictionary-->hello
# 8)Longman Dictionary of Contemporary English-->hello
# 9)美国传统词典[双解]-->hello
# 10)stardict1.3英汉辞典-->hello
# 11)Longman Dictionary of Contemporary English (4th Ed)-->hello
# 12)Merrian Webster 10th dictionary-->hello
# 13)我爱法语-法英词典-->hello
# 14)我爱法语-英法词典-->hello
# Your choice[-1 to abort]: 

# (ctrl-c to abort also)

############# here we go #############

outputFileName=~/ankifile

# if there is a searching history file "~/.stardict/history"
if [ -f ~/.stardict/history ]
then

    while read line
    do
        meanings=`sdcv -n \
            -u "21世纪英汉汉英双向词典" \
            -u "朗道英汉字典5.0" \
            -u "牛津英汉双解美化版" \
            -u "CDICT5英汉辞典" \
            -u "英文字根字典" \
            "$line" | sed '/Nothing similar to/d;/Found/d' | perl ~/.beautify.pl`

        # 搜寻媒体文件
        find /media/学习与工作/Software/SoftwareOfStudy/Dictionary/Lingoes/Translator2/speech/M-W\ English/voice/ -name $line.wav -exec cp {} ~/Anki/cxp/collection.media/ \;

        if [ -n "$meanings" ]; then
            # the output file is named as "~/ankifile" (in $HOME folder)
            echo -e "<div id=\"word\">$line</div>\t<div class=\"vd_longman\">[sound:$line.mp3]</div>\t<div class=\"vd_mw\">[sound:$line.wav]</div>\t$meanings"  >> $outputFileName
        fi
    # load searching history from "~/.stardict/history"
    done < ~/.stardict/history

    # move stardict history file to home folder
    mv ~/.stardict/history  ~/

    echo "Done, saved in $outputFileName"
else
    echo "There is no ~/.stardict/history"
fi

exit

为了让大家理解,解释项也贴了进去。下面就是关键的代码,即.beautiful.pl代码。

标记

关于词典的美化,曾经走了歪路。就是想把原词典的每个义项例句单独提取出来,但这种提取方法真的是太复杂了,而且词典格式本来就有些地方不是很标准。

然后更换了思路,对其中的关键特征进行标记。每个词典都是一个列表,每列都有一个单独的class属性(对html有一丁点的认识的都应该知道,本文作者只是一只菜鸟都理解了。。。啊哈哈哈哈),用以区分义项、例句和其他。

标记解释:k keys 关键词;主项; c categery 种类;形容词动词等; m meaning 解释项; e example 词组或例句; o other 其他。

具体的代码如下:

#!/use/bin/perl

use 5.010;

# 判断文件打开
#if (! open FILE, "dict2anki.tmp") {
#  die "Cannot open file: $!";
#  exit;
#}

# 一次性读取所有数据
@all_data = <>;

# 获取词典解释起止位置,以哈希存储
$i=0;
foreach $all (@all_data) {
  if ( $all =~ /^(-->朗道)/ ) {
    push (@cidian, $i);
    $hdic{"$i"}="langdao";
  }

  if ( $all =~ /^(-->牛津)/ ) {
    push (@cidian, $i);
    $hdic{"$i"}="niujin";
  }

  if ( $all =~ /^(-->CDICT)/ ) {
    push (@cidian, $i);
    $hdic{"$i"}="cdict";
  }

  if ( $all =~ /^(-->21世纪)/ ) {
    push (@cidian, $i);
    $hdic{"$i"}="sj21";
  }

  if ( $all =~ /^(-->英文字根)/ ) {
    push (@cidian, $i);
    $hdic{"$i"}="zigen";
  }

  $i++;
}
$hdic{$i} = "end";
push (@cidian, $i);

#foreach $key (sort keys %hdic){
#  $value = $hdic{$key};
#  print  "$key => $value \n";
#}

# 得到由小到大的字典行数排列
my @keys = sort { $a <=> $b } keys %hdic;
# print "@keys \n";

# 得到每个字典的解释 landao,niujin,sj21,cdict,zigen分别用@+字典简写访问
$len = @keys;
for ($i=0; $i<$len; $i++){
  $n1 = $hdic{@keys[$i]};
  @$n1 = @all_data[($keys[$i]+3)..($keys[$i+1]-2)];
}

# 修改21世纪英汉汉英大辞典的格式
## 对一些不符合规范的格式调整 将<<>>顶头写
$len = @sj21;
for ($i=0; $i<$len; $i++) {
  if (@sj21[$i] ~~ /<<.*>>/)  {
    push (@da , $i ); #获取含有<<>>解释项所在数组列
    if($`) {
      @sj21[$i-1] = @sj21[$i-1].$`;
      @sj21[$i] = $&.$';
    }
  }
}
## 进行标注  << k  keys  关键词;主项; c  categery  种类;形容词动词等; m  meaning 解释项; e  example 词组或例句; o  other 其他;
chomp @sj21[0];
chomp @sj21[1];
@sj21[0] = "<div><ul id=\"sj21\"><li class=\"k\">".@sj21[0]."</li>";
@sj21[1] = "<li class=\"o\">".@sj21[1]."</li>";
$len = @sj21;
for ($i=2; $i<$len; $i++) {
  chomp $sj21[$i];
  if ($sj21[$i] ~~ /<<.*>>/) {
    $sj21[$i] = "<li class=\"c\">".$sj21[$i]."</li>";
  } elsif ($sj21[$i] ~~ /( *^[0-9])|( *^[a-z]\.)/) {
    $sj21[$i] = "<li class=\"m\">".$sj21[$i]."</li>";
  } else {
    $sj21[$i] = "<li class=\"e\">".$sj21[$i]."</li>";
  }
}
foreach $sj21 (@sj21) {
  $sj21 =~ s/\n//g;        #去掉换行符等;
  $sj21 =~ s/\r//g;        #去掉换行符等;
}
push (@sj21, "</ul></div>");


# 修改朗道英汉
## 进行标注  << k  keys  关键词;主项; c  categery  种类;形容词动词等; m  meaning 解释项; e  example 词组或例句; o  other 其他;
chomp @langdao[0];
@langdao[0] = "<div><ul id=\"langdao\"><li class=\"o\">".@langdao[0]."</li>";
$len = @langdao;
for ($i=1; $i<$len; $i++) {
  chomp $langdao[$i];
  if ($langdao[$i] ~~ / *[a-z]+\./) {
    $langdao[$i] = "<li class=\"m\">".$langdao[$i]."</li>";
  } elsif ($langdao[$i] ~~ / *(相关词组)/) {
    $langdao[$i] = "<li class=\"c\">".$langdao[$i]."</li>";
  } else {
    $langdao[$i] = "<li class=\"e\">".$langdao[$i]."</li>";
  }
}
foreach $langdao (@langdao) {
  $langdao =~ s/\n//g;        #去掉换行符等;
  $langdao =~ s/\r//g;        #去掉换行符等;
}
push (@langdao, "</ul></div>");

# 修改CDICT
## 进行标注  << k  keys  关键词;主项; c  categery  种类;形容词动词等; m  meaning 解释项; e  example 词组或例句; o  other 其他;
chomp @cdict[0];
chomp @cdict[1];
@cdict[0] = "<div><ul id=\"cdict\"><li class=\"o\">".@cdict[0]."</li>";
@cdict[1] = "<li class=\"o\">".@cdict[1]."</li>";
$len = @cdict;
for ($i=2; $i<$len; $i++) {
  chomp $cdict[$i];
  if ($cdict[$i] ~~ / *^<<.*>>/) {
    $cdict[$i] = "<li class=\"c\">".$cdict[$i]."</li>";
  } elsif ($cdict[$i] ~~ /( *^[0-9])|((( *)|(\t)|(\n)|(\r))[a-z]\.)/) {
    $cdict[$i] = "<li class=\"m\">".$cdict[$i]."</li>";
  } elsif ($cdict[$i] ~~ / *^\[/) {
    $cdict[$i] = "<li class=\"o\">".$cdict[$i]."</li>";
  } else {
    $cdict[$i] = "<li class=\"e\">".$cdict[$i]."</li>";
  }
}
foreach $cdict (@cdict) {
  $cdict =~ s/\n//g;        #去掉换行符等;
  $cdict =~ s/\r//g;        #去掉换行符等;
}
push (@cdict, "</ul></div>");

# 修改niujin
## 进行标注  << k  keys  关键词;主项; c  categery  种类;形容词动词等; m  meaning 解释项; e  example 词组或例句; o  other 其他;
chomp @niujin[0];
@niujin[0] = "<div><ul id=\"niujin\"><li class=\"o\">".@niujin[0]."</li>";
$len = @niujin;
for ($i=1; $i<$len; $i++) {
  chomp $niujin[$i];
  if ($niujin[$i] ~~ / *^[a-z]+/) {
    $niujin[$i] = "<li class=\"c\">".$niujin[$i]."</li>";
  } elsif ($niujin[$i] ~~ /( *^[0-9])|( *^\([a-z]+\))/) {
    $niujin[$i] = "<li class=\"m\">".$niujin[$i]."</li>";
  } else {
    $niujin[$i] = "<li class=\"e\">".$niujin[$i]."</li>";
  }
}
foreach $niujin (@niujin) {
  $niujin =~ s/\n//g;        #去掉换行符等;
  $niujin =~ s/\r//g;        #去掉换行符等;
}
push (@niujin, "</ul></div>");

# 修改英文字根词典
## 进行标注  << k  keys  关键词;主项; c  categery  种类;形容词动词等; m  meaning 解释项; e  example 词组或例句; o  other 其他;
chomp @zigen[0];
@zigen[0] = "<div><ul id=\"zigen\"><li class=\"o\">".@zigen[0]."</li>";
$len = @zigen;
for ($i=1; $i<$len; $i++) {
  chomp $zigen[$i];
  if ($zigen[$i] ~~ / *[a-z]+\./) {
    $zigen[$i] = "<li class=\"m\">".$zigen[$i]."</li>";
  } elsif ($zigen[$i] ~~ / *(根)/) {
    $zigen[$i] = "<li class=\"m\">".$zigen[$i]."</li>";
  } else {
    $zigen[$i] = "<li class=\"e\">".$zigen[$i]."</li>";
  }
}
foreach $zigen (@zigen) {
  $zigen =~ s/\n//g;        #去掉换行符等;
  $zigen =~ s/\r//g;        #去掉换行符等;
}
push (@zigen, "</ul></div>");

# 综合所有修饰结果
@modified = ("\t",@sj21,"\t" ,@langdao,"\t" ,@niujin,"\t" ,@cdict,"\t",@zigen);
print "@modified";

如此可以对每个义项进行标记,然后分别做不同处理。(词典暂时只有"21世纪英汉汉英双向词典","朗道英汉字典5.0","牛津英汉双解美化版","CDICT5英汉辞典","英文字根字典";个人觉得够了,谁会背单词看那么多词典。。。不过可添加一本例句词典,不知大家有啥建议)

Anki的修饰

经过上面的处理,我们在家目录获得了ankifile文件,这个便可以导入Anki程序中。请注意导入时,第1列是单词,第2、3列是预留出来的读音文件,第4、5、6、7、8既是上述的词典顺序(词典是分开的)。

我这里给大家提供一个配色模板,个人觉得还不错(请原谅我无耻的借用了 欧陆词典 的配色方案)。

卡片格式刷中的代码

*,ul,li {padding: 0; margin: 0; list-style-type: none;}

.card { font-family: arial; font-size: 20px; text-align: left; color: black; background-color: #F8FBEF; line-height: 110%; }

.k { color: #FF0000; font-size: 18px; }

.o { color: #FFCC66; }

.c { color: #008000; }

.m { color: #0000FF;#0000CD; }

.b { color: #000000; }

.e { color: #9400D3 ;#8A2BE2; text-indent: 3%; list-style-positon: inside; }

正面模板为:

<div style='font-family: Arial; font-size: 22px;text-align: center;'></div><br>

背面模板为:

<div style='font-family: Arial; font-size: 20px;text-align:center;'></div>

<hr id=answer> <div style='text-align:left;font-family: Arial; font-size: 16px;color:#FF00FF;text-indent:0em'>笔记:</div>

<div style='text-align:left;font-family: Arial; font-size: 16px;text-indent:1.5em;color:#000000;'></div><br>

<div style='text-align:left;font-family: Arial; font-size: 14px;color:#FF0000;text-indent:0em;text-align: center'>21世纪英汉汉英双向词典</div><br> <div style='font-family: Arial; font-size: 16px;'></div><br>

<div style='border:1px solid #FF0000;text-align:left;font-family: Arial; font-size: 14px;color:#FF0000;text-indent:0em;text-align: center;'>朗道英汉字典</div><br> <div style='font-family: Arial; font-size: 16px;'></div><br>

<div style='border:1px solid #FF0000;text-align:left;font-family: Arial; font-size: 14px;color:#FF0000;text-indent:0em;text-align: center;'>英语字根字典</div><br> <div style='font-family: Arial; font-size: 16px;'></div><br>

<div style='border:1px solid #FF0000;text-align:left;font-family: Arial; font-size: 14px;color:#FF0000;text-indent:0em;text-align: center;'>牛津英汉双解美化版</div><br> <div style='font-family: Arial; font-size: 16px;'></div><br>

<div style='border:1px solid #FF0000;text-align:left;font-family: Arial; font-size: 14px;color:#FF0000;text-indent:0em;text-align: center'>CDICT5英汉辞典</div><br> <div style='font-family: Arial; font-size: 16px;'></div><br>

<div style='font-family: Arial; font-size: 18px;'></div><br>

<div style='font-family: Arial; font-size: 20px;'></div><br>

<div style='border:1px solid #000000;background-color:#FFFFFF;text-align:left;font-family: Arial; font-size: 15px;color:#0489B1;'>标签: </div>

总结

限于个人水平,暂时只能将美化做到这种地步。主要有一个问题就是,如果查询单词中出现了词组,那么配色中的第一二三列会出现配色方案的混乱(会代码的可以从我写的perl脚本中知道这种错误出现的原因),希望高手能够同我一起解决。

此外我还附上完整版的 dict2anki .beautify.pl 下载地址,请点击名称下载既可。.beautiful.pl放在家目录即可,其会隐藏,主要是为了不干扰家目录的文件。

]]>
使用limma包分析GEO芯片数据 2014-02-13T00:00:00+00:00 chxp http://chxp.github.io/2014/02/limma-practice

Table of Contents

总述1

limma 包是Bioconductor中分析芯片数据的一个标准包。它具有分析芯片的一整套流程(数据读入,背景矫正,芯片内归一化,芯片间归一化,差异基因删选),并且能够分析单色和双色芯片,在bioconductor中是一个比较权威的芯片分析包。似乎最近也可以用来分析基因组数据,大家可以去尝试一下。

本文结合自己分析GSE21009芯片的经验,大致概览了limma的分析流程。这篇文章为方便只分析了第三四个芯片(M2-B)。这也是我第一次使用limma包进行分析,如有不足,敬请大家批评指正!

数据的获取

对于GEO上的数据,R中有一个GEOquery包能够方便的获取NCBI上的芯片数据,同时也能够实现代码的自动化。不足的是,使用过程中出现了一些数据类型的混乱,下面会有所提及。

代码如下(包含分析所用的包):

library(GEOquery)
library(Biobase)
library(limma)        #主要用这个包分析
library(plyr)

m4.p <- getGEO('GSE21009', GSEMatrix=FALSE, destdir="./origin2/")  #如此获得是Matrix类的表达数据,默认GSEMatrix=TRUE  

如果有原始数据,getGEO()命令会自动下载。并保存在destdir中。

如果想查看下载的这个大类中各个数据的信息,可使用以下的命令:

                                        # 基本信息的获取
## 查看包含的GSM类
names(GSMList(m4.p))
## 查看包含的GPL
names(GPLList(m4.p))
## 查看GSM对应的平台
lapply(GSMList(m4.p),function(x) {Meta(x)$platform})
## 获取第一个GSM的类型及信息
class(GSMList(m4.p)[[1]])
Meta(GSMList(m4.p)[[1]])        # 获取芯片信息
## 查看GSM的列信息
Columns(GSMList(m4.p)[[1]])
## 获取ID信息
Table(GPLList(m4.p)[[1]])$ID        # 获取GPL,忽略平台信息等,直接生成一个data.frame结构

以上是针对非Matrix类的,对于获取的Matrix类可使用head(),names(),varLabels(),featureNames(),sampleNames(),phenoData及pData获取其基本信息,请使用?+函数名查询。

数据的初处理

本文从GEO获取的数据是经过一些处理的,似乎不能直接用limma的函数直接读取,因此第一步是先生成能够被limma分析的数据结构————RGList。

这是关于RGList类的介绍:

## RGList-class

### Slots/List Components:

###

### ‘RGList’ objects can be created by ‘new("RGList",RG)’ where ‘RG’

### is a list. Objects of this class contains no slots (other than

### ‘.Data’), but objects should contain the following list

### components:

### ‘R’ numeric matrix containing the red (cy5) foreground intensities. Rows correspond to spots and columns to arrays.

### ‘G’ numeric matrix containing the green (cy3) foreground intensities. Rows correspond to spots and columns to arrays.

### Optional components include

### ‘Rb’ numeric matrix containing the red (cy5) background intensities ### ‘Gb’ numeric matrix containing the green (cy3) background intensities ### ‘weights’ numeric matrix of same dimension as ‘R’ containing relative spot quality weights. Elements should be non-negative. ### ‘other’ list containing other matrices, all of the same dimensions as ‘R’ and ‘G’. ### ‘genes’ data.frame containing probe information. Should have one row for each spot. May have any number of columns. ### ‘targets’ data.frame containing information on the target RNA samples. Rows correspond to arrays. May have any number of columns. Usually includes columns ‘Cy3’ and ‘Cy5’ specifying which RNA was hybridized to each array.

### ‘printer’ list containing information on the process used to print the spots on the arrays. See PrintLayout.

### Valid ‘RGList’ objects may contain other optional components, but

### all probe or array information should be contained in the above

### components.

以下代码是将我们从GEO获取的原始数据转换成limma可以直接使用的RGList类:

### 读取数据
gs.3 <- Table(GSMList(m4.p)[[3]])
gs.4 <- Table(GSMList(m4.p)[[4]])
### 计算RGList R G Rb Gb数值
#### 原数据的修饰,方便引用
library(plyr)
colnames(gs.3) <- revalue(colnames(gs.3),c("F635 Median"="R","F532 Median"="G","F635 Median - B635"="R.b","F532 Median - B532"="G.b"))        #更改名字,以方便引用
colnames(gs.4) <- revalue(colnames(gs.4),c("F635 Median"="R","F532 Median"="G","F635 Median - B635"="R.b","F532 Median - B532"="G.b"))
#### 红绿值
or <- data.frame(myb.a=gs.3$R,myb.b=gs.4$R)        # Red
og <- data.frame(myb.a=gs.3$G,myb.b=gs.4$G)        # green
colnames(or) <- c("myb.a","myb.b")        # colnames经过上步木有预期改变,似乎要调整
colnames(og) <- c("myb.a","myb.b")        # colnames经过上步木有预期改变,似乎要调整
#### 背景值
orb <- data.frame(myb.a=gs.3$R-gs.3$R.b,myb.b=gs.4$R-gs.4$R.b)        # red background
ogb <- data.frame(myb.a=gs.3$G-gs.3$G.b,myb.b=gs.4$G-gs.4$G.b)        # green background
colnames(orb) <- c("myb.a","myb.b")
colnames(ogb) <- c("myb.a","myb.b")
#### 对GPL的修饰,主要是数据类型的改变(使用GEOquery,不知道为啥读出来的类型完全是错的)
gp.b <- Table(GPLList(m4.p)[[2]])
gp.b$ID <- as.integer(gp.b$ID)
gp.b$Block <- as.integer(gp.b$Block)
gp.b$Column <- as.integer(gp.b$Column)
gp.b$Row <- as.integer(gp.b$Row)
gp.b$Name <- as.character(gp.b$Name)
gp.b$GB_LIST <- as.character(gp.b$GB_LIST)
gp.b$SEQUENCE <- as.character(gp.b$SEQUENCE)
gp.b$LocusID <- as.character(gp.b$LocusID)
gp.b$Annotation <- as.character(gp.b$Annotation)
gp.b$SPOT_ID <- as.character(gp.b$SPOT_ID)
#### RGList中的genes值,似乎可以全部贴上去?
genes <- gp.b[,c(2,4,3,1,5)]
#### 合并成RGList类
mRG <- list(R=as.matrix(or),G=as.matrix(og),Rb=as.matrix(orb),Gb=as.matrix(ogb),genes=genes)
RG <- new("RGList",mRG)

而对于原始数据,可以直接使用readTargets(),read.maimages(), readGAL()命令生成RGList类,十分的方便。不过这样的函数只能处理图片软件读取出来的数值型的数据,不能直接读图(似乎R中就没有可以直接读图的包。。。)。

读入单通道数据,可以设定green.only = TRUE即可,然后对应读入columns = list(G = "Col1", Gb = "Col2")(这是抄袭的,自己没有实践过)。读入的数据,如果是单通道,则成为EListRaw class;如果是双通道,则是RGList class。

limma包的分析

接下来就进入重点,使用limma包分析我们的RGList类。

limma包可以查看芯片的信号情况:

### 获得输出
RG$printer <- getLayout(RG$genes)
### 绘制芯片图
pdf(file="./result/B-M2/p.image.pdf",width=6,height=6)
imageplot(log2(RG$R[,1]), RG$printer, low="white", high="red")
dev.off()

使用pdf()仅仅只是将图保存下来。

背景矫正

limma包中专门有一个函数进行背景的矫正,即backgroundCorrect()函数。

### 背景矫正
RG <- backgroundCorrect(RG, method="normexp", offset=0 ,normexp.method="saddle")        # 默认 “saddle” 亦可选择“mle”

method有“auto”,“none”,“subtract”,"half","minimum","movingmin","edwards"或者"normexp"等方法;

在method取“normexp”时,可以取"saddle","mle","rma"或者"rma75"。

有作者建议使用“mle”或者“saddle”,两个运行速度也差不多。如果数据中含有“形态背景估计(morphological background estimates)”,比如SPOT和GenePix图像处理软件,那么method = "subtract"也就较好的表现。

当使用method = "subtract",这段代码可省略,因为在组内归一化中,默认使用扣除法进行估值。

组内归一化

代码如下:

### 芯片内归一化前的MA图
pdf(file="./result/B-M2/p.be.nw.pdf",width=6,height=6)
plotPrintTipLoess(RG)
dev.off()
### 芯片内归一化
MA <- normalizeWithinArrays(RG, method="printtiploess")        # 默认"printtiploess"
### 芯片内归一化后的MA图
pdf(file="./result/B-M2/p.af.nw.pdf",width=6,height=6)
plotPrintTipLoess(MA)
dev.off()

绘制loess回归的命令为plotPrintTipLoess(),当然也可以使用plotMA();

method:"none","median","loess","printtiploess","composite","control"和"robustspline"。初始值设定为“printtiploess”,但是对于Agilent芯片或者小样本芯片(每个“点样块”少于150个探针)。可用选用的loess或者robustspline。“loess归一化方法假设了有相当大的一部分探针没有发生差异化表达,而不是上调或者下调的基因数差不多或者差异化程度围绕着0波动。”2。需要注意,组内归一化只是对单张芯片的M值进行了规整(不影响A值),但是对与组间各个通道没有进行比较。

weight:是图像处理软件对探针权重的标记,如果使用weight,那么在归一化过程中weight为0的探针不会影响其他探针,这并不意味着这些探针会被剔除,它们同样会被归一化,也会出现在归一化的结果中。如果不想使用,那么weight设为NULL。

iterations:设定loess的循环数,循环数越多,结果越强健(robust)。(暂时自己也不理解这个,都选默认)

芯片间归一化

芯片内归一化后,必须进行芯片间归一化,才能横向比较各芯片数据。

### 芯片间归一化前的箱线图
pdf(file="./result/B-M2/p.be.nb.pdf",width=6,height=6)
boxplot(MA$M~col(MA$M),names=colnames(MA$M))
dev.off()
### 芯片间归一化
MA <- normalizeBetweenArrays(MA,method = "scale")
### 芯片间归一化后的箱线图
pdf(file="./result/B-M2/p.af.nb.pdf",width=6,height=6)
boxplot(MA$M~col(MA$M),names=colnames(MA$M))
dev.off()

method:“none","scale","quantile","Aquantile","Gquantile",“Rquantile”,“Tquantile”,“cyclicloess”。

“scale”对log-ratio数值进行归一化;“quantile”对密度(intensity)进行归一化;“Aquantile”对A数值进行归一化,不调正M数值;"Gquantile"和“Rquantile”则分别对Green和Red通道进行归一化,适用于Green或者Red为“参考标准(common reference)”的样品;“Tquantile”表示样品分开归一化或者Green和Red一先一后进行归一化。

本芯片看介绍似乎应该使用Aquantile进行归一化,但箱线图显示效果不好(不知道为什么?),因此使用scale方法。

差异基因的挑选

这里得接触limma包将所有芯片分析统一的一个模型————“线性模型”。这是limma差异基因挑选的精华,Bioconductor所出的书籍《Bioinformatics and Computational Biology Solutions using R and Bioconductor》专门有一章介绍了各个模型的建立,可参考链接点这里

我们分析的这个芯片比较简单,直接使用以下办法代码即可。关于模型建立可参考上面链接或者上面的书籍。(表示本人也不是非常理解。。。就不在这里误人子弟了。。。)

## limma包寻找差异表达基因
## 实验设计
design <- c(1,1) 
## 模型拟合
fit <- lmFit(MA, design)
fit <- eBayes(fit)
## 差异基因输出
diffgene.B.M2 <- topTable(fit, adjust="fdr", sort.by="B", number=1000)

结果输出的排序可选用B、p、P等。(我使用p.value=0.05来筛选p<0.05的基因,但是不知道为啥这个参数没有生效?)

一般挑选差异基因看adj.P.Val这一列。

后续分析

后续分析,最重要的是获取gene的Locus号,这个比较简单,我使用的是merge()命令3

diffgene.B.M2 <- merge(diffgene.B.M2,gp.b)

Footnotes:

1 推荐阅读 http://blog.sina.com.cn/s/blog61f013b8010138ub.html 本文关于函数解释的,基本借鉴于此

2 limma: Linear Models for Microarray Data User’s Guide

3 参考阅读 http://manuals.bioinformatics.ucr.edu/home/RBioCondManual 该链接有更多的代码实例和后续分析实例。

]]>
只需一句话 2014-02-07T00:00:00+00:00 chxp http://chxp.github.io/2014/02/short-sentence

Table of Contents

只需一句话

想爱

  • 唯有你愿意去相信,才能得到你想相信的。对的人终究会遇上,美好的人终究会遇到,只要让自己足够美好。努力让自己独立坚强,这样才能有底气告诉我爱的人,我爱他。
  • 佛说,与你无缘的人,你与他说话再多也是废话。与你有缘的人,你的存在就能惊醒他所有的感觉
  • 我捧你的时候你是杯子,松手的时候你就特么是个玻璃碴子。——给那些不珍惜的人
  • 生命中最深的孤独,就是没有你的陪伴
  • 现在见面无语的朋友,曾经都打得火热。同理可证,现在放不下的,以后白给你都不要
  • 一个男人如果抛弃了一个视他如命的女人,那么他就会遇到一个视他如狗的女人
  • 女人错过第一个想嫁的男人,便没了挑剔的欲望。男人错过第一个想娶的女人,便有了挑剔的毛病
  • 喜不喜欢,合不合适,能不能在一起,是三件不同的事
  • 有时候,你放弃了某人,并不是因为你不再在乎,而是因为你意识到他已不在乎了。 现在才懂,原来一个人可以难过到,没有情绪,没有言语,没有表情。
  • 没有人值得你流泪,值得让你流泪的人是不会让你哭泣的
  • “爱”和“喜欢”的区别很简单,如果你爱花你会给它浇水,喜欢则会摘下它!
  • 我说不出来为什么爱你,但我知道,你就是我不爱别人的理由。
  • 安全感,是尘埃落定的安稳,是不离不弃的笃信
  • 我们喜欢的,要么错过了,要么已经有主了;喜欢我们的,总觉得缺少一种感觉。于是我们抱着追求真感情的态度,寻找爱情,可是总觉得交际面太窄,没有办法认识理想的类型;于是我们抱着宁缺毋滥的态度,自由着,孤单着……
  • 我们之间的关系有多脆弱呢,我只要关掉电脑关掉手机,可能你这辈子就再也不会联系到我了。。。
  • 男人说:这个世界上的女人有两种:让人头疼的女人和让人心疼的女人。 女人说:这个世界上的男人有两种:让人伤身的男人和让人伤心的男人
  • 不要轻易去依赖一个人,它会成为你的习惯,当分别来临,你失去的不是某个人,而是你精神的支柱。无论何时何地,都要学会独立行走,它会让你走得更坦然些~~
  • 我们都是双面人,一面沉默不语,一面聒噪到不行
  • 如果我放弃,不是因为我输了,而是因为我懂了
  • 别告诉别人你今天难受过 什么也别对别人说 因为说了也没有用
  • 曾经喜欢一个人,如今喜欢一个人
  • 你所浪费的今天,是昨天死去的人奢望的明天。你所厌恶的现在,是未来的你回不去的曾经
  • “好,是我的错,行了吧。"这句话,男孩说,代表这事完了。这句话,女孩说,代表你完了。
  • 喜欢一个人 就要努力去追 不要说什么做朋友 难道你忍心看着他和别人在一起
  • 爱,往往是百转千回后,发现原来它一直在你身边
  • 男人发信息告诉你,“我喝醉了”等于“我喜欢你”
  • 【有些东西失去了再得到的时候已经没有价值了!】有人问我,失去的东西还会回来吗?怎么说呢,嗯,还是会的吧。只是,我曾经丢过一枚扣子,等到后来找到那扣子时,我已经换了一件衣服了
  • 无论受了多少委屈,只有自己憋在心里。不是不想说,只是不知道该怎么说,能和谁说。
  • 说爱你的人不一定等得起你,但等你的人一定很爱你
  • 所谓幸福,就是一个笨蛋遇到一个傻瓜,引来无数人的羡慕和嫉妒
  • 不要气馁。虽然你胸小,但是你脸大呀。虽然你个子矮,但是你发际线高呀。虽然你的脂肪厚,但是你的钱包薄呀。虽然你的薪水少,但是你的工作多呀。虽然你的银行帐户很空,但是你的购物车很满呀。虽然你活的很差劲,但是你的情敌活的很好呀。虽然他不喜欢你,但是别人也不喜欢你呀
  • 当我买得起巧克力的时候,我已经不再天天想吃了。当我可以随便玩电脑而没人管的时候,我已经懒得打开电脑了。当我优秀地足够让你不会离我而去时,我已经不再非你莫属了。

为爱

  • 如果你给我的,和你给别人的是一样的,那我就不要了。—— 三毛
  • 我们执着什么,往往就会被什么所骗;我们执着谁,常常就会被谁所伤害。所以我们要学会放下,凡事看淡一些,不牵挂,不计较,是是非非无所谓。
  • 因为无能为力,所以顺其自然。因为心无所恃,所以随遇而安
  • 做事总三分钟热度的我,却爱了你这么久,平常总健忘丢三落四的我,却把你记那么清
  • 你是不是太容易得到我的真心,所以就一定要拿来浪费。
  • 在青春最好的年纪,你可以爱一个人,但不要等待一个人。你可以去毫无保留的爱人,就算是爱错了,摔倒了,大不了拍拍灰尘继续往前走。但千万不要停留在原地,毫无期限的等待某人。等待的往往不是爱,而是纠缠虚耗。青春拥有的就是激情,激情耗尽了,人就老了
  • 原来这就是遇到对的人的感觉
  • 有些女人,她可以要得很少,不在乎他一无所有,不在乎为了跟他在一起要克服多少的困难;但是她同时也要得很多,她要那个男人全部的真心,如果没有,宁可放弃
  • 就是现实社会吗?只要他有钱,长成什么样子也无所谓
  • 你是否有勇气喜欢一个人三年 你是否愿意等一个人三五年

恋爱

  • 不要把我的关心当成理所当然。不管我有多爱你,最终也会有疲惫的一天
  • 一个男人最大的失败就是,把逗笑自己女人的机会让给别人
  • 很多事情,我并不是不知道,不在意,只是不想斤斤计较,不想戳穿你。那么请你在骗我的同时,也请注意点分寸
  • 成熟的一面是给外人看的,幼稚的一面是给爱人看的
  • 一对老人在宁波中山广场看完“天然舞台”演出后,牵着手,扛着凳子从解放桥走回家。这一幕,有些人找了一辈子都找不到,有些人想了一辈子只是个梦想。爱,就牵他(她)的手。。。
  • 不管爱情,还是友情,终极的目的不是归宿,而是理解、默契——是要找一个可以边走边谈的人,无论什么时候,无论怎样的心情

逝爱

  • 不管是友情还是爱情,你来,我热情相拥。你走,我坦然放手
  • 病了,一个人扛;烦了,一个人藏;痛了,一个人挡;街上,一个人逛;路上,一个人想;晚上,一个人的床……慢慢地习惯了一个人的生活,变得沉默、变得冷落、没了想理、不想说、不想看……我不是高傲,也不是胡闹,是厌倦了所有的依靠
  • 因为平淡,我们的爱情有时会游离原本温馨的港湾;因为好奇,我们的行程会在某个十字路口不经意的拐弯,就在你意欲转身的刹那,你会听见身后有爱情在低声地哭泣
  • 如果有人伤害了你,请一如既往的善良美好,好好享受属于你的生活,就像没受过伤一样。终有一天那个人会后悔错过你。我想,这才是最好的回答
  • 失去了缘分的人,即使在同一个城市里也不太容易碰到
  • 我并不失落,我也没有受伤,没有生气,我只是有点累了,我厌倦了付出太多,回报太少
  • 当你知道了许多真实、虚假的东西,就没有那么多酸情了。你越来越沉默,越来越不想说
  • 时间在变,人也在变。有些事,不管我们如何努力,回不去就是回不去了
  • 我想要的爱情不是一辈子不吵架,而是吵架了还能一辈子。。。
]]>
开启jekyll博客! 2014-02-06T00:00:00+00:00 chxp http://chxp.github.io/2014/02/GET-publish 终于开启了Jekyll博客,算是赶上了潮流,希望能够更进一步!

此文使用EMACS org-mode 输出的HTML,参考文章Using org to Blog with Jekyll

]]>