ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

Rコミュの質問させて下さい

  • mixiチェック
  • このエントリーをはてなブックマークに追加
初歩的な質問にスペースを使用させて頂くのは恐縮ですが、皆さんの御意見を御教示して頂ければ幸いです。

大学院で生体医工学を専攻してるものです。Rを用いて遺伝子発現量についてのデータ解析およびデータプロットを行うつもりです。
質問というのは、データ行列から2要素を取り出して、ある関数を用いて演算し、その結果をベクトルで表示したいと考えています。
例えば、
a11, a12
a21, a22
a31, a32
という行列があったとして、そこからa11とa12を取り出して計算(例えば掛け算)をします。それを全ての組み合わせについて行い、結果を数列ベクトルとして表示したいのです。
つまり、得たい結果は、
a11*a12, a11*a22, a11*a32,....., a31*a22, a31*a32
となります。
for構文を用いて変数i,jを設定してプログラムを組んでみるのですが、どうにも思うように表示できません。

皆さんの御知恵を貸してください!

コメント(20)

とりあえず、イントロはご覧になりましたか?

http://buran.u-gakugei.ac.jp/~mori/LEARN/R/R-intro-170.jp.pdf



(以下は個人的な意見です)

Rは素晴らしい統計ソフトでしかも無料という夢のようなソフトウェアです。しかし、有料ソフトにあるような個人的なサポートを期待するのは無理だというのは分かりますよね。

少なくとも、イントロを通して読み練習して理解するくらいの努力は求められると思います(イントロ読まない、あるいは読んでも理解できない人は残念ながらRに向いていないのでは・・・)。

もう少しつっこんだ内容なら、ユーザー互助的に個別の質問に対応する意義もあると思います。この点についてコミュのルールとかを決めるのはいかがでしょう?
iserecさん
早速の御返答ありがとうございます。
iserecさんの仰るとおりで、このレベルの質問なら他のコミュメンバーに対して有用な情報がここで開示されないかもしれません。また、今後こういった初歩的な質問についてのトピが乱立するのも、見栄えの良い物でないことも理解できます。
とはいえ、私のようなR初心者がtrivialな質問をする場もあって良いのではとも思います(たとえば生命科学コミュの質問コーナーのように)。
このコミュの性格もあると思いますので、管理人様やコミュ内の人々の御意見を拝見できればと思います。

さて、イントロを読んだかといえば、読みました。また、SpringerのIntroductory Statistics with Rという文献も手元にあります(これしか図書館になかったのですが)。
データの演算に関しては、線形代数の計算(行列の四則演算、行列式の導出など)や、行列の要素を取り出してそれの加工や入替ができるのは理解できますが、質問にあるような演算を試みるとうまく繰返しが実行されません。

恥ずかしながら、今まで試したプログラムを記しておきます。
>x<-matrix(1:12, byrow=TRUE, nc=2)
>i<-c(1:6)
>j<-c(1:6)
>y<-x[i,1]*x[j,2]
2,3行目をfor文にしたりしてみましたが、結果はほとんどおなじになりました。
一般的に、「質問させて下さい」とか「初歩的な質問」とか、質問の内容が分かりにくいタイトルは良くないでしょう。掲示板に同じようなタイトルが並んでいるのを想像すれば分かると思います。

後、自分で何をやったのか、どのようなエラーが出たのかが詳しく書かれていな質問には、コメントをつけにくいです。自分のコメントが質問者にとって適切なものか判断できませんから。


で、質問についてですが、for文を使うのであれば、以下のようにしてみるとどうでしょうか。

x<-matrix(1:12, byrow=TRUE, nc=2)
y <- numeric()
k <- 1
for (i in 1:nrow(x)) {
for (j in 1:nrow(x)) {
y[k] <- x[i, 1] * x[j, 2]
k <- k+1
}
}
Rの場合、普通の掛け算 * をやるとベクトルの成分同士の掛け算になりますね。したがって4行目では6次元のベクトルの答えが出ます。

> x[i,1] * x[j,2]
[1] 2 12 30 56 90 132

変数を行列とみなして掛け算をやる場合は、'*' のかわりに '%*%' を使うって事みたいです。そこで、4行目を

> x[i,1] %*% x[j,2]
とやってみると、

[,1]
[1,] 322

と、さっきの6成分の和(つまり内積)がでます。これはつまりRが、第1項 x[i,1]を行(ヨコ)ベクトル、第2項x[j,2]を列(タテ)ベクトルと勝手に見なして行列の積を計算したってことです。eijiro さんがやりたいのは、「九九の表」みたいな全ての組み合わせの掛け算ですから、列ベクトル×行ベクトル、つまり第2項を無理やり行ベクトルにして(すなわち転置(transpose)して)行列の掛け算をしないといけません。で、

> x[i,1] %*% t(x[j,2])

[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 4 6 8 10 12
[2,] 6 12 18 24 30 36
[3,] 10 20 30 40 50 60
[4,] 14 28 42 56 70 84
[5,] 18 36 54 72 90 108
[6,] 22 44 66 88 110 132

おまけですが、
例(九九の表)
> c(1:9) %*% t(c(1:9))
あ、よく読むと、eijiroさん、掛け算じゃなくて、任意の関数でやりたいんでしたね。するとこういうのはどうでしょう?

>X <- x[i,1] %*% c(1,1,1,1,1,1)
>X
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 3 5 7 9 11
[2,] 1 3 5 7 9 11
[3,] 1 3 5 7 9 11
[4,] 1 3 5 7 9 11
[5,] 1 3 5 7 9 11
[6,] 1 3 5 7 9 11

>Y <- c(1,1,1,1,1,1) %*% x[j,2]
>Y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 2 2 2 2 2
[2,] 4 4 4 4 4 4
[3,] 6 6 6 6 6 6
[4,] 8 8 8 8 8 8
[5,] 10 10 10 10 10 10
[6,] 12 12 12 12 12 12

そんで、おもむろに2変数関数fをかける

>f(X,Y)

掛け算なら、
> X*Y
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 6 10 14 18 22
[2,] 4 12 20 28 36 44
[3,] 6 18 30 42 54 66
[4,] 8 24 40 56 72 88
[5,] 10 30 50 70 90 110
[6,] 12 36 60 84 108 132

以上、for なしで行列にこだわってみました。

初歩的な質問って、ボクはいいと思いますよ。長年使ってると、自分のやり方に凝り固まってしまうことがありますから。いろんなヒトがいろんな方法で答えを出すのはみてるだけで楽しいです。
>とおるさま
御返答ありがとうございました。
トピタイトルが不適切であった点や、質問に関する情報が十分に提供されていなかった点など、至らない点が多くすみません。
質問トピ乱立を避けるためにも、これを機に質問専用トピの設立が認められればと思います。

さて、御教示して頂いたプログラムですが、得たい結果が出力されました。変数yに関する記述を
y <- numeric()
k <- 1
y[k]] <-・・・
k <- k+1
のように表すことが全くひらめきませんでした。
どうもありがとうございました。

>ksitigarbhaさま
御返答ありがとうございました。
転置行列を使うという方法でも同じ結果を出力することができるのですね。
行列の次元が膨大になればなるほど、forなしのほうが良いとどこかで目にしたような気がしますので、2つめの方法はデータ数が多い時に有用でしょうか。
大変勉強になりました。
なるほど、みなさん優しいですね。

質問トピックはどんどん立つので、整理するのはどうでしょうか。こんなかんじで。

初心者向け
統計モデル系
グラフィックス系

しかし、やっぱりイントロくらいは読んだうえで質問する、という雰囲気は必要かと、個人的には思います。もちろんユーザーの裾野を広げるは大事だとは思いますが。



質問トピックは一方的に「助けてもらう」目的ですが、双方向で「助け合える」トピックがもっと増えればいいと思いますが、いかがでしょうか。おもしろい発見とか便利な使い方とかを提供しあえるような。たとえば、

apply系を極める

なんてトピックがあれば、かなり勉強になると思います。
>しかし、やっぱりイントロくらいは読んだうえで質問する、という雰囲気は必要かと

その雰囲気を作る方法に関して、何か案があります?
>その雰囲気を作る方法に関して、何か案があります?

そうですね、「初心者向け総合質問トピック」みたいなのを作るとして、それの冒頭に案内文を載せればいいかもしれません。

−−−−−−−−−−−−−−−−−−
質問する前に:

まずは入門ガイドを読みましょう
(・・・リンク・・・)
それでも解決できないときは、質問してみましょう
−−−−−−−−−−−−−−−−−−

こんなかんじでどうでしょう?



断片的に質問して断片的な回答を得て満足するよりも、イントロなどを通して読んで全体的な理解を得るほうが、結局は質問者にとっても有意義なんじゃないでしょうか。

もちろん、「締め切り明日で困ってます!イントロ読む時間ありません!」なんて人も出てきますが・・・。そういう場合は、Excel使うとか、統計屋を雇うとか・・・。
>こんなかんじでどうでしょう?

・毎日風呂に入りましょう。
・鼻毛の長さをチェックしましょう。

とか書いておいてもいいかもですね。
他の方が立てたトピックスに乗っかって追加質問させてください。すみません。

3でとおるさんが示された回答は、Rの初心者向け回答というより、プログラムの初心者向け回答かと思います。
4でksitigarbhaさんが示された回答は、R云々というより、線形代数の基礎ですよね。

で、わからないのが5でksitigarbhaさんが示された回答なんですが、2変数関数に行列を与えた場合のRの挙動が自分にはよく理解できません。
このへんについての解説を探してみたのですが、見つかりませんでした。なにか理解するための情報にたどり着くためのキーワードみたいなものを教えていただけたら幸いです。
>みつひー さん
問題になってるRの挙動とは、どこでしょう?
最後のf(X,Y)のところですか?それともそれ以前?

最後のところだとすると、Rでは、基本的な関数に行列を与えると、成分ごとの関数をとってできた行列を返します。したがって、2変数ある場合、答えの行列の各場所(index)で必要となるx[i,1]とx[j,2]の要素を各々X,Yという形で用意しておけば、あとは、そのまま関数に与えるだけでいいはずなんですが。
>ksitigarbhaさん
お返事ありがとうございます。
要するに、下のような性質をうまく使うことができるのだと理解しました。

> a<-matrix(1:6, nrow=2)
> a
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
> b<-matrix(3:8, nrow=2)
> b
[,1] [,2] [,3]
[1,] 3 5 7
[2,] 4 6 8
> a+b
[,1] [,2] [,3]
[1,] 4 8 12
[2,] 6 10 14
> a-b
[,1] [,2] [,3]
[1,] -2 -2 -2
[2,] -2 -2 -2
> a*b
[,1] [,2] [,3]
[1,] 3 15 35
[2,] 8 24 48

で、上の性質を使うために、XとYを5の投稿にあったように定義するというわけですね。
大変勉強になりました。重ね重ねありがとうございます。
>みつひーさん
そうですねー、2変数関数の値をマトリックスにしておいて、それをコンターとかカラーマップ表示するときなどに使える手だと思います。

ところで、実は今mixiに問い合わせてみてるんですけど、英数半角が等幅フォントになる設定とかはできないんですかねー。ズレますよね、行列書くと…
蛇足になりますが失礼します.最初のeijiroさんの問題に戻ってしまいますが,2つのベクトルの各要素のすべての組み合わせについて関数を適用する場合は,outer()を使うと便利ですよ.次のようにすれば一発です.いかがでしょうか.

> a <- matrix(1:6,ncol=2)
> a
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
> outer(a[,1],a[,2],FUN="*")
[,1] [,2] [,3]
[1,] 4 5 6
[2,] 8 10 12
[3,] 12 15 18
> かとけんさん
おお、なるほど、これは便利ですねー。マニュアルをみると FUN= のところは2項演算子だけじゃなくて、普通の2変数の関数でいいんですね。あと、ふむふむ、FUN="*" なら、

> a[1] %o% a[2]

とかでもいいんだ。勉強になりましたー。("outer product" ってベクトル積じゃなくて、こっちを指すこともあるんだってこともはじめて知りましたヨ。)

って、あっ、しまった。これでぼくが、イントロを5ページ半ぐらいしか読んでない事がバレちゃいましたねっ(^o^)/
>かとけんさん
初めてこのouterの存在を知りました。
ベクトルの外積は無論知っていましたが、これは外積の一般化した概念でしょうか?

Rどうこうと言うよりも、自分の数学的な素養の無さに愕然としています。
>みつひーさん・ksitigarbhaさん

そんなに大したことではなく,単に訳語の問題でしょうか.

「outer product」は単に列ベクトルと行ベクトルの(通常の意味での)積を表す用語のようです.私の持っている線形代数の入門書に,次のような記述がありました.

A row times a column is an "inner" product - another name for dot product. A column times a row is an "outer" product.

http://en.wikipedia.org/wiki/Outer_productにもう少し一般的な説明があります.

いわゆる「外積」は「cross product」になるのかな.直訳ならば「交差積」とでも訳せばよいのでしょうか.ややこしいですね.
外積というより直積といったほうがしっくり来る感じですが、でも結局テンソルの話になるんだと思います。いわゆるベクトル積としての外積は、直積に i×i=0, i×j= -j×i のような基底についての計算規則を付加してまとめたものだと解釈すると、前者は後者の特殊化ということになるみたいです。

http://members.jcom.home.ne.jp/1228180001/whats%20tensor2.htm

ログインすると、残り1件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

更新情報

Rのメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング