初心者のための R および RjpWiki に関する質問コーナー

過去の記事のアーカイブ



forループを回避する方法について

きむ? (2010-03-08 (月) 00:50:28)

いつも勉強させていただいてます。
毎度、基本的なことですみませんが、質問させてください。

現在、以下のような処理をしようとしています。
具体的には、dataA(45万個のデータ)のxとdataB(2000個程度のデータ)のyをidというフラグで関連づけて簡単な処理(zを求める)をしたいと考えています。
(「if(length(y)==0) y <- 0」は該当しないidがほとんどであり、この場合にnumeric(0)が帰ってくるため、このようにしてみました。)

ii <- 450000
z <- numeric(ii)
for(i in 1:ii){ 
y <- dataB[dataB$id == dataA$id[i],"y"]
if(length(y)==0) y <- 0
ifelse(y < dataA$x[i], z[i] <- 0, z[i] <- y-dataA$x[i])
}


ただ、45万回のforループを処理するため、かなり時間がかかります。
dataAをdataBの共通分(5万個程度)のみ抽出し、処理してからdataAにmergeしようかとも思いましたが、メモリ不足でmergeできませんでした。
applyファミリー等を使えば、forを内部化し、処理を高速化することが可能でしょうか?
プログラミングのテクニックについて、アドバイスいただければ助かります。
基本的な質問で申し訳けありませんが、よろしくお願いいたします。

  • 「メモリ不足でmergeできませんでした」ということですが,dataA, dataB に,計算に無関係な列が多数含まれていたりするのではないですか?また,「かなり時間がかかります」とのことですが,当方で適当なテストデータを作ってやってみても確かに時間は掛かるものの(merge してもメモリ不足にはならないし),1時間とか2時間というレベルでもないようですし,「applyファミリー等を使えば、forを内部化し、処理を高速化することが可能」というよりは,アルゴリズムを考え直す方が良いと思います。 -- 河童の屁? 2010-03-08 (月) 08:19:02
  • アドバイスありがとうございます。ご指摘のとおり、2時間程度で処理可能なのですが、オンライン処理を考えているので極力短時間で処理できないか?ということと、このような処理をいくつか行う必要があり、今後のために、このような2変数?の関数をapplyファミリーで記述する方法(例)を知っておければ、、と思って投稿させていただきました。もしよろしければ、どのような方向性があるのかヒントをいただければ助かります。 -- きむ? 2010-03-08 (月) 08:39:28
  • 当方でテストデータ(45万と2000)を作ってやってみても,プログラムの通りでは2分弱しかからないし,merge もできるんですが?ということについては,どうなんですか?余計な列は入っていないんでしょうね? -- 河童の屁? 2010-03-08 (月) 09:00:23
  • z <- sapply(1:nrow(dataA), function(i) max(dataB$y[which(dataA$id[i] == dataB$id)] - dataA$x[i], 0)) -- surg? 2010-03-08 (月) 09:26:58
  • 河童様、コメントありがとうございます。データは以下のとおりですが、家のノートパソコン(windows vista cor2duo,メモリデフォルト設定)では2時間程度かかり、mergeもできませんでした。。社のパソコン(mem-size=2500000000)で再度試してみます。
    dataAの内容(データ数450000):GLが先ほどの例のxです
    mesh.id m5  GL
    1 S035E005-21-3-3 21 100
    2 S035E005-21-3-3 22 100
    3 S035E005-21-3-3 23 100
    dataBの内容(データ数2063):FL2が先ほどの例のyです
    mesh.id      FL2
    1 S035E010-14-1-2 21.36078
    2 S035E010-14-1-4 20.57547
    3 S035E010-14-2-1 20.80305
    ちなみに、実際のプログラムです:dataAがm5GL,dataBがm25Vshです。1つのm25Vshが25個のm5GLに対応しているのでm5GLのうちの使用分は51575個です。 -- きむ? 2010-03-08 (月) 10:09:13
    kk <- length(m5GL$mesh.id)
    FL <- numeric(kk)
    for(i in 1:kk){ #5mメッシュGLと比較してメッシュ別FLを算定
    FL2 <- m25Vsh[m25Vsh$mesh.id == m5GL$mesh.id[i],"FL2"]
    if(length(FL2)==0) FL2 <- 0
    ifelse(FL2 < m5GL$GL[i], FL[i] <- 0, FL[i] <- FL2-m5GL$GL[i])
    }
  • surg様、コメントありがとうございます。今、再度同じプログラムで所要時間を計測中ですので(やはり数分というオーダーではないようです)、、終わり次第試してみます。 -- きむ? 2010-03-08 (月) 10:20:20
  • 河童様、やはり会社のパソコン(windowsXP cor2duo 3GHz)でも、上記プログラムの実行に2時間強かかってしまいました。 -- きむ? 2010-03-08 (月) 12:36:41
    ユーザ   システム       経過  
    8379.59      15.28    8453.30
  • 時間の見積もりは,最初にあなたがデータフレームの構造を示さなかったので,こちらでは id が整数のデータフレームを作って実行したんですよね。あなたのデータフレームの id は factor になっているんでしょうかね。文字列だとするとメモリも時間も強烈に消費するでしょう。逆に言えば,私のテストデータのように,事前に id を整数化しておけば,数分で終わるのかも知れませんね。
    それと,for ループの中でやることと,外でやることの区別をするとよいでしょう。ifelse はベクトル演算できるので,for の中でやるのは不経済です。以下のように書き換えるだけで25%程速くなります。 -- 河童の屁? 2010-03-08 (月) 12:41:41
    > test <- function()
    + {
    + 	z <- numeric(ii)
    + 	for(i in 1:ii){
    + 		y <- dataB[dataB$id == dataA$id[i],"y"]
    + 		if(length(y)==0) y <- 0
    + 		ifelse(y < dataA$x[i], z[i] <- 0, z[i] <- y-dataA$x[i])
    + 	}
    + 	return(z)
    + }
    > set.seed(666)
    > ii <- 450000
    > dataA <- data.frame(id=sample(ii), x=rnorm(ii))
    > num <- 2000
    > dataB <- data.frame(id=sample(ii, num), y=rnorm(num))
    > system.time(z <- test())
       ユーザ   システム       経過  
        80.553      0.488     80.596 
    > test2 <- function()
    + {
    + 	z <- numeric(ii)
    + 	for(i in 1:ii){
    + 		y <- dataB[dataB$id == dataA$id[i],"y"]
    + 		if(length(y)==0) y <- 0
    + 		z[i] <- y
    + 	}
    + 	z <- ifelse(z < dataA$x, 0, z-dataA$x) # これはループの外で
    + 	return(z)
    + }
    > system.time(z2 <- test2())
       ユーザ   システム       経過  
        62.656      0.984     63.291 
    > all.equal(z, z2)                  # 答えが同じになることを確かめよう!
    [1] TRUE
  • 河童様、ご指摘のとおりidがfactorになっていました。これが効くという認識がなかったので、データの形式を提示しなくて申し訳けありませんでした。idを整数化したところ「経過」時間ベースで53.82sと大幅に短縮することができました。ifelseの件も抜けておりました。文字列をハンドリングすると重たくなる、というのはTipsの「Rコードの最適化と実例集」にも書いていない当たり前のことだと思いますが、EXCELから移行しているので気がつきませんでした。ありがとうございました。 -- きむ? 2010-03-08 (月) 16:24:06
  • surg様、教えていただいたコードを試したところ、きちんと処理できました。(ただ、whichの中のdataAとBは入れ替えました)。 whichという関数があること、sapplyへの変数の与え方、maxの使い方等々、自分で考えつく自信はありませんがとても参考になりました。 ありがとうございました。 ただ、計算時間についてはforループのものとほとんど変わりませんでした。(idの整数化前で8402.39s、整数化後で41.84s:経過時間ベース) 上記Tipsを読み返してみるとapplyファミリーで高速化が図れるわけではないようですね。勘違いしておりました。河童様がいわれた「アルゴリズム」の問題でした。大変お騒がせしました。 -- きむ? 2010-03-08 (月) 16:34:48

ESSモード時に自動でauto-completeモードなる方法

Emacs超初心者? (2010-03-07 (日) 04:44:03)

Emacs 23 on Windowsを先日から使い始めました。
若干、ここで質問するべき事項かどうか微妙なところではございますが、他で質問する場所が見当たりませんので、質問させてください。

ESSとauto-completeを使用しているのですが、ESSモード時にいちいちM-x auto-complete-modeと打たなくてはなりません。

(global-auto-complete-mode t)

(add-hook 'ess-mode-hook
          '(lambda ()
           (auto-complete-mode)))

をしてみましたが、自動でオンになりませんでした。
ESSモード時もしくは.Rファイルを開いたら、自動でオンにするための何か良い解決方法などはございますでしょうか?

  • 上記のような設定は必須です。その上で、auto-complete.elの中にac-modesという変数があって、どのメジャーモードでauto-complete-modeを実行するか管理しているようです。なので、この中にess-modeを追加すればいいと思います。こちらはMeadow3.0開発版ですが、これで期待通りの動作をしています。たとえば、.emacsに
    (setq ess-mode-load-hook
          '((lambda ()
    	  (require 'auto-complete)
    	  (when (boundp 'ac-modes) 
    	    (setq ac-modes 
    		  (append ac-modes 
    			  (list 'ess-mode )))) 
    	  (global-auto-complete-mode t)
    	  )))
    などと書けば、auto-complete.el自体を編集しないでもOKです。-- 2010-03-08 (月) 12:03:02
  • ありがとうございます! 上記ではうまくいきませんでしたが、とても参考になりました。
    (when (boundp 'ac-modes)
      (setq ac-modes
        (append ac-modes
          (list 'ess-mode))))
    でうまくいきました。ac-modesがキーワードなんですね。ありがとうございましたm(_ _)m -- Emacs超初心者? 2010-03-08 (月) 16:27:23

PLS回帰用のNIRデータの構造

にわか? (2010-03-04 (木) 00:18:15)

winXPで2.10.1を使っています
NIRのデータでPLS回帰をしようと思っていろいろ調べているところですが、パッケージplsのサンプルデータyarnのデータ構造がよくわからないので、どなたか教えてください。
NIRのデータが波長ごとに列変数になっているように見え、表示させると列名がNIR.1 NIR.2・・・NIR.268 density trainのようになっています。
ところがnames(yarn)をしますと、
[1] "NIR" "density" "train"
で、列変数が3つしかなく、NIR.1〜NIR.268が全てNIRに代表されています。
これはどういう構造のデータフレームなのでしょうか。また、どのようにすればこういう構造のデータフレームが作れるのでしょうか。
よろしくご教示のほどお願いします。

  • 僕自身もplsを昔使ったことがあるので。データはリストの形式ですね。str(yarn)でお確かめ下さい。ただし、plsrを使う際には、formulaの指定さえちゃんとすれば、リストにする必要は特にありません -- にしな? 2010-03-04 (木) 00:38:00
  • 早速のコメント有り難うございます。 -- にわか? 2010-03-04 (木) 13:22:24
  • str(yarn)やってみました。 -- にわか? 2010-03-04 (木) 14:03:24
  • 同様の構造のデータを作るために、たとえば以下のようにしてみました。
    y <- c(1, 2, 3)
    x <- matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12), nrow=3, ncol=4)
    attr(x, "dimnames") <- list(NULL, NULL)
    ZZZ <- list(NIR=x, a=y)
    これで一応、plsr(a ~ NIR, 2, data=ZZZ・・・・) のように、NIRだけでNIR.1からNIR.4を指定することができます。ただ、このZZZをデータフレームとすることが出来ません。根本的に間違っている様な気がします・・・ NIRデータをpls回帰に使われておられる方、データの作り方をご教示いただけないでしょうか。よろしくお願いします。 -- にわか? 2010-03-04 (木) 14:03:24
  • yarn と同じ構造にしたいなら,structure(list(NIR=x, a=y), row.names=seq_len(nrow(x)), class="data.frame") でよいと思います。 -- 河童の屁? 2010-03-04 (木) 15:26:29
  • 河童の屁さん、有り難うございます。=で思っていたものができました。 -- にわか? 2010-03-05 (金) 00:18:29
  • row.names==seq_len(nrow(x)) になってましたね。== を = に修正しました。 -- 河童の屁? 2010-03-05 (金) 10:55:31

多数の分割に耐えうるカラーパレットを追加するパッケージ

cex? (2010-03-03 (水) 18:54:40)

CRANからRColorBrewer?をインストールしたのですが,色の分割数が9まででいまひとつ使い勝手が良くありませんでした.

そこで,多数(100程度)の分割に耐えうるカラーパレットを追加するようなRのパッケージはありますでしょうか?
もしご存じの方がいらっしゃれば,ご教示お願いします.

  • そもそも,100色も識別できるとは思えませんが,標準である rainbow, heat.colors, terrain.colors, topo.colors, cm.colors じゃ物足りないということですか。。。自分で作ることもできますけどね。 -- 河童の屁? 2010-03-03 (水) 19:51:35
  • ありがとうございます.やはり,自分で作るしかないのでしょうか. -- cex? 2010-03-03 (水) 21:25:09
  • 一応、gplotsと言うパッケージの中の関数にあるrich.colors, heat.colorsなどは、100くらいまでなら可能です。 -- にしな? 2010-03-04 (木) 00:10:24

CSVデータの読み込み

まるこ? (2010-03-02 (火) 20:14:55)

R初心者です。

Rのバージョンは2.10.1、OSはVISTAです。

クラスター分析がしたくて、

data <- read.table("xxx.csv", header=TRUE, sep=",")
d <- as.dist(data)
ans <- hclust(d, method="ward")
plot(ans, hang=-1)

というスクリプトを教えていただきました。
データはあらかじめ作り、「カレントディレクトリ」に入れるようにという指示でした。
「カレントディレクトリ」というのは、Rが入っているフォルダという意味でしょうか?
D\Program Files\R-2.10.1 や、その中の「bin」や「doc」に保存して上記のスクリプトを実行しましたが、エラーになりました。
エラーメッセージは、

In file(file, "rt") :
   ファイル 'rensyuu.csv' を開くことができません: No such file or directory 
> d <- as.dist(data)
 以下にエラー as.vector(x, mode) : 
  cannot coerce type 'closure' to vector of type 'any'
> ans <- hclust(d,method="ward")
 以下にエラー hclust(d, method = "ward") :  オブジェクト 'd' がありません 
> plot(ans,hang=-1)
 以下にエラー plot(ans, hang = -1) :  オブジェクト 'ans' がありません 

となります。

それで、CSVファイルの保存場所が間違っているのだと思い、1行目を

data <-read.table(file.choose(), header=TRUE, sep=",")

として、ファイルを選び、実行しました。
すると、またエラーメッセージが出ました。

 警告メッセージ: 
1: In storage.mode(m) <- "numeric" :  強制変換により NA が生成されました ~
2: In as.dist.default(data) :  正方行列ではありません ~
> ans <- hclust(d,method="ward")
 以下にエラー hclust(d, method = "ward") : 
   外部関数の呼び出し(引数 11) 中に NA/NaN/Inf があります 
> plot(ans,hang=-1)
 以下にエラー plot(ans, hang = -1) :  オブジェクト 'ans' がありません 

過去ログで、データを新しいブックに貼り付けたらNAが消えたという方がいたので
それもやってみましたが、解決しません。
CSVファイルの保存場所の件と、2番目の方法でエラーにならないためにはどうしたらいいか、どちらのことでも結構ですので、ご存じの方にアドバイスをいただきたいと思います。
よろしくお願いいたします。

  • 1番目の回答。?Rのアイコンのプロパティの作業フォルダを指定。?R実行後にファイル>ディレクトリの変更で設定?コマンドで例えばsetwd("D:/data")と入力。いづれでも実現出来ます。指定したフォルダにファイルを置いてください。 -- 森の熊五郎? 2010-03-02 (火) 23:34:32
  • ありがとうございます!?でやってみましたが、結局「開くことができません」というエラーだったので、file.choose()を使ってやっていこうと思います。NAがあることでエラーにならないためにはどうしたらいいか、まだ悪戦苦闘中です。どなたかご教示いただければ幸いです。 -- まるこ? 2010-03-03 (水) 01:48:52
  • わー!できました!行の名前(A列)に文字列があるのがいけないのかと思って削除したらできました。ありがとうございました!! -- まるこ? 2010-03-03 (水) 02:04:41
  • ここで話してる内容って見てると不安になるんだけど、できたのならいいのかな。 -- 2010-03-03 (水) 08:43:45

タイムラグ処理をしたデータを時間がズレたままCSVファイルに書き込む方法

森の熊五郎? (2010-03-01 (月) 23:54:09)

下記のプログラムを使って、修理の件数予測をしようと思っています。
手法は簡単で、過去の製品の前年度比実績推移をもとに直近のデータも
過去と同じ推移になると想定して予測をします。
2002年に出したAモデルから2007年に出したFモデルを例に作りました。修理件数は2005年から現在までのデータがCSVのファイルにあります。
Aモデルに比べFモデルは60ヶ月遅れて出しました。2002年のモデルの2005年の
修理データは出荷後3年のデータですので、2007年モデルにとっては2010年、つまり今年の状況にちかいだろうという想定をし、ラグ関数で時間をシフトし、それぞれの結果をグラフで見て検討しています。
せっかくの計算結果をcsvに落とし、みんなに見せようと思って、プログラムを作りましたが、このまま、実行するとせっかくタイムラグ関数を使ってシフトしたにもかかわらず、書き込まれたCSVにはタイムシフト前の状態で書き込まれます。当たり前といえば当たり前なのですが、タイムラグがかかったまま
CSVに書き込む方法はありますか?ご教示ください。

repair <- read.csv("Repair2005_10.csv",  header=TRUE)
N2002A <- ts(repair$X2002A, start=c(2005, 4), frequency=12)
N2003B <- ts(repair$X2003B, start=c(2005, 4), frequency=12)
N2004C <- ts(repair$X2004C, start=c(2005, 4), frequency=12)
N2005D <- ts(repair$X2005D, start=c(2005, 4), frequency=12)
N2006E <- ts(repair$X2006E, start=c(2005, 4), frequency=12)
N2007F <- ts(repair$X2007F, start=c(2005, 4), frequency=12)
R2002A <- lag(N2002A/lag(N2002A, k=-12), k=-64)
R2003B <- lag(N2003B/lag(N2003B, k=-12), k=-52)
R2004C <- lag(N2004C/lag(N2004C, k=-12), k=-40)
R2005D <- lag(N2005D/lag(N2005D, k=-12), k=-28)
R2006E <- lag(N2006E/lag(N2006E, k=-12), k=-16)
R2007F <- lag(N2007F/lag(N2007F, k=-12), k=- 4)

w7 <- rep(1, 7)/7
MDA <- filter(R2002A, filter=w7, sides=2)
MDB <- filter(R2003B, filter=w7, sides=2)
MDC <- filter(R2004C, filter=w7, sides=2)
MDD <- filter(R2005D, filter=w7, sides=2)
MDE <- filter(R2006E, filter=w7, sides=2)
MDF <- filter(R2007F, filter=w7, sides=2)
MRESULT <- data.frame(MDA, MDB, MDC, MDD, MDE, MDF)
write.csv(RESULT, "RESULT200510.csv", row.names=TRUE)
  • 余計な情報にまぎれて,あなたが何を質問したいかがよくわかりません。
    上のプログラムは,= を <- にしたり,"," の後にスペースを置いたり,プログラムとして表示されるように先頭に空白を置いたりしたものですけど,そのようなことをする前のあなたのプログラムを動かすと,
    > MRESULT=data.frame(MDA,MDB)
    > write.csv(RESULT,"RESULT200510.csv",row.names=TRUE)
     以下にエラー inherits(x, "data.frame") :  オブジェクト 'RESULT' がありません 
    となります。つまり,期待する結果が得られないといっているのは,ファイルに書き出すものが違っているだけなんじゃないですか?
    質問するには,状況を再現できる,読みやすいプログラム,なるべく単純なプログラム・データを使うというのが推奨され,そのような準備をしている段階で,自分で思い違いに気づいたり,自分でエラーを発見できたりすることもあるものですよ。
    「そんな単純な事ことじゃない」ということでしたら,以下のようなプログラムとデータフレームで,「タイムラグ関数を使ってシフトしたにもかかわらず、書き込まれたCSVにはタイムシフト前の状態で書き込まれます」というのはどこがどうなることでしょうか?私には,ちゃんと処理済みの結果が書き込まれていると思いますけど? -- 河童の屁? 2010-03-02 (火) 08:53:34
    > set.seed(666)
    > repair <- data.frame(X2002A=1:120, X2003B=1001:1120)
    > head(repair)
      X2002A X2003B
    1      1   1001
    2      2   1002
    3      3   1003
    4      4   1004
    5      5   1005
    6      6   1006
    > N2002A <- ts(repair$X2002A, start=c(2005, 4), frequency=12)
    > N2003B <- ts(repair$X2003B, start=c(2005, 4), frequency=12)
    > R2002A <- lag(N2002A/lag(N2002A, k=-12), k=-64)
    > R2003B <- lag(N2003B/lag(N2003B, k=-12), k=-52)
    > 
    > w7 <- rep(1, 7)/7
    > MDA <- filter(R2002A, filter=w7, sides=2)
    > MDB <- filter(R2003B, filter=w7, sides=2)
    > MRESULT <- data.frame(MDA, MDB)
    > head(MRESULT)
           MDA      MDB
    1       NA       NA
    2       NA       NA
    3       NA       NA
    4 5.444898 1.011952
    5 3.944898 1.011940
    6 3.278231 1.011928
  • 追記します。複数の時系列データを時間軸をあわせて統合する方法が知りたい。データの前にN/Aデータをつけて合わせるてもあろうかと思いますが、ほかの手はありませんでしょうか? -- 森の熊五郎? 2010-03-02 (火) 09:10:21
  • 河童の屁さま、おはようございます。貴殿の例ではMDAがMDBに対し、12だけ遅らせたデータですが、MRESULTになると、ともに4行目からデータが始まっています。私が求めているのはMDAが、4+12=16行目からスタートするデータセットを作りたいわけです。そうすれば、時刻軸がそろいます。 -- 森の熊五郎? 2010-03-02 (火) 09:28:58
  • MRESULT <- rbind(MRESULT[rep(1, 12),], MRESULT) とすればよいですか?他に満たすべき条件はありますか?MDB は 4+2*12 行目から始まるとか? -- 河童の屁? 2010-03-02 (火) 10:27:53
  • 河童の屁さま、ありがとうございます。ただ、data.frame文を使った時点で、時系列情報がなくなり、lag(N2002A/lag(N2002A, k=-12), k=-64)というコマンドを入れない場合と変わらない結果ができます。結果としては上の例ではTDA=c(rep(NA,64),MDA); TDB=c(rep(NA,52),MDB,rep(NA,12))としてから、data.frame(MDA, MDB)とするしかないのですが、もっと簡単に作る方法があればご教示ください。改行の仕方が分からず、見にくい文ですみません。 -- 森の熊五郎? 2010-03-02 (火) 11:47:02

ライセンスが「ファイル」形式のパッケージのインストール

きむ? (2010-02-18 (木) 19:05:21)

いつも勉強させていただいております。

モデルを用いたクラスター分析をしようとパッケージ「mclust」をCLANよりダウンロード、インストールしたのですが、library(mclust)で呼び出したときに、以下が表示されます。

by using mclust, or by using any other package that invokes mclust,
you accept the license agreement in the mclust LICENSE file
and at http://www.stat.washington.edu/mclust/license.txt

そこで、上記サイトに行って「license.txt」ファイルをダウンロードしてきたのですが、それをどのように設定したら良いのかがわかりません。
(とりあえず上記ライセンスでテストし、使えそうであれば正式な費用負担を考えています。←パッケージにも有償のものがあるのを今回初めて知りました。)

これまで、パッケージのライセンスがファイル形式のものを使用したことがなく、途方にくれています。

設定方法をご存知の方がおられましたら、教えてください。
よろしくお願いします。

  • ライセンスファイルをちゃんと読みましょう。 -- 2010-02-19 (金) 00:28:14
  • 私もやってみましたけど、2.10.1版 windows XPで同じ現象がでました。 ライセンスの問題は解決してもらって、以下からzipをダウンロードして zipファイルからインストールすると、動いてるみたいです。 http://cran.r-project.org/web/packages/mclust/index.html -- 2010-02-19 (金) 00:37:46
  • コメントありがとうございます。ただ、今回の質問は、ライセンスファイル(とその中に示されたサイトhttp://depts.washington.edu/ventures/UW_Technology/Express_Licenses/mclust.phpの説明)も読んだのですが、規約が書かれているのみで、、
    とりあえずAcademic Licensingで試用したいと思いましたが、 入手したライセンスファイルの取り扱いがわからなかったので質問させていただきました。 -- きむ? 2010-02-19 (金) 10:13:03
  • というか、上記メッセージがでていた時点で、ライセンス設定等しなくてもAcademic Licensingの状態で使えました。。あせっていたため、メッセージがでた時点でライセンス設定をしないと使えないと思い込んでいました。瑣末な質問でお騒がせしてすみませんでした。「ライセンスの問題」にはきちんと対応させていただきます。 -- きむ? 2010-02-19 (金) 10:18:59

cannot shut down device 1

くま? (2010-02-18 (木) 10:17:57)

これまで正常に起動していたRcmdr上で、dev.off()を実行すると、突然

エラー:cannot shut down device 1 (the null device)

が出るようになってしまいました。インストールしているRcmdr 1.4-10/R 2.8.1でもRcmdr 1.5-4/R 2.10.1でも同じエラーが出ます。また、再起動しても同じです。OSはWindows 7 Home Premiumです。完全にお手上げの状態です。対処方法をご教示いただけると有り難いです。

  • それはデバイスが開いている状態でシャットダウンできないということでしょうか。デバイスの開いていない状態でdev.off()すると確かにそのようなエラーが出ますね(そもそも閉じるべきデバイスがないのですから)。 -- 2010-02-18 (木) 11:55:10
  • おっしゃるとおりです。plot.new()をしてから、やれば大丈夫でした。今まではデバイスが開いていなくてもなぜかエラーになりませんでした。ところが、突然、それがエラーになったので、Windows 7のセキュリティーの問題かと考えてしまいました。ありがとうございました。 -- くま? 2010-02-18 (木) 16:08:39

hclustの要素プロット順の変更方法

ken? (2010-02-16 (火) 22:07:15)

クラスタ解析をRで実施するにはいくつかの関数があるようですが、デンドログラムのプロット後さらにrect.hclustで加工したいためhclustの利用を考えています。
hclustでデンドログラムをプロットする際に要素を列の平均の大きい順にしたいのですが、どうしてもわからないため質問させていただきます。

私が行っている操作は以下の通りです。

set.seed(567)
x <- round(matrix(rnorm(50),ncol=5),3)
d <- dist(x)
cl <- hclust(d,method="complete")
plot(cl, sub="none", main="hclust Dendrogram", hang=-1)

目的としているプロットは次の操作で得られています。
しかし、rect.hclustで加工ができないので悩んでいます。

dc <- as.dendrogram(cl)
Colv <- colMeans(x)
ddc <- reorder(dc, Colv)
plot(ddc, main="as.dendrogram Dendrogram")

何卒、アドバイスをいただけますようお願いいたします。 

一致するIDに1を入れる

ざーさい? (2010-02-15 (月) 08:43:19)

ある疾患に罹患した人のID8桁のリストがあり、罹患した人そうでない人のIDのリスト(1ID複数レコード)のうち罹患人は1をそうでない人には0を変数として割り付けたいのですが、どうすればいいでしょうか?

  • match -- 2010-02-15 (月) 09:05:34
  • とりあえず思いつくのはこんなところ
    > data <- data.frame(id = as.character(10000001:10000010))
    > id.list <- c("10000002", "10000005", "10000007")
    > data$dis <- 0
    > data$dis[data$id %in% id.list] <- 1
    > data
             id dis
    1  10000001   0
    2  10000002   1
    3  10000003   0
    4  10000004   0
    5  10000005   1
    6  10000006   0
    7  10000007   1
    8  10000008   0
    9  10000009   0
    10 10000010   0
    
    もっと簡単な方法もあるかも -- surg? 2010-02-15 (月) 15:12:51
  • matchでうまくできなかったのですが、どうもありがとうございました。 -- ザーサイ? 2010-02-15 (月) 16:14:51
  • 自己レスですが、IDのリストをpasteで整数から文字に変換しなければいけないのですね・・・とても助かりました。 -- ざーさい? 2010-02-15 (月) 16:47:55
  • match を使うなら,surg さんの提示した例の,4行目を data$dis[match(id.list, data$id)] <- 1 にすればよい。
    また,3,4 行目を data$dis <- 1-is.na(match(data$id, id.list)) にするのもあり。 --  ? 2010-02-15 (月) 17:00:42

関数"is"を見つけることができませんでした

くま? (2010-02-12 (金) 06:41:57)

RはXPで使っていましたのである程度は分かっているつもりでしたが、この度Windows 7にインスト―ルして使ったところ、aovやlmを実行すると、
関数"is"を見つけることができませんでした
というエラーメッセージが出て計算できなくなってしまいました。どうすれば、よろしいでしょうか。対策をご教示いただけるとありがたいです。
なお、操作はRcmdr上から行っており、その他の計算は支障なくできています。

  • 下の方に同じような現象についてのスレッドがあります。目次の「manovaのエラー」をクリックしてみてください。 -- 河童の屁? 2010-02-12 (金) 10:35:17
  • 難しそうなので、これまで使っていたパソコンからR-2.8.1のフォルダーごと全部コピーして使ってみたところ、いままでどおり正常計算できました。ありがとうございました。それにしてもこんな基本的アプリケーションがバージョンアップで動作しないとは? きっとすぐに修正されることを願っています。修正されたら、教えて下さい。 -- くま? 2010-02-12 (金) 16:13:15
  • windows7だったからじゃないの? -- 2010-02-12 (金) 18:05:08
  • 当方,Windows7 Ultimate, R-2.10.1,Rcdmr1.5-4で, Anova, lmともきちんと動いています(変数名が日本語でも). -- 2010-02-13 (土) 10:24:39

季節変動&週次変動の時系列データの日次分析方法について

Rは初心者? (2010-02-11 (木) 00:04:12)

修理受付の予測をするために、Rを勉強を始めました。
「Rによる時系列分析入門」を片手に悪戦苦闘の毎日です。
修理の件数は、季節変動があり、週変動もあります。
すなわち、
�修理は冬より夏に多く、
�火曜日にピークがきて週末にかけて台数が落ち込む
という傾向があります。
これは
�夏場の温度によって部品が壊れやすくなる
�お店に修理に出すのが週末で物流TATを考えると、工場にくるのが火曜日ごろになる
ということが原因です。

日毎の修理受付件数データを蓄積し、Rを使って予測までをして見ようと思っています。
月次のデータをもとに季節変動を抽出する方法、例えば、月次データをTESTDATA.csvに入れて、

REP = read.csv("TESTDATA.csv", header=TRUE)
RNUM = ts(REP$num, start=c(2008, 4), frequency=12)
bunkai = decompose(RNUM, type="multiplicative")
plot(bunkai)

として季節変動を分解する方法までは勉強しました。

これを日次データをもとに、週変動と季節変動を求める方法を検討して,悩んでいます。上記のように、ts関数は

RNUM = ts(REP$num, start=c(2008, 4), frequency=12)

のように、年・月しか入れることができず、

Start=c(2008, 1, 4)

のように年月日をいれることができない。
また日次でやると、祝日(修理職場も休みなので入荷がゼロ)となり、データ欠落が出て、かつその影響が翌日にでるような場合、それを補正する方法がわかりません。

予測まではまだまだですが、このような場合、どのように分析をしたらよいのかをアドバス頂けたらと思います。

  • 予測をしたいのですか?でしたら,重回帰分析をすればよいと思います。曜日,祝日,季節のダミー変数を使えばよいでしょう。曜日,天気,気温,特売の有無をダミー変数にしてアイスクリームの売り上げを予測する等の例が,インターネットのどこかにあると思います。 -- 河童の屁? 2010-02-11 (木) 09:35:39
  • http://sun.econ.seikei.ac.jp/~kawaji/classroom-02/dat3/dat11.html にもありますね。 -- 河童の屁? 2010-02-11 (木) 09:46:39
  • 早速のアドバイスありがとうございます。参考サイトを確認しました。商品の販売の場合、確かに販売に寄与しているパラメータとの関係を調べ、そこから販売台数を予測する手段が出来ると思います。今、頭を悩ましているのは過去出荷した製品の修理受付件数予測になります。修理受付の予測ができると、交換部品をいくつ持つべきなのかの検討が出来ます。昨今の技術革新の中、使っている部品の進歩も激しく、そのため今、製品製造に使っている部品も半年ぐらいで生産中止となり、サポート期間(製品によっても違いますが5-10年)満了まで部品を確保しなければならない責務があり、今後の修理件数をどう予測するかが、とても重要な課題となっています。保守部品の枯渇をさせるとサポートができないので、不足する場合は代替品の開発をまた明らかに余剰がある場合は、経営の面では原価償却が毎期発生しますので、業績のよいときに一気に処分して、将来の経営負担を軽減させるなどのオペレーションが必要になります。ひとつの製品のサポート終了までの修理がどのように推移するのかについて検討をしております。各社、経験と勘とでこの問題とたたかっていまし、仮にきちんと分析ができたとしてもその勘はなくならないとは思いますが、時系列分析を元にいったん評価し、経営判断をしたいと思い、Rを使い始めています。生涯のように長期の予測となると、難しいですし、事実上意味がないかと思います。(過去の実績が少なく、予測するにはデータが少なく、またデータが十分あるときは修理そのものが完了する直前のため、予測そのものをする必要がなくなる)テーマとしては来月の予測はどうなるのか、来期・来年の台数をどう読むのかというポイントにテーマを絞って検討したいと思います。過去2−3年のデータ(日毎・月毎のデータ)をもとに、来年、来月のデータを予測したいということをテーマを検討しています。説明が不足しておりましたこと、お詫び申し上げます。 -- Rは初心者? 2010-02-11 (木) 10:49:14
  • 何も,曜日,祝日と季節のデータだけから予測するなんて言っていません。製造・販売日からの時間(日数)など,予測に使える変数は何でも使えばよいでしょう。 -- 河童の屁? 2010-02-11 (木) 11:25:40
  • ものすごく重たそうな課題ですね。いくつかの課題がごっちゃになっていて、それ自体は認識されておられると思います。 まったくその分野は私は素人ですけど、一番重要と思われる保守部品の予測周りは、製品単位、年次単位でデータを集計して、 故障の経年発生分析から始めたらどうでしょうか。グラフ化すると、製品グループ単位に似た傾向が出る感じもします。 製品ロット単位の経年別修理率とか見つけられれば、それをすべて積み上げていくと、年次単位で発生見込みの修理ボリューム が見えます(平均的な修理見込み)。 部品は、ある程度荒くグループ分けして分析して傾向を出す所からはじめる位がいいかもしれません。 道のりは長いですけど、段階的に課題を見つけながら、グラフにして職場の意見をもらいながら精緻化する方が実用的と思います。 -- asap? 2010-02-11 (木) 13:21:27
  • 色々アドバイスを頂きましてありがとうございます。修理という世界は前々からある世界ですが、部品の切り替えがすさまじく早く起こる今ゆえに出てきた課題と思っています。1つだけ、再度お聞きします。tsコマンドは先に述べたように年月の初期値しか入りません。年月日を入力する関数はありますか?米国のX-12-ARIMAも勉強中です。日本銀行発行のマニュアルを読み、Rと比較しています。 -- Rは初心者? 2010-02-11 (木) 20:20:49
  • 「frequency」に1年の平均データ数(営業日数)を入れる方法が多分期待されていることに近いと思います(例えば245とかセットします)。 このページの一番下の検索ボックスで、「frequency 日次」で検索されると、もう少し詳しくわかるかもしれません。 -- asap? 2010-02-11 (木) 22:18:31
  • まあ,かなり難しい問題なんでしょうね。ある理論関数で片が付くならせわないわけで。トヨタの新型プリウスのリコール問題を例に挙げずとも,クレーム・修理の発生は,事前に予測できるものではないし,事後に予測できるようになったら,発生予測数なんか何の意味もない(つまり,全数修理とか,何%修理課かと言うことでしょう)。実地において,統計学,統計学的予測って,そんなに万能なものじゃないでしょう。選挙結果とか,QCとかは,ある意味,現実を単純化できることに成功しているモデルだということでしょう -- 河童の屁? 2010-02-11 (木) 22:46:10
  • 色々アドバイスを頂きましてありがとうございます。経験と勘だけではいけないと思い、統計手法を勉強しています。なお、累積故障率の予測にはメーカではワイブルチャートを使うのが一般的かとおもいます。 -- Rは初心者? 2010-02-12 (金) 13:01:11

一方のパラメータによって制限される最適解の求め方について

nat? (2010-02-07 (日) 02:37:21)

こんにちは。R初心者です。いつも拝見させていただいています。

ある式を最小化する2つのパラメータをoptimを使って求めようとしています。
2つのパラメータx1, x2のうち、x2はx1によって最適解の範囲が制限されるため、うまくいきません。

f <- function(par, B, u) {
        x1 <- par[1]
        x2 <- par[2]
        (x1 / B + x1 / (B - x1) ) - (x1^u + x2^u)
}

おおよそ以下のような値を代入します。

B <- 10e+5
u <- -0.7
Q <- B / 10

f を最小化し、かつx1 + x2 <= Qとなるようなx1, x2を出してきてほしいのですが、どのようにして「かつx1 + x2 <= Q」の部分を組み込めばよいのかがわかりません。
constrOptimなども試しましたが、よくわかりませんでした。

optim(fn=f, par=c(0, 1), B1=B1, u=u, lower=c(0, 0),
      upper=c(Q, Q), method="L-BFGS-B")

このやり方だと、「かつx1 + x2 <= Q」の部分が満たされない時があります。

ご教授よろしくお願いします。

  • 上のを,そのまま入力しても,動きもしないのですけど(もちろんB1をBにしたりはしましたけど)。とにかく,取りあえずはエラーは出ずに動くプログラム(初期値)を示してください。 -- 河童の屁? 2010-02-07 (日) 07:58:02
  • よくわからないが,こんなことがしたい?
    > f <- function(par, B, u) {
    + 	Q <- B / 10
    + 	x1 <- par[1]
    + 	x2 <- par[2]
    + 	if((x1 + x2) > Q) 1e+10
    + 	else (x1 / B + x1 / (B - x1)) - (x1 ^ u + x2 ^ u)
    + }
    > 
    > optim(c(1, 1), f, B = 10e+5, u = -0.7)
    $par
    [1] 1.542165e-37 1.258702e+00
    
    $value
    [1] -5.865545e+25
    
    $counts
    function gradient 
         501       NA 
    
    $convergence
    [1] 1
    
    $message
    NULL
     -- surg? 2010-02-07 (日) 08:22:17
  • 例えばこんな風にしてみると,一応収束はするみたいだけど? -- 河童の屁? 2010-02-07 (日) 08:28:40
    > f <- function(par) {
    +         x1 <- par[1]
    +         x2 <- par[2]
    +         if (x1+x2 > Q) x2 <- (Q-x1)*0.9 # 例えばこんな風にしてみる
    +         (x1 / B + x1 / (B - x1) ) - (x1^u + x2^u)
    + }
    > B <- 10
    > u <- 0.7
    > Q <- B / 10
    > optim(c(0,1), f)
    $par
    [1] 0.3143118 0.6856882
    
    $value
    [1] -1.148777
    
    $counts
    function gradient 
         113       NA 
    
    $convergence
    [1] 0
    
    $message
    NULL
  • 失礼ながら surg さんの実行例は収束していない -- 河童の屁? 2010-02-07 (日) 08:34:21
  • 「こんなことがしたい?」にその意味を込めたつもりでした.収束する初期値等をわざわざ調べる気はないので.失礼ながら河童の屁さんの例も,質問通りの u <- -0.7 では収束しませんよね. -- surg? 2010-02-07 (日) 08:45:32
  • 「質問通りの u <- -0.7 では収束しませんよね」
    そうなんですよ。元のままだと par の初期値 c(0,1) で f の戻り値がいきなり -Inf になってしまうんですもの。 -- 河童の屁? 2010-02-07 (日) 09:07:49
  • 迅速な返答ありがとうございます。
    自分なりに簡略化して最初に投稿したのですが、収束するかを確認せず投稿してしまい申し訳ありません。

    河童の屁さん、surgさんの最適解の求め方だと、x1+ x2 >Qとなることもあり得ることを前提としてx1, x2を求めてきて、その結果、x1+x2 > Q だった場合、x2 <- (Q - x1) とする。ということですよね?

    私が求めたいのは、x1 + x2 > Q となることが無いことを前提としてx1, x2 を求めたいのです。-- nat? 2010-02-07 (日) 10:48:10
  • > 私が求めたいのは、x1 + x2 > Q となることが無いことを前提としてx1, x2 を求めたいのです
    だから,x1 + x2 <= Q になるように,制約条件を付けたんですけどね。なんせ,その効果を検証できない。
    > 自分なりに簡略化して最初に投稿したのですが
    簡略化したんですか?簡略化したつもりで,問題が変わってしまったんじゃないのですか?与えられた最小化すべき計算式と初期値がちょっと変ではないかと思うんですよ。-- 河童の屁? 2010-02-07 (日) 11:38:50
  • > 河童の屁さん、surgさんの最適解の求め方だと、x1+ x2 >Qとなることもあり得ることを前提としてx1, x2を求めてきて、その結果、x1+x2 > Q だった場合、x2 <- (Q - x1) とする。ということですよね?
    私のは違いますよ.x1 + x2 > Q の場合は最適解に決してならないように,十分大きな値を返すようにしています. -- surg? 2010-02-07 (日) 12:21:59
  • 河童の屁さんのようにifで条件をつけてやってみました。
    ifで条件をつけなかった場合と比べると、x1+x2 > Qとならないようにx1, x2をだしてくるようになりました。
    その解も検証してみたら尤もらしいので、この方法でやってみようと思います。
    今後例を出す時は計算できるかをきちんと確認した上で投稿するよう気をつけます。
    大変助かりました。河童の屁さん、surgさん、ありがとうございました。-- nat? 2010-02-08 (月) 00:09:49

Rでの重要度判定について

syo? (2010-02-06 (土) 17:11:34)

Rにてテキストマイニングの勉強をしている初心者なのですが、Rで語に対するTF-IDF判定や重要度判定を行いたいと考えています。Rでそのような事を行うためには、どのようなツールが最適でしょうか?初歩的な質問ですが、ご助言お願い致します。

  • > Rで語に対するTF-IDF判定や重要度判定を行いたい
    なぜ,コメントが付かないのでしょうかねえ。質問が曖昧だからかなあ。「特にツールなんか使わなくても,自分でプログラムを書けばできるでしょう」という事なのかもしれませんね。 -- 河童の屁? 2010-02-07 (日) 20:31:54
  • RMeCab?とかKH Coderなんかはいかがでしょう。 -- 2010-03-03 (水) 19:07:36

install.packageができません

yoou? (2010-02-05 (金) 01:15:42)

Rで学ぶデータマイニングで、自宅のvistaを使い勉強してるのですが、 install.packages("relimp")でJapan(Tokyo)を選ぶと以下のエラーメッセージが出ます。

--- Please select a CRAN mirror for use in this session ---
警告:unable to access index for repository ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/windows/contrib/2.4
download.packages(pkgs, destdir = tmpd, available = available,  中で警告がありました:
no package 'relimp' at the repositories

どうしたら解決できるでしょうか。

  • なぜにして contrib/2.4 なんでしょう?インストールしている R が,バージョン 2.4?それと,今現在は,u-tokyo はなんだかトラブル中のような。aizu を試してみたら? -- 河童の屁? 2010-02-05 (金) 11:15:46
  • Rは2.4.1です。aizuでもエラーがでたので、hyogoにしたら無事インストールすることができました。ありがとうございます。 -- yoou? 2010-02-05 (金) 13:17:10

rgdal.soエラー Error in dyn.load

mittyo? (2010-02-03 (水) 09:48:44)

はじめて投稿します。
RでGRASSのデータを使いたくて、spgrass6をインストールしようとしましたが、うまくいきませんでした。

エラーは以下の通りです。

Error in dyn.load(file, DLLpath = DLLpath, ...) :
共有ライブラリ '/root/R/i686-pc-linux-gnu-library/2.10/rgdal/libs/rgdal.so' を読み込めません
/root/R/i686-pc-linux-gnu-library/2.10/rgdal/libs/rgdal.so: undefined symbol: pj_get_ellps_ref
Error : package 'rgdal' could not be loaded
ERROR: lazy loading failed for package ‘spgrass6’

rgdal.soに問題がありそうなので、Rでlibrary("rgdal")を実行したところ、

> library("rgdal")
要求されたパッケージ sp をロード中です
Error in dyn.load(file, DLLpath = DLLpath, ...) :
  共有ライブラリ '/root/R/i686-pc-linux-gnu-library/2.10/rgdal/libs/rgdal.so' を読み込めません
/root/R/i686-pc-linux-gnu-library/2.10/rgdal/libs/rgdal.so: undefined symbol: pj_get_ellps_ref
エラー:  'rgdal' に対するパッケージもしくは名前空間のロードが失敗しました
> Error in dyn.loadError in dyn.load

と同様のエラーが出ました。

rgdalを入れなおそうと思い、

install.packages("rgdal", dependencies=TRUE)

を実行し、再度

library(rgdal)、install.packages("spgrass6", dependencies=TRUE)

を実行しましたが、同様の結果でした。

環境ですが、

OS:Vine Linux 5.0
R:version 2.10.0 (2009-10-26)

です。

ご教示のほどよろしくお願い致します。

  • 追記です。最新のR-devel_2010-02-01.tar.gzを再度インストールし、やり直しましたが、やはり同じようなエラーが出ました。 -- mittyo? 2010-02-03 (水) 11:41:29
  • おぉVineな人。rgdalのインストールは本当に成功していますか?gdalのバージョンは? -- 2010-02-03 (水) 12:52:17
  • gdalのバージョンは1.6.2 です。 -- mittyo? 2010-02-03 (水) 14:45:34
  • gdalを1.6.3に変更しなおして、もう一度Rをインストールしてみましたが、同様の結果でした。 -- mittyo? 2010-02-04 (木) 02:58:50
  • すみません、ご指摘の通りrgdalのインストールがうまくいってないみたいです。以下、install.packages("rgdal")を実行した結果です。
    * Installing *source* package ‘rgdal’ ...
    gdal-config: gdal-config
    checking for gcc... gcc -std=gnu99
    checking for C compiler default output file name... a.out
          :
        SNIP 
          :
    ** building package indices ...
    * DONE (rgdal)
    
     ダウンロードされたパッケージは、以下にあります 
     	‘/tmp/RtmpvHL96d/downloaded_packages’ 
     '.Library' 中のパッケージの HTML 索引を更新します 
    > library("rgdal")
     要求されたパッケージ sp をロード中です 
    Error in dyn.load(file, DLLpath = DLLpath, ...) : 
       共有ライブラリ '/usr/local/lib/R/library/rgdal/libs/rgdal.so' を読み込めません 
      /usr/local/lib/R/library/rgdal/libs/rgdal.so: undefined symbol: pj_get_ellps_ref 
     エラー:  'rgdal' に対するパッケージもしくは名前空間のロードが失敗しました

Note: proj/conus not foundの部分が気になるのですが… -- mittyo? 2010-02-04 (木) 03:05:50

  • proj.4が入っていないとか。とりあえずRから離れて、gdalとproj.4がちゃんと使えるかどうか確認してみては? -- 2010-02-05 (金) 15:33:37
  • そもそも /usr/local/lib/R/library/rgdal/libs/rgdal.so がありますか?ないのでしょう。 -- 河童の屁? 2010-02-05 (金) 23:09:47
  • すみません、rgdal.soはあったのですが、gdalとproj.4のインストールの後に、/sbin/ldconfigによるpathの追加を行っていませんでした。お手数をおかけして申し訳ありませんでした。 -- mittyo? 2010-02-15 (月) 14:17:12

指定した要素の度数を表示する

sui? (2010-01-30 (土) 10:00:23)

いつもお世話になり、ありがとうございます。
下記につきまして長くなりますが、ご教示の程、よろしくお願いいたします。

HT <- rep(0:1, c(10, 20))
cHT <- factor(HT, levels=0:1)
group <- c("A","B","A","B","A","B","A","B","A","B","A",
            "B","A","B","A","B","A","B","A","B","A","B",
            "A","B","A","B","A","B","A","B")
df <- data.frame(HT, cHT, group)

上記のようなデータフレームを仮定します。(HT=1は高血圧あり、HT=0はなし)
列の要素が整数の場合(列:HT)は目的とするgroup毎の高血圧ありの度数とカイ2乗検定のP値を得ることが出来ました。

> for(i in 1) { # 解析する列の入力
df <- df        # データフレーム名の入力
g<-group        # group の所にグループ変数の列名
cat(names(df)[i],
    by(df[, i], g, sum),
    (chisq.test(table(factor(df[, i], levels=0:1), df$g)))$p.value)
}
HT 10 10 0.6985354 # group 毎の高血圧ありの度数とカイ2乗検定の P 値

最終の目標は class() 関数で列の要素を判別して if を用い、列の要素が連続変数の時は平均値と t 検定の P 値を、カテゴリカルデータであれば上記のように group 毎の高血圧ありの度数とカイ2乗検定の P 値を出力する事です。そこで初めからカテゴリカルデータに変換された cHT を用いて同様の出力を得たいと考えました。しかし、カテゴリカルデータに変換した cHT なら by(df$cHT, group, summary) とすれば HT ありの人数は分かりますが同時になしの人数まで出力されてしまいます。
カテゴリカルデータを用いて上記のように group 毎の高血圧ありのみの度数とカイ2乗検定の P 値(例数が少ないので fisher.test の方が良いかもしれませんが)を出力する方法があればご教示頂きたいと思います。よろしくお願いいたします。(R version 2.8.1)

  • 既存の function を使うのも手でしょう.
    require(Hmisc)
    summary( group ~ HT + cHT, data=df, method='reverse', test=T)
    デフォルトで continuity correction 無しの カイ2乗検定をします.連続値の場合は平均値+偏差とか,中央値と quartiles とかいろいろ設定を選べます.
    フィッシャーにも変えられますが,ややめんどくさかった記憶があります.ネットで例を見つけるのが手っ取り早いでしょう.ヘルプは ?summary.formula です.-- 御曹司? 2010-01-30 (土) 11:22:32
  • 御曹司さん、ありがとうございます。これも確かに便利な関数ですね。if+この関数でも出力できるかもしれません。ヘルプを読んでみます。他に、cHTの 1 のみを指定して度数を表示する方法がお分かりになる方がいればよろしくお願いいたします。 -- sui? 2010-01-30 (土) 16:36:53
  • for ループの中で妙なことをやっていたりして,やりたいことがはっきりしないですね。
    まず,0/1 データが integer でも factor でも,group 別に 1 である度数を知りたいということですか?
    table 関数を使って,2行目を取り出すというのが簡単でよいと思います(長さ2のベクトルが結果になります)
    > table(HT, group)[2,]
     A  B 
    10 10 
    > table(cHT, group)[2,]
     A  B 
    10 10
    次は,データによって検定法を選択して実行することですね。「連続変数なら t 検定」,「カテゴリー変数ならカイ二乗検定」の2通りでよいのですね。カテゴリー変数は必ず factor になっていると仮定できる。つまり,HT のように整数値で表されているカテゴリー変数は考えなくて良いのですね。上に続けて,以下の通り。
    > df$x <- rnorm(30)
    > head(df)
      HT cHT group           x
    1  0   0     A -0.64007308
    2  0   0     B  0.34494342
    3  0   0     A -0.59577331
    4  0   0     B  0.05745206
    5  0   0     A -1.02755942
    6  0   0     B  0.41386607
    > for (i in c(2, 4)) {
    + 	x <- df[, i]
    + 	if (class(x) == "factor") {
    + 		tbl <- table(x, group)
    + 		cat(colnames(df)[i], tbl[2,], chisq.test(tbl)$p.value, "\n")
    + 	} else if (class(x) == "numeric") {
    + 		cat(t.test(x ~ group)$p.value, "\n")
    + 	} else {
    + 		stop("error")
    + 	}
    + }
    cHT 10 10 0.6985354 
    0.3210783 
    こんなもんでしょうかね。 -- 河童の屁? 2010-01-30 (土) 19:32:01
  • 上の御曹司さんの解は,あなたの求めているものと違うと思いますよ。 -- 河童の屁? 2010-01-30 (土) 19:59:55
  • tableの2行目を取り出すと言うのが、最も知りたかった所です。うまく表現できなくてすみませんでした。table関数で作ったtableもデータフレーム同様に行、列の指定が出来ると言うことですね。考えが至りませんでした。河童の屁さん、度々ありがとうございます。 -- sui? 2010-01-31 (日) 08:58:44

リピータ状況把握の方法

森の熊太郎? (2010-01-28 (木) 15:22:19)

現在、コールセンタの利用者のリピータ状況を調べたいと思っています。
一人ひとりにユニークな番号(会員番号:重複なし)をつけています。
月に何万件と問い合わせがきます。問い合わせのたびにログを1件づつ残しており、そのデータが蓄積されています。ただ件数が多いので、Excelでは1月分を1区切りでファイルを作り管理しています。
それらのファイルをもとに、例えば

 1月  2月  3月  4月
X0011   X23243  X3454  X46738
X0023   X43534  X3456  X78987

のように横に月、たてにログ毎の会員番号を記載した表を作り、ここから、リピータの登場の程度を調べたいと思います。

    コール数  ユーザ数  累計コール数  累計ユーザー数
 1月  23456      19876        23456            19876
  2月  25677      20343        49133            34020

のように累計ユーザ数を調べたい。
つまり、ユーザは同月内でも複数回コールをし、また翌月もコールをする傾向があり、コールセンタとして、ユーザの局在性がどれだけあるのかを調べたいと思います。
Excel2007があれば、ピボットテーブルで簡単に出来るかと思いますが、Rでもこのようなことは出来ますか?(Excel2007は業務用になく、結果としては出来ずにおり、困っております)

  • おおもとのデータのファイル構造はどうなってるんでしょうか?集計用関数色々ありますよ。xtabs,table,reshape,reshapeパッケージのcast&Meltなど。Excelのピボットテーブル似ならreshapeパッケージのcast&Meltです。 -- 2010-01-29 (金) 17:58:45

2群の比較を繰り返し行う

sui? (2010-01-22 (金) 20:37:37)

初めて投稿いたします。Rは始めたばかりで初歩的な質問かもしれませんがよろしくお願いします。(R version 2.8.1)

a <- c(1:10)
b <- c(11:20)
c <- c(21:30)
d <- c(31:40)
group <- c("X", "X", "X", "X", "X", "Y", "Y", "Y", "Y", "Y")
df <- data.frame(a, b, c, d, group)

以上のようなデータフレームを仮定します。 グループXとY間でパラメータ a, b, c, d の平均値に差があるかどうかを検定する場合(上のデータの分布は正規分布ではありませんが)、t.test(a ~ group)、t.test(b ~ group)、t.test(c ~ group)と順番に関数を実行していけば結果は得られます。しかし、実際のデータではパラメーターが50程度あるため一括して結果を得たいと考えています。どのような関数(apply family? ←変数が2つでも使用できるのでしょうか)もしくはプログラム(forを用いたプログラム?)を用いればいいのでしょうか?ご教示いただければ幸いです。

  • sapply(df[,1:4], function(z) t.test(z~df$group)) というのが一つの解でしょう。ただ,いくつかの結果はこれでは明示的に表示できないですから(sapply(df[,1:4], function(z) print(t.test(z~df$group))) にすればよいだろうというのはおいておくとして),以下のように for 文を使うのがよいかと。
    for 文を使うのは R らしくないとか,その他なんとかかんとかは R らしくないとか,こうする方が効率がよいとかいうのは無視して,やりたいことを素直にやればよいです。
    推奨されるようやらなかったからといって,実行時間が何年もかかるなんてことになってしまうことは,そんなにありません。(時間が掛かりすぎるなあと思ったら,そのときにはじめて改善策を考えれば良いだけです)
    以下のようにやるとできますが,どの変数に対する解かを表示するとかは,必要に応じて表示すれば良いだけのことです -- 河童の屁? 2010-01-22 (金) 21:17:31
    > for (i in 1:4) print(t.test(df[,i]~df$group))
    
    	Welch Two Sample t-test
    
    data:  df[, i] by df$group 
    t = -5, df = 8, p-value = 0.001053
    alternative hypothesis: true difference in means is not equal to 0 
    95 percent confidence interval:
     -7.306004 -2.693996 
    sample estimates:
    mean in group X mean in group Y 
                  3               8 
    以下略
  • 早速の回答ありがとうございました。for文を用いた例の方が直感的に理解しやすいように思いました。また、最終的には目的の結果のみをファイルに書き出そうと考えているのですが、for文を使った例を工夫すれば何とかなるのかなと思いました。がんばります。 -- sui? 2010-01-22 (金) 23:02:10
  • for文を使った結果に「必要に応じて変数名を表示する」とありますが、どのようにすればよいのでしょうか?たびたび申し訳ありませんがよろしくお願いいたします。 -- sui? 2010-01-22 (金) 23:05:06
  • 以下のように for (...) { } の { } の中には,何でも書けるじゃないですか。ということですよ。 -- 河童の屁? 2010-01-22 (金) 23:10:54
    for (i in 1:4) {
    	cat("=================\n")
    	cat("variable:", names(df)[i], "\n")
    	print(t.test(df[,i]~df$group))
    }
  • 河童の屁さん、本当にありがとうございました。 -- sui? 2010-01-22 (金) 23:23:55

分散を指定して標本を抽出する。

T-A? (2010-01-22 (金) 00:29:41)

何度もすみません。
先ほど正規乱数を母集団として標本を抽出してその平均値を出すこと何回も繰り返すコマンドを質問したものです。
母集団とその標本平均の集団の分散が等しいものがほしいのですが、どうすればよいでしょうか・・・
x <- rnorm(100)
y <- (x-mean(x))/sd(x)
w <- 5*y+50
のようにして分散が25、平均50のデータを作って
そこから標本平均の集団も分散が25に近似するように抽出することは可能なのでしょうか。
replicate(200, mean(sample(w, 10)))
のようにして母集団から標本を抽出して平均値を求めることを200回繰りかえして、そこから分散が25に近似するように100個抽出することは可能でしょうか。
よろしければご教授ください。

  • 無理やり分散を25にしちゃいけませんか? -- 王監督? &new{2010-01-22 (金) 01:13:36}
    w <- rnorm(200, 50,sd=5)
    h <- replicate( 5, sample(w,10, replace=F) )
    hh <- t(t(h)/apply(h,2,sd)*sd(w))
  • 25近似よりも25の方がいいです。言葉足らずですみません・・・。 -- T? 2010-01-22 (金) 02:05:23
  • 途中でコメント入れてしまいました。王監督さんありがとうございます。あとすみません。何度も標本を取り出して平均値を求めて、その標本平均値の集団の分散が母集団と一致してほしいんですが、h <- replicate( 5, mean(sample(w,10, replace=F)) )のようにすればいいんでしょうか?「hh <- ・・・」の行を入力すると 「以下にエラー apply(h, 2, sd) : dim(X) は正の長さを持たねばなりません」というエラーが出てしまうんですが・・・。 -- T-A? 2010-01-22 (金) 02:12:55
  • そのようなエラーは出ませんが...「その標本平均値の集団の分散が母集団と一致してほしい」よく判りません.標本平均の分散が母集団の分散と同じということは,中央極限定理が当てはまらない場合を作りたいということでしょうか? rcauchy ですか? -- 王監督さん? 2010-01-22 (金) 10:39:34
  • やりたいことがはっきりわからないですね。
    > 分散が25、平均50のデータを作ってそこから標本平均の集団も分散が25に近似するように抽出
    「標本平均の集団の分散」というのは「標本平均の標準誤差の二乗」ということですね?
    N(50, 5^2) から n 個の標本を抽出する場合,標本誤差は 5/sqrt(n) になるので,母分散が25のとき標準誤差の二乗も25になることは絶対にあり得ません。
    あなたがどういうことをやりたいのか,ちゃんと記述できていないのではないかと思います。 -- 河童の屁? 2010-01-22 (金) 11:12:41
  • 言われて気づきました・・・。そうでした。統計学の未熟者ですみません。他の方法考えて解決しましたので大丈夫になりました。王監督さん、河童の屁さん、返答していただいて本当に感謝です。ありがとうございました。 -- T-A? 2010-01-22 (金) 14:50:54

Rserveのアソシエーション分析でエラー

Mame? (2010-01-21 (木) 16:57:38)

たびたびすみません。
下でRserveについて質問したものです。
(まだ解決に至っておりませんが、できましたら報告します)

パッケージのarulesを利用して、アソシエーション分析をしたいのですが、リスト形式のデータをトランザクション形式に使用するとエラー(voidEval failed)が出てしまいます。

参考にしているのは、金明哲先生の
http://www1.doshisha.ac.jp/~mjin/R/200611_40.pdf
です。

書いたコードは、

Rconnection c=new Rconnection((args.length>0)?args[0]:"127.0.0.1");
c.voidEval( "library(arules)" );

 //データを作ります
RList l = new RList();
l.add(  new REXP( new String[] {"パン","牛乳","ハム","果物"} ) );
l.add(  new REXP( new String[] {"ソーセージ","ビール","オムツ"} ) );
l.add(  new REXP( new String[] { "弁当","ビール","オムツ","タバコ"} ) );
l.add(  new REXP( new String[] {"弁当","ビール","オレンジジュース","果物"} ) );

 //リストの作り方がよくわからなかったので
 //データフレームにしてらかリストに変換しました
 //下記ではエラーが出ました。
 //String m = "data1 <-list(c(\"パン\",\"牛乳\",\"ハム\",\"果物\"),"+
			"c(\"パン\",\"オムツ\",\"ビール\",\"ハム\"),"+
			"c(\"ソーセージ\",\"ビール\",\"オムツ\"),"+
			"c(\"弁当\",\"ビール\",\"オムツ\",\"タバコ\"),"+
			"c(\"弁当\",\"ビール\",\"オレンジジュース\",\"果物\"))";
 //c.voidEval( m );

c.assign( "data1", REXP.createDataFrame(l));
c.voidEval( "data1 <- list(data1)");

 //REXP x = c.eval( "class(data1)" );
 //System.out.println( x ); <= listとでます。

 //この下でエラー(voidEval failed)になります。
c.voidEval( "data.tran <- as(data1,\"transactions\")");

以上です。

よろしければご教授のほどよろしくお願いいたします。

RでPrefixSpan?

松田紀之? (2010-01-21 (木) 14:59:28)

PrefixSpan?をRで組み始めたのですが,うまく再帰的に書けずにいます.パッケージにもなさそうです.どなたかRで動かせる実用的なプログラムをご存知でしたら教えてください.

スペースの数による文字列の取り出しについて

aoi? (2010-01-21 (木) 11:47:48)

たびたびすみません。よろしくお願いします。
条件に一致する文字列を取り出したいと思っています。

例えば

> exex_2
     [,1]                                                                                           
[1,] "a b dxe"                                                                                      
[2,] "abcde"                                                                                        
[3,] "a1v2 c4"                                                                                      
[4,] "a1 b2 c3"                                                                                     
[5,] "banana ringo kiwi orange kodama" 

のような文字列の行列があったときに、スペース区切りで一番はじめの要素だけを取り出す、2番目だけの要素を取り出す、3番目の要素だけを取り出すということを行いたいと思っています。
一番はじめの要素を取り出すのは

> sub(" .*","",exex_2)
     [,1]                 
[1,] "a"                  
[2,] "abcde"              
[3,] "a1v2"               
[4,] "a1"                 
[5,] "banana"  

で出来たのですが、2番目、3番目の要素を取り出すことが出来ません。
目標としては2番目の要素でしたら

[,1]                 
[1,] "b"                  
[2,]               
[3,] "c4"               
[4,] "b2"                 
[5,] "ringo"

3番目の要素でしたら

 [,1]                 
 [1,] "dxe"                  
 [2,]               
 [3,]                
 [4,] "c3"                 
 [5,] "kiwi"

のように取り出せたら、と考えています。
Rの正規表現やHelpを読ませていただいたりしてしばらく考えたのですがうまく出来なかったので、すみませんがご教授いただければと思います。

また

sessionInfo()~
R version 2.8.1 (2008-12-22) 
i386-apple-darwin8.11.1


です。よろしくおねがいします。

  • strsplit() -- 2010-01-21 (木) 11:55:36
  • 該当要素がないときに NA となるけど,以下のようなものでどう? 最後の引数が,何番目の要素を取り出すかを示す。 -- 河童の屁? 2010-01-21 (木) 12:04:42
    > sapply(strsplit(exex_2, " "), "[", 1)
    [1] "a"      "abcde"  "a1v2"   "a1"     "banana" "5"     
    > sapply(strsplit(exex_2, " "), "[", 2)
    [1] "b"     NA      "c4"    "b2"    "ringo" NA     
    > sapply(strsplit(exex_2, " "), "[", 3)
    [1] "dxe"  NA     NA     "c3"   "kiwi" NA    
    > sapply(strsplit(exex_2, " "), "[", 4)
    [1] NA       NA       NA       NA       "orange" NA      
    > sapply(strsplit(exex_2, " "), "[", 5)
    [1] NA       NA       NA       NA       "kodama" NA      
    > sapply(strsplit(exex_2, " "), "[", 6)
    [1] NA NA NA NA NA NA
  • NAで大丈夫です。ありがとうございます! -- aoi? 2010-01-21 (木) 12:11:02

RServeを使ったグラフの生成

Mame? (2010-01-21 (木) 10:09:14)

はじめて投稿させていただきます。
R、RServeともに初心者ですがよろしくお願いします。

現在、RServeをつかってグラフの画像を生成したいのですが、うまくいきません。
・RServeのjava-oldの中のexsample を参考にしています。
・plot は、画像が生成され中にプロットがされていました。
・histogram は、画像そのものは生成されるのですが、白の背景だけでヒストグラムは表示されませんでした。
・Rのコマンドラインからは、histogramで画像を生成することができます。

■環境
R version 2.10.1
Rserve version 0.6.1
Eclipse version 3.5.1
OS:Windows7(windows2000でも同じ結果でした)

ご教授のほど、よろしくお願いいたします。

■以下ソースコード

import org.rosuda.JRclient.*;

public class HelloWorld {
    public static void main(String args[]) {
        try {
            Rconnection c=new Rconnection((args.length>0)?args[0]:"127.0.0.1");
            //histogramを使うために読み込みます
            c.voidEval( "library(lattice)" );
            c.voidEval("x <- iris");
            REXP xp=c.eval("try(jpeg(\"test.jpg\"))");
            if (xp.asString()!=null) { 
                System.out.println("Can't open jpeg graphics device:\n"+xp.asString());                
                REXP w=c.eval("if (exists(\"last.warning\") && length(last.warning)>0) names(last.warning)[1] else 0");
                if (w.asString()!=null) System.out.println(w.asString());
                return;
            }

            //下のplot は描画できます。
            //c.voidEval("plot(Sepal.Length, Petal.Length, data=x,col=unclass(Species))");
            
            //背景が白い画像だけが出来上がります。
            c.voidEval( "histogram(~ Sepal.Length, data=x)" );

            c.voidEval("dev.off()");
            c.close();
        } catch(RSrvException rse) {
            System.out.println("Rserve exception: "+rse.getMessage());
        } catch(Exception e) {
            System.out.println("Something went wrong, but it's not the Rserve: "+
                               e.getMessage());
            e.printStackTrace();
        }
    }
}

正規乱数の母集団から標本を取り出し標本平均を求めることを繰り返すコマンド

T-A? (2010-01-21 (木) 01:49:07)

R初心者の者です。
あまりの初心者でコマンドのし方がわからないのでよろしければご教授ください。

正規乱数100個を母集団として作り、大きさ10の標本を非復元抽出で取り出し、その標本平均を求めることを100回繰り返すコマンドをするにはどうすればよいでしょうか?

x <- rnorm(100)
y <- sample(x,10)
mean(y)
ここまではたどり着けたんですが、次に進めず困っています。
こんな感じでmean(y)を100個ほしいんですが・・・

  • sapply(1:100, function(t) mean(sample(x, 10))) -- surg? 2010-01-21 (木) 08:49:45
  • replicate(100, mean(sample(x, 10))) -- 河童の屁? 2010-01-21 (木) 09:20:49
  • surgさん、河童の屁さん本当にありがとうございます。 -- T-A? 2010-01-21 (木) 18:06:59

主成分分析の散布図の成分を変えたい

kum? (2010-01-16 (土) 19:57:41)

主成分分析の結果をbiplot(PC)で表すと第1主成分が横軸、第2主成分が縦軸になりますが、それを(1,3),(2,4)といったように別の主成分で図を書くようにはできないでしょうか?
editでbiplotの中身をそれらしく変更したりしましたができませんでした。
どなたかご教授ください。

  • 毎度のことですが,? biplot.princomp または ? biplot.prcomp をやって,良く読みましょう。choices という引数があるでしょ?
    > editでbiplotの中身をそれらしく変更したりしましたが
    biplot.default じゃないし,わけもわからずそれらしく変更しても無駄な努力でしょう。
    biplot.default ではなく biplot.princomp が使われるというのは,? princomp の See aloso というところに書かれているのですよ。オンラインヘルプは熟読玩味しましょう。知りたいことは,そこに書いてあるのです。まれに,書かれていないこともあるのですけどね。
    以前の質問で,biplot.default の方を直すように解答したのは,biplot.princomp は choices の設定後,biplot.derault を呼び出すようになっているので,choices=c(1,2) のときには,直接 biplot.default を呼ぶのと同じだし(実際は少し違う),biplot.princomp をいくら弄ってもどうしようもないから,biplot.default の方を直すように解答したのです。 -- 河童の屁? 2010-01-16 (土) 20:07:07
  • お答えくださってありがとうございます。 
    > biplot3 <- stats:::biplot.princomp 
    > biplot3 <- edit(biplot3) 
    として 
    > function (x, choices = 1L:3L,scale = 1, pc.biplot = FALSE,suffix=suffix, ...)   
    > biplot.default(t(t(scores[, choices])/lam), t(t(x$loadings[,suffix]) * lam), ...) 
    とbiplot.princompを変更後 
    > suffix <- 1:100 
    > biplot3(PC,suffix=suffix) 
    としましたが [以下にエラー t(x$loadings[, suffix]) : 選択の長さは 2 でなければなりません] と出てしまいました。 -- 2010-01-16 (土) 21:37:14
  • 困りますね。choices は "length 2 vector specifying the components to plot." と書いてありますね。"choices = 1L:3L" は1,2,3 の 3 つの要素を持つベクトルですよ。choices=c(1,3) と指定しないといけませんね。
    scores と loadings から 必要な行と列を choices と suffix で選択するのもちゃんとできていないですね。
    biplot.princomp だけを直すのでは,全体の配置の中で選択した行(ケース)の位置を表示することはできません。biplot.default と連携できるように biplot.princomp と biplot.default の両方を修正する必要があるでしょう。全体の配置の中で選択した行の位置を表示するのは biplot.default の方でやらないといけないでしょう。
    スケールの決め方が違うけど,先に修正した biplot2 を使うのが一番簡単でしょう。
    例えば,第1,第3主成分をプロットしたいなら,
    choices <- c(1, 3)
    biplot2(PC$scores[,choices], PC$loadings[,choices], suffix=suffix)
    のようにすればよいのですから。biplot3 に choices 引数を追加してやれば,使いやすくなるでしょう。ついでに,biplot.princomp がやっているスケール変更も biplot3 の初期部分でやるようにしてしまえばよいでしょうね。 -- 河童の屁? 2010-01-16 (土) 22:06:35
  • biplot.princomp と biplot.default をまとめて,新しい引数も加えて以下のようなものを。
    a <- princomp(iris[ ,1:4]) # 動作確認用 princomp オブジェクトを作成
    以下の2図を比較してちゃんと動くことを確認
    biplot(a, choices=c(1,3)) # 本来の biplot.princomp で全ケースを描画
    biplot3(a, choices=c(1,3),  suffix=c(23, 101, 123)) # 3 ケースだけ描画
    ちょっと長くなるけど -- 河童の屁? 2010-01-16 (土) 23:31:05
    biplot3 <- function (x, choices = 1L:2L, scale = 1, pc.biplot = FALSE, # change
        var.axes = TRUE, col, cex = rep(par("cex"), 2), 
        xlabs = NULL, ylabs = NULL, expand = 1, xlim = NULL, ylim = NULL, 
        arrow.len = 0.1, main = NULL, sub = NULL, xlab = NULL, ylab = NULL, 
        suffix = NULL, # add 前の定義はちょっとまずかったので訂正
        ...) 
    {
        # add start # biplot.princomp の部分,一部変更
        if (length(choices) != 2) 
            stop("length of choices must be 2")
        if (!length(scores <- x$scores)) 
            stop(gettextf("object '%s' has no scores", deparse(substitute(x))), 
                domain = NA)
        if (is.null(suffix))  # biplot.princomp に追加
            suffix <- 1:nrow(scores)
        loadings <- x$loadings  # 変更
        lam <- x$sdev[choices]
        if (is.null(n <- x$n.obs)) 
            n <- 1
        lam <- lam * sqrt(n)
        if (scale < 0 || scale > 1) 
            warning("'scale' is outside [0, 1]")
        if (scale != 0) 
            lam <- lam^scale
        else lam <- 1
        if (pc.biplot) 
            lam <- lam/sqrt(n)
        x <- t(t(scores[, choices])/lam)      # biplot.default の引数 x
        y <- t(t(loadings[, choices]) * lam)  # biplot.default の引数 y
        # add end
        # これ以降は biplot.default
        n <- nrow(x)
        p <- nrow(y)
           :
    #  text(x, xlabs, cex = cex[1L], col = col[1L], ...) # 以下のように変更
       text(x[suffix,], xlabs[suffix], cex = cex[1L], col = col[1L], ...) # change
           :

関数read.shapeが使えません

G-T? (2010-01-15 (金) 11:58:25)

プログラム言語をRで初めて学んでいます。
かなりの初心者なので、質問内容に至らない点があるかと思いますが、どうかご指導ください。

今回牧山先生の解説(http://www1.doshisha.ac.jp/~mjin/R/200709_50.pdf)を読みながら、地図の作成を学んでいるのですが、
その際に使われるmaptoolsパッケージの"read.shape"という関数が、
「エラー: 関数 "read.shape" を見つけることができませんでした」と表示され、何故か使うことが出来ません。
きちんとmaptoolsパッケージを呼び出してから実行していますし、maptoolsパッケージに入っている他の関数"readShapePoly?"は使うことが出来ました。

これはmaptoolsパッケージが中途半端にしかインストールできていないということなのでしょうか?
それを確認・修正する方法をご教授いただければ幸いです。

※アプリケーションが古いのかと思い、再度Rをversion 2.10.1にインストールし直しましたが、同じ症状が見られます。
※念のため使用環境を掲載いたします。

sessionInfo()
R version 2.10.1 (2009-12-14)
i386-pc-mingw32

locale:
[1] LC_COLLATE=Japanese_Japan.932 LC_CTYPE=Japanese_Japan.932
[3] LC_MONETARY=Japanese_Japan.932 LC_NUMERIC=C
[5] LC_TIME=Japanese_Japan.932

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] maptools_0.7-29 lattice_0.17-26 sp_0.9-47 foreign_0.8-38

loaded via a namespace (and not attached):
[1] grid_2.10.1 tools_2.10.1

  • 補足です。関数"Map2poly"も同様に使うことができませんでした。 -- G-T? 2010-01-15 (金) 12:36:28
  • 「これはmaptoolsパッケージが中途半端にしかインストールできていないということなのでしょうか?」と思うなら、入れ直せばはっきりします。でも、「再度Rをversion 2.10.1にインストールし直しました」とはライブラリも入れ直して、ダメだったということ? -- 2010-01-15 (金) 12:46:35
  • library(help=maptools) とやってご覧なさい。read.shape という関数がない(なくなっている?)ということがわかるでしょう。少なくとも maptools_0.7-26 では存在しました。とにかく,かなりの変更があった模様。 -- 河童の屁? 2010-01-15 (金) 13:06:27
  • 仰る通りでした。いくつかの関数がなくなっているようですね・・・。RjpWikiのmaptoolsページはまだ変更されていない様なので、どなたか更新していただければ幸いです。 互換可能な関数というのは、英語のヘルプを読み解くしかないのでしょうか。 -- G-T? 2010-01-15 (金) 13:36:13
  • 金先生の「maptoolsのクラス・オブジェクト」の稿を見ていただきたいのですが、その中のS3のクラス作成関数(read.shape)がなくなりS4クラス作成関数(readShapePoly?)だけになったようです。(S4クラスの方が何かと使いやすいので今後はそちらを使ってみてください。) -- okinawa 2010-01-15 (金) 14:15:34
    library(maptools)
    Map<-readShapePoly("C:/GISdata/gunma.shp")
    plot(Map)
  • もし、わからないことがあれば名指ししていただければ、お答えします。okinawa=牧山です。 -- okinawa 2010-01-15 (金) 14:36:20
  • >Okinawa様 丁寧な解説ありがとうございます。教えていただいた稿を読ませていただいておりますが、知識不足のため苦戦しております・・・。自分なりに咀嚼してみようと試みていますが、どうにも理解できない場合はお力をお借りしたいと思いますので、よろしくお願いいたします。(もしよろしければ、"Map2poly"関数の代わりになるようなS4クラス作成関数?があるのでしたら、教えていただければ幸いです。) -- G-T? 2010-01-15 (金) 15:27:51
  • maptoolsdemo.txtをS4クラス用に作り直してみますので、少々お時間をください。 -- okinawa 2010-01-15 (金) 17:51:08
  • ちなみに、readShapePoly?で作成されたクラスは、Map2polyで作られたpolylistクラスのようなものも含んでますので、変換する必要はありません。ポリゴン部分のスレッド(@polygons)を取り出すだけです。 -- okinawa 2010-01-15 (金) 17:54:18
  • >Okinawa様 お返事が遅くなりました、ご回答ありがとうございます。Map2poly関数をそのまま使える、ということなのでしょうか?Map2poly関数が新しいパッケージには入っていない様なのですが、その場合どうすればよいのでしょうか。面倒なことになってしまい申し訳ありませんが、maptoolsdemo.txtのS4クラス版、お待ちしております。 -- G-T? 2010-01-19 (火) 11:20:54
  • 空間的なデータの分析の地図作成練習用データ(Windows版/Macintosh版)にmaptoolsdemoSP.txtを作成しましたので、つかってみてください。 -- okinawa 2010-01-24 (日) 23:58:35
  • >Okinawa様 ありがとうございました、参考にさせていただきます。 -- G-T? 2010-01-31 (日) 12:08:39

文字列の検索について

aoi? (2010-01-14 (木) 12:38:13)

いつも丁寧に答えてくださり本当にありがとうございます。
拙い質問で申し訳ないのですが、よろしくお願いします。
grep関数で文字列の検索を行っています。

糖鎖の構造についての文字列の検索を行っているのですが、
例えば以下のような構造だったら
Fuca1-2Galb1-4GlcNAcb1-2Mana1-3(Fuca1-2Galb1-4GlcNAcb1-2Mana1-6)Manb1-4GlcNAcb1-4GlcNAcb-Sp20

末端の構造、つまり最初のFucだけ取り出したいと思っています。
上記のような構造でしたら

grep("^Fuc",mixmix_rownames)

のように出すことが出来るのですが
ただ、grepの正規表現にひっかかってしまって
例えば
a-D-Gal-Sp8
だと
Galを出したいのですが

grep("^Gal",mixmix_rownames)

で出すことが出来ません。
また、
[3OSO3][6OSO3]Galb1-4[6OSO3]GlcNAcb-Sp0
のような構造でもGalを出したいのですが、出すことが出来ません。

grep("[3OSO3]",mixmix_rownames,fixed=TRUE)

にすると正規表現を無視することが出来るので、文字列が一致するものを取り出せるのですが、
そうすると末端構造(最初のGal)だけを取り出すことが出来ません。

ちなみに

> sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-apple-darwin8.11.1

です。

よろしくお願いします。

  • 「末端構造(最初のGal)」というようなことが,一般の言葉で言うならどういうことなのかわからない。アルファベット以外の文字に続くキーワードという解釈でよいなら,grep("[ [ : punct: ] ]*Gal", foo) で望む結果が得られるのでは?([ ] や : の前後の空白は wiki に勝手に解釈されることを防ぐためだから実際にそれらの文字を書いてはいけない) -- 河童の屁? 2010-01-14 (木) 12:58:13
  • grep("([^[:alnum:]]|^)Gal", foo) とかかな? 何をもって最初とするのか(単語とみなす条件)を書くか, より良くはテストデータと得たい結果を書くと良いと思います. -- 2010-01-14 (木) 13:19:28
  • こんな感じかしら.
    > mixmix_rownames <- c( 
    + "Fuca1-2Galb1-4GlcNAcb1-2Mana1-3(Fuca1-2Galb1-4GlcNAcb1-2Mana1-6)Manb1-4GlcNAcb1-4GlcNAcb-Sp20", 
    + "a-D-Gal-Sp8", 
    + "[3OSO3][6OSO3]Galb1-4[6OSO3]GlcNAcb-Sp0" 
    + ) 
    >  
    > grep("^([A-z]-|\\[\\w*\\])*Fuc", mixmix_rownames, perl=TRUE) 
    [1] 1 
    > grep("^([A-z]-|\\[\\w*\\])*Gal", mixmix_rownames, perl=TRUE) 
    [1] 2 3 
    >   
    「これでは網羅できていない」に100カノッサ -- surg? 2010-01-14 (木) 14:35:58
  • 皆さん言っておられることは,オンラインヘルプ ?grep を参照したらいかが?ということでは?やり方がわからないときは,やはり,「このような条件」というのを,専門用語ではなく日常用語で詳しく説明することに尽きるでしょう。あなたの説明に出てくる専門用語は,多くの人にとってはちんぷんかんぷんで何の情報も与えません。 -- 2010-01-14 (木) 21:45:04
  • 迅速なコメント本当にありがとうございます!コメントが遅くなってしまってすみません。 補足させていただきます。 Fuca1-2Galb1-4GlcNAcb1-2Mana1-3を例にするとFucがフコース、Galがガラクトース、GlcNAcは N-アセチルグルコサミン、Manがマンノースというように糖鎖を構成する単糖を示していて、糖鎖の後ろにあるa1-2,b1-2というのは糖鎖同士がどう繋がっていることを示しています。こうした場合の最初に出てくる 単糖を取り出したいのです。 [3OSO3][6OSO3]Galb1-4[6OSO3]GlcNAcb-Sp0の場合は[3OSO3][6OSO3]は糖ではないので省きたくて a-D-Gal-Sp8だとa-D-は省きたい、という意味です。よろしくお願いします。
    • aoi? 2010-01-14 (木) 23:26:36
  • やはり、あなたの返事は何の情報も与えない。糖鎖の配列や結合などどうでもよく、糖鎖を文字列として解釈した説明が必要です。 -- 2010-01-15 (金) 00:35:14
  • 文字列と解釈した場合に糖鎖の文字列が多数あった場合に、最初にGal,Fuc,GlcNAc,Manが出てくるものの数を数えたい、二個目以降は無視したいというシンプルな問いです。分かりにくいでしょうか。 -- aoi? 2010-01-15 (金) 06:19:10
  • イメージとしてはこんな感じです。
    grep("^Man",mixmix_rownames,value=TRUE)
    [1] "Mana1-3(Mana1-6)Manb1-4GlcNAcb1-4GlcNAcb-Sp13"                                            
    [2] "Mana1-2Mana1-2Mana1-3Mana-Sp9"                                                            
      :             
    [19] "Mana1-3(Galb1-4GlcNAcb1-2Mana1-6)Manb1-4GlcNAcb1-4GlcNAcb-Sp12" 
    [20] "[3OSO3][6OSO3]Manb1-4[6OSO3]GlcNAcb-Sp0"
    [21] "b-D-Man-Sp8"
    この内1から19は今も出せているのですが、20と21は出せていないので、どうすれば良いのか、という問いです。よろしくお願いします。
  • 提案された3つの案は,どれもちゃんとあなたの望む結果を出しますね。やってみなかったですか?やってみて,こういう場合には正しい答えが出ないということがあれば,そのような例を追加すればよいでしょう。ちなみに,あなたの提示した1〜19は文字列パターン検索の点からいえば同じものなのでどれかひとつだけでよく,重複して例示する必要はありません。 -- 屁の河童? 2010-01-15 (金) 07:42:53
  • バイオインフォマティクスでの利用についてでも書いたけど、わざわざRを使う作業なのかなあ。PerlやRubyでも十分では?Rjpで言うのも何ですが… -- akira? 2010-01-15 (金) 08:55:35
  • すみません。理解して、やってみている途中です。1から19について了解です。 -- aoi? 2010-01-15 (金) 09:08:23
  • PerlやRubyで書いたことが無いのです。Cはやったことがあって、その方が簡単そうだ、とは思うのですがその後の操作をRで行いたいのでRで出来たら良いなと考えていて、工夫次第で出来そうな雰囲気がしたのでお聞きさせていただきました。お手数をおかけしてすみません。 -- aoi? 2010-01-15 (金) 09:11:34
  • 「わざわざRを使う作業なのかなあ」と仰いますが,R でもできるからやろうというだけでしょう。ほかのやりかたは(色々な理由で)できないが,R はできるという人だっているんですから。だれもが,Perl や Ruby や C やその他諸々の方法を使えるわけでもないですからね。 -- 2010-01-15 (金) 21:04:41
  • ご意見、至極、同感です.そして、裾野が広がり、Rならできる人が増えたのは嬉しいですね.
    私たちの分野では、配列解析はbioperlやbiorubyが充実しており、「わざわざ…」と書きました.あと、私もそうでしたが、この分野は異分野交流が少なく、質問力が弱いのが少し残念です. -- akira? 2010-01-16 (土) 11:21:00

RODBCのSQL文(sqlQuery)でテーブル名の一部を別の変数から指定したい場合

hassyy? (2010-01-14 (木) 04:09:07)

長いタイトルで申し訳ありません。よろしくお願い申し上げます。

Windows版R(ver2.9.0)にRODBC_1.3-1をインストールして作業しております。
RからAccess2003で作成したmdb内のクエリの結果に接続して、計算を行っています。
下記のように記載し、問題なくクエリに接続できて、必要なデータを入手することができるところまでは確認しました。

conndb <- odbcConnectAccess("Data.mdb")
dat <- sqlQuery(conndb, "select * from [query1]")

上記例のquery1の他に同じレイアウトのクエリが数種類あり、(query2, query3,,,,,query11)、それらについても同様に読み込み、同じ処理を行いたいと思っています。

conndb <- odbcConnectAccess("Data.mdb")
list <- c(query1, query2,,,,query11)
for (i in list){
dat <- sqlQuery(conndb, "select * from [i]")
 ** datに対する処理 **
}

のような感じでソースをかけるとよいと思ったのですが、上記のような書き方では動かないようでした。
どのようにすればよろしいのでしょうか?

  • 未検証ですが、こうかな? -- 2010-01-14 (木) 08:45:56
    conndb <- odbcConnectAccess("Data.mdb")
    list <- 1:11
    for (i in list){
    tablename<-paste("query",i,sep="")
    qtext<-paste("select * from ",tablename,sep="")
    dat<-sqlQuery(conndb,qtext)
    #** datに対する処理 **
    }
  • ありがとうございます! SQL文のオブジェクトを作って実行させればよかったのですね! -- hassyy? 2010-01-14 (木) 11:34:41

biplotで特定のデータだけを表示したい

kum? (2010-01-13 (水) 21:52:01)

失礼かと思いますが、わからない点があるので連続で投稿させていただきます。

例えばcsvファイルに100個のデータがあるとして、biplotで表すとそのまま100個のデータが示されますが、これを特定のデータ(最初の10個、途中の20個など)だけを表示するようにはできないのでしょうか?
ご教授ください。

  • 全部のデータを読み取って,そのうちの特定の行だけを使えばよいでしょう。たとえば,100行10列のデータフレーム X の31行目から50行目までを Y というデータフレームに付値するには Y <- X[31:50,] でよいのですよ。場合によっては新たなデータフレームに付値せずに,prcomp(X[26:58,]) のようにしても良いのです。ベクトル,行列,データフレームの要素の参照は基礎なのでまとめて調べておくのがよいでしょう(なにか,R の本を持っていませんか?持ってないなら,買った方が良いでしょう。インターネット上でも十分な情報はありますけどね)。 -- 河童の屁? 2010-01-13 (水) 22:03:04
  • 素早いお答えありがとうございます。私の説明不足でしたが、流れとしては 1:最初に全部のデータを主成分分析する→2:biplot(PC)で全部のデータが載っている2次元の散布図が描かれるが、その中で特定の数字(データ番号)だけを表示したい というものでした。 biplot(PC)[,1:100] とすると NULL という文字と全て載っている散布図が現れ、Y <- PC[,1:100] と新たなデータフレームに付値しようとすると「次元数が正しくありません」と出てしまいます。  -- kum? 2010-01-13 (水) 22:43:50
  • > biplot(PC)[,1:100] とすると NULL という文字と全て載っている散布図が現れ、Y <- PC[,1:100] と新たなデータフレームに付値しようとすると「次元数が正しくありません」と出てしまいます

    思いつきで,いい加減な指定をあれこれやってみても無理ですよ。biplot(PC)[,1:100] や Y <- PC[,1:100] の意味がわかっていないでしょう。
    ? biplot してみましたか?
    biplot の最初の二つの引数の最初のものが,主成分得点ですから,そのうちの何行目から何行目までというように指定すればよいのです。xlabs を使うことをおすすめしておきましょう。 -- 河童の屁? 2010-01-13 (水) 22:45:30
    > ans.prcomp <- prcomp(iris[,1:4]) # 例として iris データを使うと
    > suffix <- c(45, 6, 78, 90, 99, 113, 145) # 描画したい行(指定の難易度はさまざま)
    > biplot(ans.prcomp$x[suffix,], ans.prcomp$rotation, xlabs=suffix) # xlabs を使わないと通し番号になってしまう
  • ご教授なされたのと同様にして
    > PC <- princomp(~A+B+C+D+E+F+G+H, cor=TRUE,data=X)
    > suffix <- c(2,3,4,5,6,7,8,9,10)
    > biplot(PC$x[suffix,], PC$rotation, xlabs=suffix)
    としたのですが「エラー dimnames(x) <- list(xlabs, dimnames(x)2L?) : NULL に対して属性を設定しようとしました」と出てしまいました。prcompでなくprincompを使っていることがエラーの原因でしょうか? -- kum? 2010-01-13 (水) 23:27:36
  • ? princomp または str(princomp の返すオブジェクト) をしてみましょう。なにも,わからず,適当なことをしてもだめですよ。princomp と prcomp どちらがよいかについても,? prcomp と ? princomp を読んでみてください。ついでに,c(2,3,4,5,6,7,8,9,10) は 2:10 とおなじですよとか,いろいろ書きたくなってしまいます。記事の書き方も,編集ウインドウの下の「テキスト整形のルールを表示する」を読みましょう。 -- 河童の屁? 2010-01-13 (水) 23:42:02
  • princompの場合、主成分得点は x ではなく scores に入っているのですね・・・説明をよく読まなくて申し訳ないです。ですが
    > suffix <- 2:10 
    > biplot(PC$scores[suffix,], PC$rotation, xlabs=suffix) 
    としたところ「以下にエラー 1L:p : 引数の長さが0です」と出てしまいました。 -- kum? 2010-01-14 (木) 00:42:13
  • ? princomp 熟読のこと。variable loadings は loadings に入っているのですよ。 -- 河童の屁? 2010-01-14 (木) 07:19:22
  • 下の
    > biplot(PC$scores[suffix,], PC$loadings, xlabs=suffix) 
    と書いたところ表示できました。熱心にご教授くださって感謝します。 ・・・しかし、「biplot(PC$scores[suffix,], PC$loadings, xlabs=suffix)」で表示される範囲が「biplot(PC)」、つまり全データを示した図の中でどこにあるかがわかるのが望ましいのですが、そうすることはできないのでしょうか。 -- kum? 2010-01-14 (木) 09:13:29
  • そのようにするには、今の場合プログラムをいじるしかないかな? -- 河童の屁? 2010-01-14 (木) 11:19:35
    まず、元のプログラムを別の名前にコピーして
    biplot2 <- stats:::biplot.default
    プログラムを編集する
    biplot2 <- edit(biplot2)
    この後、編集ウインドウで以下の2か所を追加・変更
    function (x, y, var.axes = TRUE, col, cex = rep(par("cex"), 2), 
        xlabs = NULL, ylabs = NULL, expand = 1, xlim = NULL, ylim = NULL, 
        arrow.len = 0.1, main = NULL, sub = NULL, xlab = NULL, ylab = NULL,
        suffix=suffix, # 追加
    :
    #   text(x, xlabs, cex = cex[1L], col = col[1L], ...) 変更
        text(x[suffix,], xlabs[suffix], cex = cex[1L], col = col[1L], ...)
    編集されたプログラムを保存する。
    実際に関数を呼び出すのは以下のようにする。関数名、引数の指定の仕方に注意。
    biplot2(PC$scores, PC$loadings, suffix=suffix)
  • 重ね重ねありがとうございます。これで研究を進めることができます。 -- kum? 2010-01-14 (木) 12:03:47

biplotで表示した図の保存の方法

kum? (2010-01-13 (水) 18:03:45)

初めまして,kumと申します。

研究で主成分分析を行うことになったのでRを導入し,結果も得ることができました。
そこで,biplot(PC)で描かれた図を保存してレジュメに貼ろうとしたのですが保存の仕方がわかりません。
このwikiの「R による EPS 画像の作成とその LATEX への取り込み」を参考に
Y <- biplot(PC) や Y <- PC  として data(Y) としたとことろ「データセット 'Y' がありません」と 出てしまいました。
どなたか解決法をご教授ください。

  • WindowsでRguiを使っているならばファイルメニューから保存するのが簡単ではないですか。ちがうならdev.copy2eps(file="ファイル名.eps")とか。http://www.okada.jp.org/RWiki/?EPS%B7%C1%BC%B0%A4%CE%BD%D0%CE%CF -- 2010-01-13 (水) 18:44:46
  • お答えありがとうございます、dev.copy2epsで無事保存することができました。 -- kum? 2010-01-13 (水) 18:52:56

【項目反応理論】既知のパラメータを使って能力値推定

parade? (2010-01-13 (水) 17:44:36)

潜在特性モデル・項目反応理論のパッケージltmを使って、ある集団Aの反応データから、項目パラメータを出しました(2パラメータ)。
このパラメータを使って、別の集団Bの成員の能力値を推定したいのですが、どのようにすれば良いかご存じの方いらっしゃいますでしょうか。

また、初めに求めたパラメータのうちのいくつかだけを使って、別の集団の成員の能力値を推定する、という場合にはどのようにアレンジするかについても、お教えいただければ幸いです。

どうぞよろしくお願いいたします。

丸投げですみません。

gomen? (2010-01-11 (月) 16:47:33)

自由評価(0〜100点)のレビューサイトで、Aさん平均点60点で100作=計6000点と、Bさん平均点80点で75作=計6000点で同じになります。
ただし、この時の各作品の平均点の上昇に対する
影響力はBさんの方がAさんより凄く高くなります。
簡単に書くと、同じ審査員なのに影響力が凄く違うと不平等なので解消したい。
でも、処理方法をマスター出来そうに無いので誰か協力してください。

目的、本当の価値が知りたい。
自由点数だと平均点60の70点(少しおもしろいに相当する)と平均点80の70点(駄作)が同じになってしまうのです。そこで0〜101位に換算すれば、それがどのぐらいの価値なのかストレートに導き出せると言う事です。
(現実の差 平均点60で100作=計6000点と平均点80で100作=計8000点、この時の差2000点を平均点60に足すと100点満点の作品数を100作中で約50作も増加可能なのです。)

以下、理論
Aさんは平均点60点なので60点の作品というのは平凡な作品に相当します。
仮に推定順位50位とします。
Bさんは平均点80点なので80点の作品というのは平凡な作品に相当します。
同じく推定順位50位にするべきと思います。
後は最高点と最低点ですが、ABどちらにしても、それが推定順位での最高位と最低位に相当します。仮に推定順位1位と推定順位100位にします。

処理方法のルール
後は点数の書かれたボールを、その0〜50位の仮想ゲージと50〜101位の仮想ゲージに並べて、接点の順位を割り出して、最後に同点数の処理をすれば推定順位に変換完了となります。
(同様の分離により、32分割する事も可能と思いますが、補正が大変なのと、点数配分が極端な審査員に有利に働くので、最大の誤差である50位=個人の平均点のみとします。)
点数の種類が少ない時(5〜8個以下と思う)は0〜101位の仮想ゲージを使う。
点数の種類が1種類の時は50位にしかならないので無効とします。

使用データー
CSVファイルから、会員IDはあるけれど会員番号が振られて無い。
作品数1万ぐらい、会員数1.5万ぐらい、総カルテ数50万ぐらい

  • あのう、、よく分からない中でテキトーなことを書くのはどうかと思いますけど、 「価値」というのをきちんと定義しないと、「本当の価値」は出ない気がしますよ。 こんな風にテキトーに調整したのが本当の価値ではないと思います。根本的にどこかで間違っている印象もありますね。主催団体組織の中で、きちんと 論議された方がいいですね。良い作品だけを選ぶなら、各審査員が例えば1〜10位を選んで順位にポイントを 付ける方がシンプルと思うのですが、、、それが許されない事情があるのかもしれませんが。 それから、スキルがまったく無いなら処理は業者へ頼まれた方がいいと思います。 EXCEL OR ACCESS で作れる範囲と思います。 -- asap? 2010-01-11 (月) 23:12:34
  • SQLでも可能っぽいのでSQLで協力者さがします。 -- gomen? 2010-01-17 (日) 13:08:42

ポアソン回帰と負の二項回帰

初心者? (2010-01-10 (日) 23:14:19)

「回数」が被説明変数になるデータをポアソン回帰と負の二項回帰で分析したいと考えております。Rを使ったこれらの分析方法をお教え願えませんでしょうか。できればRコマンダーでのやり方を教えていただけると大変ありがたいです。宜しくお願いします。

  • これは質問ではありませんね.自分で勉強しなさい. -- 2010-01-11 (月) 05:26:26
  • 金先生のページでいうと、 http://www1.doshisha.ac.jp/~mjin/R/15.pdf この辺のことでしょうか? -- 2010-01-11 (月) 10:24:04
  • どうもご丁寧にありがとうございました。金先生のページを参考に勉強します。 -- 初心者? 2010-01-11 (月) 20:57:47

マルチアンサーのクロス集計は可能でしょうか?

勉強中? (2010-01-07 (木) 18:00:10)

よろしくお願いします。

アンケートを実施して、結果をEXCELにまとめる際に、マルチアンサーを
1つのカラムに 「2,3,5」 のようにまとめているとします。

例えば

id	Q1	Q2	        Q3
1	2	1,3,7,9,10	1
2	3	2,5	        1
3	4	3	        1
4	1	4,6	        1
5	2	6,7	        2
6	3	10	        2
7	3	3,4	        2
8	4	2,5,6,7,8,9	2
9	1	1,2,4	        2
10	3	5,7	        2

こういった際に、Rでクロス集計は可能でしょうか?

まだアンケート実施前で、できればRでやりたいのですが、集計の期限が決まっているため、事前の可・不可を知っておきたいです。

R 2.9.2
windows XP sp3

よろしくお願いします。

  • 「マルチアンサーのクロス集計」というのが,どういうことを意図しているのかわかりませんが,例示の場合,Q2 が Q2-1〜Q2-10 の10個の下位質問からなり,それぞれが 0/1 データで表せればよいなら,以下のような操作で望むデータ構造になると思いますよ。(プログラムを書くわけですから,およそどんなことでもできます。どのようなことをやりたいか明確に定義できてさえいれば) -- 河童の屁? 2010-01-07 (木) 19:31:28
    Q2 <- data.frame(t(sapply(a$Q2, function(s) {
    	val <- numeric(10)
    	sufix <- as.integer(unlist(strsplit(as.character(s), ",")))
    	val[sufix] <- 1
    	return(val)
    	})))
    実行後の Q2 は以下の通り
       X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    1   1  0  1  0  0  0  1  0  1   1
    2   0  1  0  0  1  0  0  0  0   0
    3   0  0  1  0  0  0  0  0  0   0
    4   0  0  0  1  0  1  0  0  0   0
    5   0  0  0  0  0  1  1  0  0   0
    6   0  0  0  0  0  0  0  0  0   1
    7   0  0  1  1  0  0  0  0  0   0
    8   0  1  0  0  1  1  1  1  1   0
    9   1  1  0  1  0  0  0  0  0   0
    10  0  0  0  0  1  0  1  0  0   0
  • 迅速なご回答ありがとうございます。参考にさせて頂き、プログラムを書いてみようと思います。ありがとうございました。 -- 勉強中? 2010-01-08 (金) 09:18:08

複数のデータセットにフィットするために

Tiana? (2010-01-05 (火) 17:39:26)

はじめまして,留学生のTianaです.

lm関数を使って重回帰解析を行っています.
質問の便宜上,以下の回帰式を使用させていただきます.
z=c+ax+by
ただし,zは応答変数,x,yは説明変数,a,b,cは回帰係数です.

lm(z〜x+y,data=dataset1)のようにすれば,dataset1に基づいた最適解(二乗誤差を最小にするようなa,b,c)が求まりますが,データセットが変われば最適解ではなくなります.
求めたいのは,各々のデータセットの最適解ではないかもしれませんが,複数のデータセットそれぞれの二乗誤差の和が最小になるようなa,b,cです.

この問題を解決する方法はどなたかご存知でしょうか?
日本語が下手で失礼な文面はあったかもしれませんが,教えていただければとても幸いです.

よろしくお願い致します.

  • すべてのデータセットをまとめて,lm 関数を使えばよいと思います。
    例えば,データセットが3つあれば,
    alldata <- rbind(dataset1, dataset2, dataset3)
    lm(z〜x+y,data=alldata)
    のようにする。
    あなたの望をかなえるためには,以下のように optim 関数を使えばよいかも。 -- 河童の屁? 2010-01-05 (火) 18:24:18
    > # テストデータとして,このようなデータセットを作り
    > data1 <- structure(list(x = c(47.8, 48.2, 62.6, 31.1, 43.7, 60, 38.3, 
    + 48.4, 59.4, 60.4), y = c(65.5, 34.7, 57.5, 46.3, 46, 60.9, 34.9, 
    + 50.3, 58.5, 45.4), z = c(62, 52.2, 57.1, 46.3, 35.1, 51.7, 31.6, 
    + 48.8, 64.9, 50.3)), .Names = c("x", "y", "z"), row.names = c(NA, 
    + -10L), class = "data.frame")
    > #
    > data2 <- structure(list(x = c(56.1, 43.3, 39.5, 52.5, 27.2, 55.2, 49.6, 
    + 56.1, 62.5, 58), y = c(49.6, 46.8, 54.3, 38.4, 34.5, 66.3, 54.1, 
    + 65.2, 49.9, 41), z = c(60.1, 45, 44.1, 31.2, 38.2, 60, 50.4, 
    + 56.7, 64.2, 50.2)), .Names = c("x", "y", "z"), row.names = c(NA, 
    + -10L), class = "data.frame")
    > #
    > data3 <- structure(list(x = c(50.5, 50.7, 60.8, 49.5, 46.1, 61, 27, 57.8, 
    + 39.5, 57), y = c(60.4, 55.3, 58.1, 32.6, 62.3, 43.5, 33.9, 53.5, 
    + 46.3, 54.1), z = c(39.7, 51.7, 62.1, 36.2, 54.5, 56.8, 31.8, 
    + 53.7, 51.7, 61.8)), .Names = c("x", "y", "z"), row.names = c(NA, 
    + -10L), class = "data.frame")
    > #
    > # 残差平方和の和を求めるために,このような関数を定義して
    > func <- function(par)
    + {
    + 	c <- par[1]
    + 	a <- par[2]
    + 	b <- par[3]
    + 	return(sum(
    + 	(data1$z-c-a*data1$x-b*data1$y)^2+
    + 	(data2$z-c-a*data2$x-b*data2$y)^2+
    + 	(data3$z-c-a*data3$x-b*data3$y)^2
    + 	))
    + }
    > #
    > # このように optim 関数を使えばば,解が求まります
    > ans1 <- optim(c(1,1,1), func)
    > options(digits=20)
    > ans1$par # 順に,Intercept, a, b の値
    [1] 5.1494284959399153 0.4486484068519486 0.4484184855761603
    > #
    > # 全部のデータを一緒にして lm をやるとちょっと違う解になります
    > ans2 <- lm(z~x+y, rbind(data1, data2, data3))
    > ans2$coefficients # 順に,Intercept, a, b の値
           (Intercept)                  x                  y 
    5.1698189750573782 0.4486579549173459 0.4480422838232404 
    # しかし,違いが出るのは収束判定が甘いからというのが一つの原因
    # 以下のようにすれば,全部のデータを一緒にして lm をやった場合の解に近づきます
    > ans3 <- optim(c(1,1,1), func, control=list(reltol=1e-14))
    > ans3$par
    [1] 5.1698211304708774 0.4486577795757830 0.4480424597122442
    図に描いてよく考えれば,別々のデータセットに同じ回帰平面をあてはめて誤差の平方和の和を最小にするのと,データセットをまとめて一つの回帰平面を当てはめたときの誤差平方和は同じものですよね。つまり,全部のデータセットを一緒にして,lm をやればそれがあなたが求めたい解になっているのだと思いますよ。
    以下の図を,赤,青,黒の3枚に分解したグラフと比較すればおわかりかと(独立変数は幾つあっても同じ)。
    fit.lm.png
  • ご丁寧な回答,ありがとうございました.いくつか更なる質問をさせてください.まず,説明不足でしたが,今回扱うデータは時系列データなので,rbindを使うことができないように思います.そして,optim関数で試してみましたが,初期値の指定によっては,推定結果はかなり大きく異なったりすることがありました.初期値の指定についてご意見をお伺いしたいと思います.また,lm関数の実行結果のように,残差,p値,修正済み決定係数などの尺度をoptimでは出力できますでしょうか?よろしくお願い致します. -- Tiana? 2010-01-06 (水) 15:02:16
  • > 今回扱うデータは時系列データなので,rbindを使うことができないように思います
    例えば,EuStockMarkets のような,mts クラスのデータセットですか?mts であっても,rbind は使えますよ。rbind(EuStockMarkets, EuStockMarkets) がどのようになるか見てみるとわかります。もし,mts になっていないなら,何なのでしょうか。
    > 初期値の指定によっては,推定結果はかなり大きく異なったりすることがありました.初期値の指定についてご意見をお伺いしたいと思います
    適切な初期値を与えるためには試行錯誤が必要でしょう。
    というか,結局は,全部のデータセットをひとまとめにして lm をすればよいのだろうということに納得できないということですか?
    > lm関数の実行結果のように,残差,p値,修正済み決定係数などの尺度をoptimでは出力できますでしょうか
    できません。得られたパラメータから,自分で計算しなければなりません。というか,結局は,全部のデータセットをひとまとめにして lm をすればそれらを求めるのに何の苦労もないだろうということに納得できないということですか? -- 河童の屁? 2010-01-06 (水) 15:32:06
  • 早速なご回答,誠にありがとうございます.
    zi,xi,yiをそれぞれ時刻iにおける売上,客数,商品在庫数とし,i=1時,2時,・・・,24時とします. 一日を通して客数及び商品在庫数は売上とどのような関係があるのかを考えます.
    x,y,z三者の関係を周期1日でみますと,2つのデータセットでは大体同じ傾向にあります(例えば|sin|(始端はi=1,終端はi=24)のような多峰グラフになります).
    データセット2つをrbindでつなげて推定すれば,二日間を通しての三者関係にzi=c+a*xi+b*yiを仮定することになります.推定結果をプロットしたときに,|sin|(始端はi=1,終端はi=48,山二つ)になり,しかし本当は|sin|(始端はi=1,終端はi=48,山四つ)のはずです.
    rbindを使って求めた結果は,「一日における三者関係」ではなく,「二日における三者関係」になるのではないかととても不安です.二つのデータセットは互いに独立ですから...
    ご意見をお待ちしております.
    よろしくお願い致します. -- Tiana? 2010-01-06 (水) 17:48:34
  • そもそも,時間は独立変数に入れていないのでしょう?だったら問題ないでしょう。
    連続する日時の独立変数と従属変数は元のままの順に並んでいるのですから,係数と独立変数の値を使って予測される予測値も元のままの順になりますよ。横軸に日時を取り,縦軸に売り上げをとり,まず実測値(従属変数値)を描き,次に,同じ図に予測値を描けば,先の実測値の近くを通る折れ線になるでしょう。
    以下に,テストデータと実行プログラムとその結果を掲示しておきますので,検討してみてください。2 日ぶんの時系列データです。 -- 河童の屁? 2010-01-06 (水) 17:58:32
    > data1 <- structure(c(60.7, 63.8, 62.8, 59.5, 50, 54.3, 50.2, 65.5, 82.9, 
    + 118.2, 142.7, 101.8, 78.8, 51.7, 56.3, 90.1, 125.9, 166.8, 182.6, 
    + 179, 134.6, 100.3, 69.1, 39.4, 31.2, 26.8, 26.8, 31.2, 31.2, 
    + 31.2, 33.6, 36, 40.8, 47.6, 51.2, 42.7, 29.2, 32.4, 34.8, 41.6, 
    + 50.8, 60.2, 67.8, 72.9, 60.4, 27.6, 34, 26.7, 21.3, 27.5, 23.3, 
    + 23.8, 27.5, 25, 23.5, 27.8, 38.7, 33.9, 56.5, 21.5, 24.4, 22.9, 
    + 25.2, 32.5, 29.2, 20.7, 37.1, 27.5, 19.3, 22, 14.6, 10.6), .Dim = c(24L, 
    + 3L), .Dimnames = list(NULL, c("z", "x", "y")), .Tsp = c(1, 24, 
    + 1), class = c("mts", "ts"))
    > 
    > data2 <- structure(c(60.9, 43.5, 42, 55.3, 61.4, 61.4, 85.4, 113.6, 132, 
    + 107.4, 79.8, 85.4, 74.2, 47.1, 66.5, 73.7, 98.7, 159.1, 154.5, 
    + 128.9, 95.7, 65.5, 45, 34.8, 28.4, 28.4, 34.8, 37.6, 34.8, 34.4, 
    + 45.6, 49.4, 51.2, 42.8, 46.4, 44, 29.2, 24.4, 24, 33.6, 43.2, 
    + 62.7, 64.9, 40.4, 32.9, 14.8, 14, 18.4, 19.5, 18.1, 25.1, 19.2, 
    + 22.4, 22.9, 20.1, 29.5, 46.2, 31.3, 33, 26.4, 23.9, 20.7, 10.8, 
    + 13.7, 17.7, 34.3, 45.8, 38.2, 30.2, 20.4, 12.1, 9.1), .Dim = c(24L, 
    + 3L), .Dimnames = list(NULL, c("z", "x", "y")), .Tsp = c(1, 24, 
    + 1), class = c("mts", "ts"))
    >
    > data1
    Time Series:
    Start = 1 
    End = 24 
    Frequency = 1 
           z    x    y
     1  60.7 31.2 21.3
     2  63.8 26.8 27.5
     3  62.8 26.8 23.3
     略
    23  69.1 34.0 14.6
    24  39.4 26.7 10.6
    > 
    > alldata <- data.frame(rbind(data1, data2))
    > ans.lm <-  lm(z ~ x+y, alldata)
    > plot(alldata$z, type="l")
    > lines(fitted.values(ans.lm), col="red")
    > summary(ans.lm)
    
    Call:
    lm(formula = z ~ x + y, data = alldata)
    
    Residuals:
         Min       1Q   Median       3Q      Max 
    -35.4932 -14.6937   0.3991   9.1139  41.6834 
    
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept) -19.1196     8.7029  -2.197   0.0332 *  
    x             2.3930     0.2396   9.986 5.43e-13 ***
    y             0.5314     0.3407   1.560   0.1259    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
    
    Residual standard error: 18.07 on 45 degrees of freedom
    Multiple R-squared: 0.7988,	Adjusted R-squared: 0.7898 
    F-statistic: 89.32 on 2 and 45 DF,  p-value: < 2.2e-16 
    lmfit2.png
  • 分かりやすいご説明ありがとうございました.やっと疑問を解けました.時刻そのものを独立変数にしてないからこそ,データセットをつなげてもよくて,2つのデータセットの順番を変えて推定しても結果はほぼ一致するわけですね.ありがとうございました. -- Tiana? 2010-01-06 (水) 19:24:14
  • > 2つのデータセットの順番を変えて推定しても結果はほぼ一致する
    lm の結果は,「ほぼ一致する」のではなく,「完全に一致」します。今の場合,時系列なのでそういうことをする意味がないですが,行をランダムに入れ替えても全く同じ結果が得られます(だって,時間に関係ないのだから)。 -- 河童の屁? 2010-01-06 (水) 19:51:26
  • >zi,xi,yiをそれぞれ時刻iにおける売上,客数,商品在庫数とし,i=1時,2時,・・・,24時とします. 一日を通して客数及び商品在庫数は売上とどのような関係があるのかを考えます.  質問者はたとえ話をする場合も多いですし、私の想像力が乏しいこともあるのでなんとも言えないですけど、 素直にこの文章を読むと多重共線性(multicollinearity)が出ちゃいそうですね。 -- asap? 2010-01-06 (水) 22:54:21
  • 多重共線性があるかないかは,質問者のデータによるでしょう。多重共線性があるなら,原因変数を使わないようにすれば良いだけで,それでも十分な予測はできるでしょう。また,多重共線性にかかわらず,予測がうまくいけばよいという観点もあると思います。 -- 河童の屁? 2010-01-07 (木) 08:45:31
  • たびたびすみません.時刻を独立変数とした場合はどうすれば良いでしょうか?z=c+a*iのように,応答変数を時間の関数とした場合,データをつなげてはいけないんでしょう. -- Tiana? 2010-01-07 (木) 20:54:59
  • 結局,全部のデータを使えばよいと言うことがわかったでしょうから,時刻を独立変数に含む場合も同じですよ。ただ,日内変動は簡単な曲線関数ではあらわせないので,工夫が必要。データが何日分も充分にあれば,時刻を表す (24-1) 個のダミー変数を使えばよい。他の変数も同時に独立変数とすることができますからね。あとは,自分で考えてね。
    上の data1, data2 をこの順で繋いで,23 個のダミー変数を付加する。以下のようにすれば,以下のような結果になる。 -- 河童の屁? 2010-01-07 (木) 21:05:36
    d <- data.frame(diag(24)[,-1])
    colnames(d) <- paste("H", 1:23, sep="")
    alldata <- rbind(data.frame(data1, d), data.frame(data2, d))
    ans.lm <- lm(z ~., alldata)
    plot(alldata$z, type="l")
    lines(fitted.values(ans.lm), col="red")
    summary(ans.lm)
    結果
    Coefficients:
                Estimate Std. Error t value Pr(>|t|)    
    (Intercept)  -1.6278    16.9593  -0.096   0.9244    
    x             1.6980     0.3435   4.943 6.05e-05 ***
    y             0.5798     0.4462   1.299   0.2073    
    H1           -4.8058    14.1831  -0.339   0.7379    
    H2          -12.3011    14.2281  -0.865   0.3966    
    H3          -11.8486    14.2191  -0.833   0.4136    
    H4          -13.1716    14.3102  -0.920   0.3673    
    H5          -10.1022    14.2485  -0.709   0.4858    
    H6          -10.4521    14.5318  -0.719   0.4796    
    H7            2.0627    15.2537   0.135   0.8937    
    H8            6.3584    18.0933   0.351   0.7286    
    H9           18.7776    16.0356   1.171   0.2541    
    H10           4.0706    18.9812   0.214   0.8322    
    H11           7.7339    14.9545   0.517   0.6102    
    H12          14.5447    14.2227   1.023   0.3176    
    H13          -9.8345    14.1444  -0.695   0.4942    
    H14           2.6706    14.1637   0.189   0.8522    
    H15           6.2902    14.4251   0.436   0.6670    
    H16          20.5260    15.3697   1.335   0.1954    
    H17          44.2918    18.1046   2.446   0.0229 *  
    H18          33.4838    21.1097   1.586   0.1270    
    H19          40.3405    17.7626   2.271   0.0333 *  
    H20          23.2166    15.3865   1.509   0.1456    
    H21          36.2390    14.4325   2.511   0.0199 *  
    H22          10.1858    14.6057   0.697   0.4929    
    H23          -5.2729    15.0943  -0.349   0.7302    
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
    
    Residual standard error: 14.12 on 22 degrees of freedom
    Multiple R-squared: 0.9399,	Adjusted R-squared: 0.8717 
    F-statistic: 13.77 on 25 and 22 DF,  p-value: 1.880e-08 
    lmfit3.png
  • たびたびすみません.時刻を独立変数にした場合はどうすればいいんでしょうか? -- Tiana? 2010-01-08 (金) 10:05:54
  • 上にあなたが昨夜書いた質問があり,直前のコメントがそれに対する返事ですよ。(別の記事にコメントをつけたりもしたようですが,よく確認してください。少しは自分でも考えましょうと,上にも書きましたし。) -- 河童の屁? 2010-01-08 (金) 11:08:44

対応分析について

ろんどん? (2010-01-04 (月) 13:01:14)

R 2.10.0にて対応分析をしようとしています。
エラーが出て、エラーの意味がよくわかりません。
エラーの意味と、対策方法を教えて頂きたく思います。

データは、9個の物に対して18の質問項目について答えてもらったデータです。以下の様なデータです。

8  8  6  7  6  6  4  6  9
6  7  6  6  6  7  4  7  6
2  1  2  7  1  1  1  1  6
0  0  1  7  0  2  0  0  6
0  0  0  2  0  0  0  0 13
0  0  0 11  0  2  1  0  9
1  5  7  5  4  3  1  5  4
0  1  0  2  0  0  2  3  8
1  3  3  8  3  5  2  4  9
2  3  4  5  3  4  3  3  8
0  0  0  2  0  1  0  2  9
6  5  2  0  2  2  9 10  2
0  0  0  0  0  0  0  2  5
0  1  1  1  1  0  1  1  4
1  1  1  2  1  1  1  2  2
2  2  3  4  7  7  9  9 10
2  2  2  7  2  4  3  3  7
1  2  3  3  2  2  2  2  4


以下プログラムです。

> library(ca)
 要求されたパッケージ rgl をロード中です 
> w<-read.table("C:/deta1.txt")
> Sdata<-matrix(0,18,9)
> for(i in 1:18){Sdata[,i]<-w[,i]}
 以下にエラー `[.data.frame`(w, , i) : undefined columns selected
> cor<-ca(Sdata,9)
> x<-matrix(0,27,18)
> x[1:18,1:18]<-cor$rproj
 以下にエラー x[1:18, 1:18] <- cor$rproj : 
   置き換えるべき項目数が,置き換える数の倍数ではありませんでした 
> x[19:27,1:18]<-cor$cproj
 以下にエラー x[19:27, 1:18] <- cor$cproj : 
   置き換えるべき項目数が,置き換える数の倍数ではありませんでした 
> plot(x[,3],x[,4],type="n")
> text(x[,3],x[,4],labels=c("A","B","C","D","E","F","G","H","I","J","K","L","M",
                            "N","O","P","Q","R","1","2","3","4","5","6","7","8","9"))
> abline(0,0,0,0)

ご教授よろしくお願い致します。

  • for(i in 1:18) {Sdata[,i]<-w[,i]} の w[,i] などは,w の i 列を意味しているので当然 i=1,2,..., 9 までしか有効でないのに i=1,2,..., 18 というのは誤りですね。w[i, ] の誤りでしょう。それに,これは w を Sdata に代入しようとしているのでしょうから,Sdata <- w でよいです(Sdata <- matrix(0,18,9) というのも不要です)
    それと,ca が返す要素に $rproj とか $cproj というのはないでしょう(Version 0.21 では $rowcoord と $colcoord?)。その要素数(というか,次元属性を見れば,代入先と大きさが違うのがわかるでしょう。)
    abline の使い方も変です。
    結局,以下のプログラムでよいのでは? -- 河童の屁? 2010-01-04 (月) 14:41:24
    library(ca)
    w <- read.table("C:/deta1.txt")
    Sdata <- w # 代入する意味はないと思うが
    cor <- ca(Sdata, 9)
    x <- rbind(cor$rowcoord, cor$colcoord)
    plot(x[, 3], x[, 4], type="n")
    text(x[, 3], x[, 4], labels=c(LETTERS[1:18], 1:9)) # ここはこういう風に書くほうがよい
    abline(h=0, v=0) # 要するに座標軸を描きたかった?
    また,ca の plotメソッドが使えるのだから,一番簡単にやりたかったら,plot(ca(w), c(3, 4)) だけで,添付のようなきれいな図が描けますよ。V1〜V9 は変数名,1〜18 は行名なので,自分でちゃんと定義すれば定義したとおりに図に描けますよ。? plot.ca でオンラインヘルプを読んでください。
    plot-ca.png
  • 河童の屁様早速のご回答、わかりやすいご説明ありがとうございました。 -- ろんどん? 2010-01-04 (月) 15:33:10

バイオインフォマティクスでの利用について

MiK? (2009-12-29 (火) 09:28:09)

Rを使ったバイオインフォマティクスに関する質問です、Rの質問でないと思われた方にはごめんなさい。

IPI(International Protein Index)のデータベース内のipi番号からそのタンパク質が持つドメインを検索しようとしています。ここでは簡単にするためにipi番号からドメインデータベースのpfamの番号を返すプログラムを作ることとします。

私の知っている範囲では、BiomRt?パッケージの中からgetBMを使うことができます。例えば以下のように、

getBM(attributes = c("ipi","pfam"), filters = "ipi", value="IPI00883220",
      mart=useMart("ensembl",dataset="ggallus_gene_ensembl"))

この場合、

ipi	pfam
IPI00883220 	PF04818

という値が返ってきます。これはIPI00883220がipiと同時にensembleのデータベースにも存在するから正常に働きます。

しかし、たまに正常に働かないipi番号が存在します。
例えばvalue="IPI00883261"に変えて上記のプログラムを動かすと

ipi	pfam
IPI00883261	PF01111

という値が期待されますが、実際には

[1] ipi  pfam
<0 rows> (or 0-length row.names)

と返ってきてしまいます。

これは、IPI00883261がipiデータベースには存在するが、ensembleのデータベースには存在しないため正常に働かないと考ました。というのは、BiomRt?はensembleのデータベースにアクセスして値を返しているからです。

そこで、この問題を回避するために直接ipiのデータベースを参照できる方法を知りたいと思っています。それを知っている方がいたらぜひご教授ください。よろしくお願いいたします。

  • ライブラリはbiomaRtが正しいです。で、ご質問ですが、ensemblにないならgetBMでとれないかもしれませんね。ソースの書き換えればできるのでしょうか?でも、そんなことしなくてもEBIのwebserviceからとれるのでは?私ならそうします。
    あなたがperlかrubyが使えるならここだと思います。
    今回のような単純作業ならこれでも良くて、http://www.ebi.ac.uk/Tools/webservices/rest/dbfetch/{db}/{id}/{format}でwgetして、加工すれば簡単かも。 -- akira? 2009-12-29 (火) 11:00:24
  • ありがとうございます。参考にしてみます。一見したところ、perlなどのプログラムの知識はないと、たくさんのタンパク質(4000)の情報を効率よく取得するのは大変そうだという印象なのですがどうなのでしょうか?まずはいろいろ試してみます。 -- MiK? 2009-12-29 (火) 20:38:42
  • データベスがどのような構造になっているのかよくわかりませんが,ipi番号からpfam番号を得るということなら,ipi と pfam のペア情報が何らかの形で作られているなら(もしかしたら作らなければならないかもしれないが),簡単じゃないのかなあ? -- 河童の屁? 2009-12-31 (木) 16:03:33
    > set.seed(11111)
    > data.base <- data.frame( # データフレームの例(1万行)
    +  ipi=sprintf("IPI%08i", sample(99999999, 10000)),
    +  pfam=sprintf("PF%05i", sample(99999, 10000)))
    > head(data.base) # こんな風な構造になっている(する)
              ipi    pfam
    1 IPI50144832 PF35844
    2 IPI97023278 PF04626
    3 IPI78760034 PF42298
    4 IPI90222583 PF08148
    5 IPI81417775 PF11722
    6 IPI79989218 PF66366
    > ipi <- c("IPI43502178", "IPI55223826", "IPI46947973",
    +          "IPI98703034", "IPI49743044") # 5 個の ipi コードに対する pfam コードを得る
    > lapply(ipi, function(x) data.base[data.base[,1] == x,]) # これだけでよい。。。
    [[1]]
                 ipi    pfam
    7733 IPI43502178 PF34214
    
    [[2]]
                 ipi    pfam
    3813 IPI55223826 PF36706
    
    [[3]]
                 ipi    pfam
    1138 IPI46947973 PF39932
    
    [[4]]
                 ipi    pfam
    6900 IPI98703034 PF00650
    
    [[5]]
                 ipi    pfam
    1835 IPI49743044 PF48089
  • タンパクに限らず、bioinformaticsではperl&MySQLが多い印象があります(私は分野外なのであくまで印象です).EBI、NCBI、DDBJなどはperl、Ruby、Javaのwebserviceを提供しているし、R以外の言語を使えた方が得することが多いと思いますよ.Rで頑張っても「車輪の再発明」な気がします. -- akira? 2010-01-05 (火) 07:49:27

時系列データのグラフ化

はぜ? (2009-12-22 (火) 11:56:00)

初心者です。
投稿ミス等ありましたらご容赦ください。
横軸に日付、縦軸に数量をとった折れ線グラフを作成しています。
とりあえずグラフはできたのですが、調査期間中毎日データをとっているわけではではないので、
データのない期間があると、その期間の前後の点が線で結ばれてしまい、本来データのない期間にも関わらずそこにデータがあるように見えてしまいます。
データのない期間は数量0として扱いたいのですが、どなたかいい方法をご存知でしょうか?
元データには、データのない日付は入力されていません。
OSはWindowsXP、Rヴァージョンは2.10.0です。
よろしくお願いします。

  • うまい方法を探すのに時間を費やすより,簡単確実なプログラムを書いて使うのが吉。
    今はどんなプログラムで描いているのか分からないのだけど,以下のプログラムの方針は,データ点は plot でちゃんと描けるのだから,あとは,2つの点を結ぶか結ばないかを決めればよいだけ。ある点と次の点の日付が1つ違いならその二点を結ぶ,2つ以上違うなら何もしない。
    もうちょっとエレガントなプログラムも書けるだろうけど,そこまで凝らなくても。 -- 河童の屁? 2009-12-22 (火) 12:38:35
    x <- structure(c(14601, 14602, 14603,
      14605, 14606, 14607, 14608, 14609, 14610,
      14615, 14616, 14617, 14618, 14619,
      14621, 14622, 14623), class = "Date")
    y <- c(23L, 24L, 44L, 25L, 13L, 12L, 11L, 13L, 29L, 
      45L, 30L, 42L, 39L, 38L, 31L, 13L, 19L)
    plot(x, y, xaxt="n")
    axis.Date(1, x, format="%m-%d")
    for (i in 1:(length(x)-1)) {
    	if (x[i+1]-x[i] == 1) segments(x[i], y[i], x[i+1], y[i+1])
    }
    oresen.png
  • 「データのない期間は数量0」と言うのは調査の結果が0だった場合の時とは明らかに違います. 折れ線グラフは傾きを大事にしなといけませんので欠損値を0にするというのはよくありません. Rは欠損値を線で結ばないので, 上の方のxとyを戴けば
    xx<-seq(min(x),max(x),"day")
    yy<-rep(NA,length(xx))
    yy[xx%in%x]<-y
    plot(xx,yy,type="b") # 欠損値は線で結びません.
    で良いのです. -- 2009-12-22 (火) 13:01:47
  • コメントありがとうございます。 お二人のご指摘から自分の間違い&説明不足に気付きました。申し訳ありません。 どのような調査を行っているかというと、野外にビデオカメラを設置、何ヶ月か連続で撮影して、ビデオに動物が現れた日付と時刻、およびカメラの前を横切った方向(DRCT)を記録しています。 ですので、連続で観察はしているのですが、観察されなかった場合(個体数0の場合)をデータとして入力しておりません。 このデータから日付ごとに個体数を集計してグラフ化させたいのです。 集計にはtapply関数を使いました。 現状では以下のようなプログラムになっています。 たびたびお手数をおかけして申し訳ありませんが、よろしくお願いします。
    ana <- d.sub[d.sub$SP== "a",]
      ana.sub <- data.frame(tapply(ana$DATE, ana[, c("Date","DRCT")], length))
      ana.sub[is.na(ana.sub)] <- 0 
      ana.sub$total <- ana.sub$d + ana.sub$u 
      ana.sub$DATE <- as.Date(rownames(ana.sub)) 
      rownames(ana.sub) <- 1:nrow(ana.sub) 
      ana.sub$ID <- rownames(ana.sub) 
    
      cumulative.t <- c()
      cum.t <- 0
      for(i in 1:nrow(ana.sub)) {
          d.sub <- ana.sub[ana.sub$ID == i,]
          sub.t <- d.sub$total
          cum.t <- cum.t + sub.t
          cumulative.t <- c(cumulative.t, cum.t)
          }
      ana.sub$cum.t <- cumulative.t
    
      plot(ana.sub$DATE, ana.sub$cum.t, col ="red", type ="l", lty = 2, lwd=2,
           axes = FALSE,las =1,
           xlim = c(as.Date("2009-08-01"), as.Date("2009-12-31")),
           ylim = c(0, max(ana.sub$cum.t)*1.1),
           ylab ="", main = "")
        lines(ana.sub$DATE, ana.sub$total, col = "blue")
        lines(ana.sub$DATE, ana.sub$d, col ="orange")
        lines(ana.sub$DATE, ana.sub$u, col = "green")
        axis(1, at = as.Date(v.date), labels = F, pos = 0)
        axis(2, las = 1, pos = as.Date("2009-08-01")) -- [[はぜ]] &new{2009-12-22 (火) 14:10:42};
  • 要するに一日あたり観察数を集計するという,折れ線図を描く前段階についても知りたいということだったのね。
    観察対象を察知したときにその日付と時刻が記録されると。。。 例えば以下のようなデータですね
    > head(t)
    [1] "2009-08-01 05:20:30 JST" "2009-08-01 06:10:34 JST" "2009-08-01 07:23:30 JST"
    [4] "2009-08-01 10:50:19 JST" "2009-08-01 22:41:56 JST" "2009-08-02 07:09:01 JST"
    これを日付単位に何件であったか集計する。と。
    まず,日付の部分(この例だと,1文字目から10文字目まで)を取り出して,
    d <- substr(t, 1, 10)
    それを table 関数で集計するだけ。では?
    > table(d)
    d
    2009-08-01 2009-08-02 2009-08-04 2009-08-05 2009-08-08 
             5          6          5          4          3
    以下略
    あとは,先ほどのコメントにある方法で,table(d) を縦軸(頻度)として,折れ線グラフを描くだけでしょう。横軸は,names(table(d)) で取れます(観察のなかった日付は出てきません)。
    長いプログラムだけ見せられても,テストデータがないと実行してみることもできないので,プログラムを読む気にはならないのです。テストデータも,現象を再現できる最小のものを用意する(できれば,R で生成するプログラムにしておくとよい)。 -- 河童の屁? 2009-12-22 (火) 14:56:23
  • ありがとうございます。早速試して見ます。投稿法、次回から気をつけます。 -- はぜ? 2009-12-22 (火) 15:16:40

行列の回転

GYOU? (2009-12-21 (月) 23:47:04)

こんにちは。
Rには行列を時計回りや反時計回りに回転する関数は無いのでしょうか?
例えば

1 2
3 4

という行列を時計回りに90度回転して

3 1
4 2

という具合です。
過去ログを探しましたが、グラフの文字列を回転する話ばかりで、行列の回転は見当たりませんでした。自作するしか無いのでしょうか?

  • 自作するというほどのことでもなくない? -- にせ河童? 2009-12-22 (火) 00:26:56
    m <- matrix(1:16, 4, byrow=T)
    n <- m
    for(i in 1:ncol(m)){ n[i,] <- rev(m[,i]) }
    for(i in 1:ncol(m)){ n[,i] <- rev(m[i,]) }
  • 基本的には t(apply(m, 2, rev)) で時計回り90度回転,apply(m, 1, rev) で反時計回り90度回転がでができますね。180度回転は,rotate <- function(m) apply(m, 1, rev) を定義しておいてrotate(rotate(m))よいでしょう。
    このやり方だと,正方行列でない場合もちゃんと回転できます。 -- 河童の屁? 2009-12-22 (火) 09:19:36
  • 例文の紹介ありがとうございます。確かに1~2行でできますね。簡単すぎるから関数として用意されていないのでしょうか。 -- GYOU? 2009-12-23 (水) 08:11:37

次の図を見るためには<Return>キーを押して下さいと表示される図のひとつまたはすべてを保存する方法

ai? (2009-12-14 (月) 23:45:42)

抽象的な質問で申し訳ありませんが,plot(ほにゃらら)とコマンドを入力すると,

次の図を見るためには<Return>キーを押して下さい:

と連続して表示される4つの図をepsに保存したいのですが,

par(mfrow=c(2, 2))

を使っても,最初の図しか保存されません。
どうしたらすべての図,または,3番目といったひとつの図をepsに保存できますか?

  • 最初に par(ask=FALSE) もしくは devAskNewPage?() としたらどうですか。 -- 2009-12-15 (火) 08:13:11
  • 手動で保存するのではなく自動で保存したいんですよね。ファイル出力の基本で,plot の前に postscript,plot の後に dev.off を入れるだけでしょう?
    個人的には pdf の方が好きですが,postscript の代わりに pdf 関数を使うだけです。 -- 河童の屁? 2009-12-15 (火) 09:11:57
    x <- rnorm(100)
    y <- rnorm(100)
    a <- lm(y~x)
    postscript("test%i.ps", width=300, height=200, onefile=FALSE)
    plot(a)
    dev.off()
  • 300 inch x 200 inchは大きすぎるのでは。元質問者の方の「連続する4つの図」が具体的にどのようなものかによって答えが変わると思います。普通のグラフィックなら、par(ask=FALSE)で4ページのpdfまたはpsにするところですが。 -- S? 2009-12-15 (火) 14:52:49
  • おっしゃるとおりですね。postscript はインチで指定するのでした。postscript でやると,ask は無関係になりますよね。onefile=FALSE のときには,1枚の図は1つずつのファイルに出力されます。一つのファイルに複数ページ作るなら onefile=TRUE にすればよいですね。latex で使ったりするときは,1ファイル1グラフでないとだめなのかも。
    par(ask=TRUE/FALSE) は "its use is deprecated in favour of devAskNewPage?" ということですが,スクリーン・デバイスの場合はどちらを使って指定しても,R 2.10.1 では(?)必ず par(ask=TRUE), devAskNewPage?(TRUE) の動作をするようですね。前は,par(ask=FALSE) でノンストップ表示(結果的に最後のグラフだけが見える)だったのだけど。
    > x <- rnorm(100)
    > y <- rnorm(100)
    > a <- lm(y~x)
    > plot(a)
     ページ変更を確認するまで待機中... # Windows 版でも同じプロンプトだったと思うけど、
     ページ変更を確認するまで待機中... # 変わったのだろうか
     ページ変更を確認するまで待機中... # スクリーン・デバイスの上に、
     ページ変更を確認するまで待機中... # 「クリックまたはENTERキーを押すと次のページに移ります」と出てる
    > devAskNewPage()             # FALSE なのに聞いてくる
    [1] FALSE
    いつから変わったのかな。 -- 河童の屁? 2009-12-15 (火) 15:54:23
  • 自動で保存したいんですよね>はいそうです。河童の屁さん,ありがとうございます。%iとonefile=FALSEで目的達成しました。par(ask=FALSE)もはじめて知りました。一応切り替わっているみたいですが,結果には影響しません。仕様が変わったのですね。とにかくありがとうございました。 -- ai? 2009-12-15 (火) 23:55:20

plot(ksvm)について

lemon? (2009-12-14 (月) 13:44:20)

kesvmでplot(data.ksvm,data=x.cl[,1:2])の出力結果の意味が良く分かりません。
図の▲や●はデータを示すと思われるのですが、図の右側の濃淡がどのような意味を持っているのか分かりません。
説明が載っているところがあればお教え下さい。

  • ? plot.ksvm -- 2009-12-14 (月) 15:45:02
  • 有難うございます。分類が確からしいところが濃くなるという解釈でよろしいのでしょうか? -- lemon? 2009-12-16 (水) 09:46:07

ダイナミックパネルデータ分析について

TAK? (2009-12-14 (月) 11:12:06)

R初心者です。
マザーズなどの上場企業のデータから、ダイナミックパネルデータ分析を行おうと思うのですが,以下のようなプログラミングでエラーが出てきてしまいます。何が原因なのか教えていただけないでしょうか?よろしくお願いいたします。

元データ(サービス.txt)

firm	yr	ROE	PCM	対数資産合計	対数売上高合計	流動比率	負債比率
	自己資本比率	無形資産比率	ジャスダック	マザーズ	ヘラクレス	
2003	2004	2005	2006	2007	2008
4	2005	8.14	0.826719577	2.894869657	3.480581787	158.13	146.08	
40.64	0.25477707	1	0	0	0	0	1	0	0	0
4	2007	20.76	2.829175122	3.47070443	3.923088515	205.42	83.72	
54.41	0.50744249	1	0	0	0	0	0	0	1	0
4	2004	37.79	3.044496487	2.85672889	3.329397879	170.66	143.73	
41.09	0.139082058	1	0	0	0	1	0	0	0	0
4	2006	38.67	3.814822174	3.197556213	3.70182693	159.65	133.83	
42.77	0.57106599	1	0	0	0	0	0	1	0	0
5	2008	5.2	2.394227616	3.875697762	3.484157424	111.38	421.96	
15.49	0.013313806	1	0	0	0	0	0	0	0	1

プログラム

library(plm)
SA <- read.table("サービス.txt", header=T)
SA <- plm.data(SA, index=c("firm", "yr"))
attach(SA)
form1 <- ROE~対数資産合計+対数売上高合計+流動比率+負債比率+自己資本比率+無形資産比率
emp.gmmSA = pgmm(dynformula(form1, lag=list(1,0,0,0,0,0,0)), data=SA, effect="twoways",
            model="twosteps", gmm.inst=~ROE,lag.gmm=c(2,99))

表示されるエラー

以下にエラー FUN(X[[4L]], ...) :  添え字が許される範囲外です。
  • 5行だけのデータですか?行数(データ数)が少なすぎるからじゃないですか? -- 河童の屁,へ? 2009-12-14 (月) 21:18:04
  • ありがとうございます。しかし、実際のデータでは1786行です。NAも含まれていないので添え字が多すぎることもないと思うんですけど・・・。 -- TAK? 2009-12-15 (火) 01:04:36
  • 解決しました。年が飛び飛びなのでうまく分析できなかったようです。年が飛んでいるデータをすべて消したらうまく回るようになりました。 -- TAK? 2009-12-19 (土) 10:35:37

複数ファイル作成および展開方法

出口? (2009-12-10 (木) 19:32:48)

1ファイル内に47都道府県別のデータが混在しているものを、それぞれのエリア別(都道府県)に分けたく、以下のようなプログラムを記述しましたが、for構文の利用の仕方が違っているため、ファイル分割できません。
下記のプログラムですと、ToDohFuKen?が47のものだけが、x.iのデータフレームとして作成されます。

for ( i in 1:47) {
  x.i<- subset(Gr.Area, ToDohFuKen==i)
# Gr.Areaは、作業するもののデータフレーム
# ToDohFuKenは、Gr.Areaデータフレーム内に存在する変数名
}

期待する成果としては、X1、X2、X3、・・・X47と、47のデータフレームができあがることですが、ご教授いただけないでしょうか?

  • あなたのやりたいことは,d <- split(Gr.Area, Gr.Area$ToDohFuKen?) だけでよいのかな?d に d$`1` 〜 d$`47` の 47 個の要素を持つリストが得られますよ。x1, x2, ... というような変数に付値するよりは後で使うときに使いやすいと思いますけど。
    以下のプログラムを実行して見てください。Gr.Area と d を表示させてあなたのと同じ構成かどうか見てください。
    「1ファイル内に47都道府県別のデータが混在」というのがよくわからないので,違うなら,そのデータの構造をちょっと説明してください。 -- 河童の屁? 2009-12-10 (木) 19:56:12
    (Gr.Area <- data.frame(x1=rnorm(47), x2=rnorm(47), ToDohFuKen=1:47))
    (d <- split(Gr.Area, Gr.Area$ToDohFuKen))
    どうしても x1, x2, ... のようにしたければ
    for ( i in 1:47) {
      eval(parse(text=sprintf("x%i<- subset(Gr.Area, ToDohFuKen==i)", i)))
    }
    一行でやるなら
    eval(parse(text=sprintf("x%i<- subset(Gr.Area, ToDohFuKen==%i)", 1:47, 1:47)))
  • ご教授ありがとうございます。ファイルを分割して配布する必要がありましたのでfor構文のプログラムにて、課題が解決できました。「要素を持つリスト」に関する処理については、勉強の必要がありそうです。Rは奥が深く、とても勉強になります。 -- 出口? 2009-12-11 (金) 11:00:30

manovaのエラー

迷える黒い羊? (2009-12-10 (木) 17:59:04)

たぶん初歩的な問題(データ上の問題)だとは思うのですが、manovaの計算の際、下記のエラーが出ます。
エラーの意味をご教授願えませんでしょうか?

以下にエラー `contrasts<-`(`*tmp*`, value = "contr.Treatment") : 
   関数 "is" を見つけることができませんでした
  • エラーメッセージだけでなく,関連する行を含めてプログラム全体を載せてください。これだけでは,「is という関数がないのですね」ということしかいえないのでは? -- 河童の屁? 2009-12-10 (木) 18:05:11
  • 失礼しました。 -- 迷える黒い羊? 2009-12-10 (木) 18:10:34
  • 以下の関連行の中で、all_ldaは変数61、サンプル数83、speciesにnとpの2群の質的データになっています。 A,Bはその中の変数名です。
    なお、nのサンプル数は61、pのサンプル数は22です。 -- 迷える黒い羊? 2009-12-10 (木) 18:22:47
    > attach(all_lda)
    > all_lda_ma<-manova(cbind(A,B)~species) 
    以下にエラー `contrasts<-`(`*tmp*`, value = "contr.Treatment") :
         関数 "is" を見つけることができませんでした
  • 再現しませんねぇ。以下のプログラムをコピーして,Rコンソールへペーストして,結果が表示されますか?それとも同じエラーがでますか?あなたのデータは,こんな感じなんでしょうね? -- 河童の屁? 2009-12-10 (木) 18:34:42
    set.seed(11111)
    all_lda <- data.frame(A=rnorm(83), B=rnorm(83),
          species=rep(factor(c("n", "p")), c(61, 22)))
    attach(all_lda)
    all_lda_ma <- manova(cbind(A, B) ~ species)
    summary(all_lda_ma)
    detach(all_lda)
    以下のような結果が表示されると思うんですけど
              Df   Pillai approx F num Df den Df Pr(>F)
    species    1 0.019969  0.81504      2     80 0.4463
    Residuals 81
  • プログラムまでありがとうございます。家のDeskTopPCでは、上のコードではエラーは発生せずちゃんと計算できましたが、通常使っているNotePCでは、同様のエラーが出てしまいます。DTPCは2.9、Rcmdr1.3-5でNotePCでは2.10.0、Rcmdr1.5-3がインストールされています。この辺のバージョンの影響が考えられるでしょうか? -- 迷える黒い羊? 2009-12-11 (金) 02:27:23
  • 「NotePCでは2.10.0、Rcmdr1.5-3がインストール」で,Rcmdr 使わないで実行しても出るかどうか試してみましょう。また,コンソールで is とだけ入力すると何が出ますか? -- 河童の屁? 2009-12-11 (金) 06:12:24
  • Rcmdrを使わなくても出てしまいます。コンソールの実行結果は以下の通りです。 -- 迷える黒い羊? 2009-12-11 (金) 16:58:34
    > is
     エラー:  オブジェクト 'is' がありません
  • 普通は,is を入力すると関数定義が表示されるんですけど(methods:::is)。methods は標準インストールなので is がなくなるとは思えないのですけど。もう一度 R をインストールし直してみたらいかがでしょうか。 -- 河童の屁? 2009-12-11 (金) 17:43:41
  • 2.10をインストールをし直したら、is関数も表示され、manovaも計算できました。ただ、その上にRcmdr1.5-3をインストールしたらまたis関数がなくなってしまいました。しばらくはmanovaはDTPCで計算できますが、ちょっとすっきりしませんね。他のエラーが起こらない事を祈っております。 -- 迷える黒い羊? 2009-12-11 (金) 22:41:44
  • Rcmdrのオプションを付けないですのままで立ち上げると計算できました。Rcmdrとの相性が良くないようです。河童の屁様、色々とお手数をおかけしました。ありがとうございました。 -- 迷える黒い羊? 2009-12-11 (金) 22:48:38

組合せの数の関数について

R初心者? (2009-12-10 (木) 10:09:13)

R初心者です。
Rで「組合せの数」を求める関数かパッケージをご教示ください。
Excelのcombin関数に相当するものがありますでしょうか。
数学記号でnCr(n:総数,r:抜き取り数)と表示されるものです。
どうぞ,よろしくお願いします。

  • choose(n, r) -- surg? 2009-12-10 (木) 10:52:57
  • ご教示ありがとうございます。感謝,感謝です。 -- R初心者? 2009-12-10 (木) 12:29:37

Rで相乗平均を使った手法がありますか

sakura? (2009-12-10 (木) 06:32:15)

素朴な初心者質問です。具体的でなくて済みません。平均値に相乗平均を使うRのパッケージ(ライブラリー)って、あるのかなぁ??ということと、もし使うとするとどんな手順(組み込ませ方)があるのでしょう???という質問のですが・・・。よろしくお願いします。

  • 「平均値に相乗平均を使うRのパッケージ(ライブラリー)って、あるのかなぁ」という意味がよくわかりませんが,相乗平均を求める関数があるのだろうかという質問でしょうか?
    相乗平均とは幾何平均と同じものですね?以下のような関数を定義しておけばよいでしょう。
    それとも,例えば平均値の差の検定を行う t.test 関数みたいなやつで,平均値の差の検定ではなく相乗平均の差の検定を行うような関数を含むライブラリがあるかという質問でしょうか?そのような検定手法はないと思うので,そのような関数もライブラリもないと思います。多変量解析も含めて,いろいろな統計関数の中に mean 関数を使うものはいっぱいありますけど,その中の mean を全部以下の geomean で置き換えても,たとえ,何らかの結果が出力されても,理論的にそんな分析法はないということになると思いますけど。 -- 河童の屁? 2009-12-10 (木) 11:44:39
    geomean <- function(x, ...) exp(mean(log(x), ...))
    使用例
    > geomean(c(2,6,3,9))
    [1] 4.242641
    > geomean(c(1,2,3, NA), na.rm=TRUE)
    [1] 1.817121

データのタイミングを合わせる方法について

takahashi? (2009-12-09 (水) 21:02:16)

初心者です。よろしくお願いします。

例えば 

x <- c(1:14)
y <- c(-8, -13, -16, -15, -12, -6, 0, 9, 15, 33, 48, 46, 32, 24)

と言った、曲線(に近いデータ)があったとします。
この曲線で、xが0から14までを20等分された値、つまりx0 = 0, x1= 0.7, x2 = 0.14, x3= 0.35・・・からx20 = 14の時のそれぞれのyの値(y0, y1, y2, y3, ・・・y20)を得るにはどうしたら良いでしょうか。
医学の循環器の研究で、各心拍の長さがことなることと、データを得る機器によって、1秒間あたりのフレーム数が異なるため、得られたデータを何等分かし、時相を一致させる必要があるため、この様な処理が必要となりました。
またデータの曲線は、関数で表せないものが多いです。
凄く単純なことに思えますが、どうしても良いプログラムができません。よろしくお願いします。

  • 目次の中から,任意のX軸と曲線との交点(Y値)の値の算出 をクリックすると,答えが書いてありませんか。 -- 河童の屁? 2009-12-09 (水) 21:37:23
    x <- 1:14
    y <- c(-8, -13, -16, -15, -12, -6,
      0, 9, 15, 33, 48, 46, 32, 24)
    ans <- spline(x, y)
    ans2 <- spline(x, y,
      xout=seq(0, 14, length=21))
    plot(x, y)
    lines(ans$x, ans$y)
    points(ans2$x, ans2$y, pch=19,
      col=2, cex=0.7)
    legend("bottomright",
      c("観察値", "予測値"),
      pch=c(1,19), col=c("black", "red"))
    spline2.png
  • ありがとうございました。早速この方法でトライしてみます。 -- takahashi? 2009-12-13 (日) 23:33:36

snowライブラリのエラー

のざわ? (2009-12-09 (水) 01:10:31)

お世話になります。

R-2.10.0でOSはopensolaris2009.06です。

以下のようなプログラムを作り実行させると

Error in unserialize(node$con) : error reading from connection

と、こんなエラーが帰ってきて、並列計算できません。
何が悪いのでしょうか?

library(snow)
cl <- makeCluster(4, type = "SOCK")
test.p <- function(a,b) {
  return((a+b))
}
clusterExport(cl, "test.p")
  • タイミングの問題はありそうです, cl <- makeCluster(4, type = "SOCK") 後に, Sys.sleep(10)を挿入しても同じでしょうか?. 可能なら安定性に置いてはRmpiの方が*マシ*(良くは無い)です. -- 2009-12-09 (水) 21:48:54
  • はい同じ結果でした。。 -- のざわ? 2009-12-11 (金) 14:13:24
  • lam-mpi(メンテされてない)もしくはopenmpi(遅い)の何れかを入れてRmpiではどうでしょう -- 2009-12-15 (火) 23:06:11
  • Rmpiを入れると、Rmpi.soがロード出来ないと怒られます。問題なさそうにRmpi.soはインストールされ、場所もきちんと参照していますが。。 -- のざわ? 2009-12-16 (水) 10:56:56
  • 今頃やってみましたが, R上では "Rscript --args MASTER=hoge PORT=foo" などちゃんと渡してますが, シェルからexec すると何らかの原因で引数(シェル変数の展開かな? echoにすると大丈夫だし...)が --args --args --args に置き換わってます. OpenSolaris?のバグ(監査機能とか色々な仕組みがあるようですが)のような気がします. -- 2010-01-20 (水) 23:38:58

csvファイルを読ませたらなぜかデータがNAに

はぜ? (2009-12-08 (火) 16:32:16)

R始めたばかりです。
excelで作ったデータシートをcsv形式に変換させてread.csv("ファイル名")で読ませたのですが、なぜかデータ(数値、日付、文字列)の一部がNAになってしまいます。
元のexcelファイル、csvファイルとも調べましたが空白にしているセルはありません。
nrow("ファイル名")で行数を調べたところ、行数が実際のデータ数より多いので、データの一部がNA化するだけでなく、データが全く入力されていない末尾の空白行何行かもNAとして認識しているようです。
OSはWindowsXP、Rヴァージョンは2.10.0です。
どなたか解決策をご存知でしたらよろしくお願いします。

  • そのファイルのエンコーディングは何でしょうか?Windows版のRが仮定しているcp932ではないのに,cp932だと仮定して読んでいるからそんな風になっているのではないでしょうかね。
    エンコーディングが何であるかわからないということなら,read.csv("ファイル名", fileEncoding="euc-jp") などを試してみたらよい。euc-jp のところを,utf-8 とか utf-16 とかにしてみる。
    あまり大きなファイルでないなら,ここにアップロードしてみるとよいかな(大きいファイルなら,先頭部分だけ切り取って,同じ現象が起きるのを確認の上,アップロード)。
    > データが全く入力されていない末尾の空白行何行かもNAとして認識 それはちょっとねぇ,csv ファイルの作り方に問題があるのでは? -- 河童の屁? 2009-12-08 (火) 16:49:05
  • お騒がせしてすみません。原因は不明ですが、元のexcelファイルを新規ブックにコピペしてやり直したところ問題なく読んでくれました。 -- はぜ? 2009-12-08 (火) 17:05:45
  • コメントありがとうございます。当面の問題は解決しましたが原因不明なのも気持ちが悪いので・・・。 -- はぜ? 2009-12-08 (火) 17:28:32

ニューラルネット(nnet)の構造について

mako? (2009-12-08 (火) 14:15:32)

いつも参考にさせていただいています。
現在、ニューラルネットパッケージnnetの関数(nnet)を用いてニューラルネット構造(重み)を学習し、その構造(重み)を用いて別の環境(fortran等)で再現したいと考えています。

nnetを用いて学習はできるのですが、出力される重みwtsの構造がわからなくて困っています。入力層が1、中間層が4、出力層が1(例えば以下の例)の場合、重みwtsは13個作成されますが、、どういう順番(どこの接続)の値なのでしょうか?(そもそもなぜ13個になる?4(入力と中間)+4(中間と出力)+1(出力?)=9では?)

P <- matrix(sample(seq(-1,1,length=100), 100, replace=FALSE), ncol=1) 
target <- P^2                                   
result <- nnet(P, target, size=4, maxit=100)
y <- predict(result, P)
plot(P,y, col="blue", pch="+")
points(P,target, col="red", pch="x")

また、WEKAによるニューラルネットワーク機能で描けるようなネットワーク構造を描画するパッケージがあるでしょうか?

ヘルプやリファレンス等調べましたが見つけられませんでした。
このような質問をするところではないかも知れませんが、ご存知の方がおられたら助けてください。よろしくお願いいたします。

  • 結果を見るには summary をするのが常套手段では(オンラインヘルプを読むことと)。以下のようなことになっているようですよ。
    「ネットワーク構造を描画する」件ですが,ニューラルネット(nnet)」でググったら,北大の久保さんのページに久保さん自作の関数が紹介されていましたよ。
    「nnet() で作った neural network の例 (作図は久保の自作関数 plot.nn()) 」というところ -- 河童の屁? 2009-12-08 (火) 15:12:20
    > summary(result)
    a 1-4-1 network with 13 weights
    options were -
     b->h1 i1->h1 
      7.08  -7.27 
     b->h2 i1->h2 
     -1.15  -6.52 
     b->h3 i1->h3 
      7.54   7.06 
     b->h4 i1->h4 
      1.85  -8.71 
     b->o h1->o h2->o h3->o h4->o 
    14.84 -6.58  6.52 -9.10 -6.20 
    > result$wts
     [1]  7.081986 -7.272869 -1.148621 -6.524123  7.536072  7.062696
     [7]  1.854337 -8.707560 14.843569 -6.577558  6.517180 -9.097420
    [13] -6.203486
  • さっそくのアドバイスありがとうございます。オンラインヘルプの見出しには確かにsummary.nnetがあったのですが、中身がない?(nnetに飛ぶ)ので未開発なのかなと思っていました。(同様にprintもない。) 「summaryが常套手段」というのは一般的に関数にはsummaryが用意されているので、試してみること!という意味でしょうか?もしくはnnetのsummaryを記述している部分があるのでしょうか?(bはバイアスのb?)ちなみにRのバージョンは2.9.0です。 -- mako? 2009-12-08 (火) 15:42:48
  • 描画に関する情報もありがとうございます!参考にさせていただきます! -- mako? 2009-12-08 (火) 15:46:55
  • summary.nnet という関数があるかなと思えば,nnet:::summary.nnet をやって,そのプログラムを見れば,nnet:::print.summary.nnet で実際に表示する print 関数が見えます。 -- 河童の屁? 2009-12-08 (火) 15:55:03
  • アドバイスありがとうございます。あるかな?と思ったらこのような形で確認してみれば良いということですね。参考になりました。ちなみにR初心者なものでR-TipsP29を参考に「::」としていました。。(nnetなら::ででますが、summry.nnetは:::でないと出ないのですね。) -- mako? 2009-12-08 (火) 16:08:31

特定の時間が経過したら自動でプログラムを終了させたい

Saito? (2009-12-07 (月) 21:57:38)

いつもお世話になっております。
色々と調べ、試行錯誤しましたが、上手くできないので質問させてください。
あるプログラムを走らせていて、ある時間が経過しても終了しない場合、それを終了させるにはどのようにすればよいでしょうか?
自分ではstopifnot()、proc.time()、breakを上手く使えばよいのかな、と思ったのですが、上手くいきません。例えば

stopifnot(rnorm(1e+07)
proc.time()[3] > 1)

のような感じで、rnormに1秒以上かかるようなら、プログラムを中断させたいのですが…。ただ、proc.timeもRを起動してからの時間ですので、少し工夫がいるとは思うのですが…。
もしどなたか方法をご存知でしたら、ご教授願えないでしょうか?

  • system.time(rnorm(1e7))[1] > 1 では駄目ですか。 -- 2009-12-08 (火) 06:26:53
  • 回答ありがとうございます。ただ、そのコードですと、例えば私の環境(WinXPSP3, Core2, 2GHz, R-2.9.2)だと、1e7を1e8に変えて
    > system.time(rnorm(1e8))[1] 
    user.self      20.63
    くらいかかるようです。この状況で上記のコードを試すと、1秒を超えても計算が中断されません。きっちり20秒程度計算しているようです。
    1秒を越えた時点で計算が中断するようなプログラムがあれば助かるのですが…。 -- Saito? 2009-12-08 (火) 11:44:39
  • そのプログラムを起動する前に proc.time() を呼んでその時点での経過時間を覚えておき,そのプログラム中で proc.time() を呼んで差をとって,その差がある値より大きくなったら終了というようにしておく。そのプログラムの中で,どこに proc.time をおけるかどうかはプログラムによる。一つの関数だけを呼ぶような場合なら,その関数の内部に仕込まないといけないからプログラムソースを弄らないといけないことにもなる。いずれにせよ,そのプログラム中で,経過時間を測定する必要があろう。もう一つの方法は,経過時間を測るプログラムがそのプログラムの実行を監視・制御するようなものを考えればよいのだが,具体的には思いつかない。 -- 河童の屁? 2009-12-08 (火) 12:04:49
    prog <- function()
    {
    	s <- proc.time()[3]
    	repeat {
    		if (proc.time()[3]-s > 10) return(rnorm(100))
    	}
    }
    prog()
  • >経過時間を測るプログラムがそのプログラムの実行を監視・制御するようなものを考えればよい
    回答ありがとうございます。おそらく、これが私が求めているプログラムだと思います。
    河童の屁さんが紹介してくださったprog関数は、つまり、一度rnorm()が走り始めたら止まれないという点では、最初の方がご教授してくださったプログラムと一緒かと存じます。
    監視・制御というようなプログラムは作ったことがなく、作り方の見当もつきません。簡単な例でもよいので、もし、どなたか、監視・制御するようなプログラムをご存知でしたら、ご教授頂けないでしょうか。どうぞよろしくお願い致します。 -- Saito? 2009-12-08 (火) 13:46:40
  • Windows の場合はよくわからないけど,UNIX の場合なら,fork を使う。一定時間経ったら,子プロセスを kill してやる。例を参照 -- 河童の屁? 2009-12-08 (火) 13:58:15
  • 別スレッド作る方法とかありませんかね? -- 2009-12-08 (火) 16:34:41
  • 河童の屁さん、どうもありがとうございました。R上ではforkのようなコマンドはないのですね。Unix系もしくはCの勉強をしたいと思います。ありがとうございました。 -- Saito? 2009-12-08 (火) 20:27:54

Rが64bitでしか動きません

修士論文執筆中? (2009-12-06 (日) 12:53:08)

はじめまして.修士論文執筆中と申します.
ある時からRの32bitバージョンが起動しなくなってしまいました.

私はマックブックで OS X ver.10.6.2,CPUは2.4GHz Intel Core 2 Duo,メモリは2GB,という状況で使っています.
本来ならば32bitでしか起動しないはずですし,こないだまでそうだったのですが,ある時から急に64bitでしか起動しなくなってしまいました.

Rcmdrをインストールしようにもbitがあわないからか全く起動せず非常に困っています.

ちなみにR64bitからは次のようなデータを得られました.

sessionInfo()
R version 2.10.0 (2009-10-26)
x86_64-apple-darwin9.8.0

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats graphics grDevices utils datasets methods base

どうすれば32bitで起動するようになるでしょうか?
アドバイスをお願いいたします.

  • Mac 版の R は,http://r.research.att.com/ にあるように,32 bit 版起動用の GUI と 64 bit 版起動用の GUI が違うんですけど(以下を参照)。
    というわけで,いつの頃にか,なぜかはしらねど,64bit 起動用の GUI を使うようになってしまったのでは? -- 河童の屁? 2009-12-06 (日) 19:12:53
    Mac OS X GUI
    Version                                Build                   Download
    Mac OS X GUI rev. 5528 for R 2.10.x    tiger-Deployment        R-GUI-5528-2.10-tiger-Deployment.dmg
    Mac OS X GUI rev. 5528 for R 2.11.x    tiger-Deployment        R-GUI-5528-2.11-tiger-Deployment.dmg
    Mac OS X GUI rev. 5528 for R 2.10.x    leopard-Leopard         R-GUI-5528-2.10-leopard-Leopard.dmg
    Mac OS X GUI rev. 5528 for R 2.10.x    leopard-Leopard64       R-GUI-5528-2.10-leopard-Leopard64.dmg
    Mac OS X GUI rev. 5528 for R 2.11.x    leopard-Leopard         R-GUI-5528-2.11-leopard-Leopard.dmg
    Mac OS X GUI rev. 5528 for R 2.11.x    leopard-Leopard64       R-GUI-5528-2.11-leopard-Leopard64.dmg

悪化要因の分析方法

悩みの多い熊五郎? (2009-12-05 (土) 21:51:34)

修理受付データを分析して、解約を減らす方法を検討しています。修理には多くの部品が使われております。高額でもお客様は納得されれば修理しますし、安価でも解約になるケースがあり、どの部品が修理部材に使われると解約につながるのかを統計的に調べたいと思っています。Rをつかって、どの部品が交換されると解約される可能性が高いなのでの分析をすることが出来るのでしょうか?交換する部品は1個以上で、修理案件ごとに個数が異なります。
データとしては以下のようなデータが集計されています。

修理受付No  部品1 部品2 部品3 部品4 部品5 修理価格 修理解約
  001       PartA  PartB               1000   修理
 002       PartA  PartZ   PartC                     4500    修理
 003       PartV  PartA   PartB                     3000    解約
 004       PartD  PartS   PartB                     6000    解約
 ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
  999       PartZ                                    8000    修理

この調査をし対策をしたいと考えております。アドバイスをお願いします。

  • R でできるかどうかを考える前に,「統計学」でできるかどうか,その方法は妥当であるかどうかを考えましょう。
    可能性としては,判別分析でしょうね。判別分析というのは,複数の説明変数によって(複数の)結果(群)を予測する手法。関連する手法は,ロジット判別分析とか。
    なお,一般的に統計学手法でこのデータを扱うときには,あなたが提示したようなデータ形式ではなく,以下のようにする必要があるでしょうから,前もって了解しておいた方が良いでしょう。
    修理受付No  PartsA PartsB PartsC ... PartsZ 修理価格 修理解約
      001          1      1      0  ...    0    1000   修理
     002          1      0      1   ...    1     4500    修理
     003          1      1      0   ...    0     3000    解約
     004          0      1      0   ...    0     6000    解約
      :
      999          0      0      0   ...    1     8000    修理
    また,修理か解約かはどのパーツが使われたかだけに依存しているとも思えません(修理日数とか担当者の親切さとかなんとかにも関係する)ので,そのあたりのデータも集めておく方が良いでしょう。
    (投稿法も調べてからにしてくださいね。直しておきますから) -- 河童の屁? 2009-12-05 (土) 22:21:57

ネットワーク分析について

sibu? (2009-12-03 (木) 17:11:21)

こんにちは、私はネットワーク分析でテキストマイニングを行っているものなのですが。
テキストデータを形態素解析し、MLTPを用いて名詞に限定してbigramを求め、その結果を整形しネットワークマップ図にしようとこころ見たのですが。

> at<-read.csv("c:/temp/a.csv",head=FALSE)
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
   'c:/temp/a.csv' の readTableHeader で不完全な最終行が見つかりました 

というエラーが出てしまい、データを出力しようとしても

> at[1:30,]
 [1] ミマ\021爍ア <NA>      <NA>      <NA>      <NA>      <NA>      <NA>     
 [8] <NA>      <NA>      <NA>      <NA>      <NA>      <NA>      <NA>     
[15] <NA>      <NA>      <NA>      <NA>      <NA>      <NA>      <NA>     
[22] <NA>      <NA>      <NA>      <NA>      <NA>      <NA>      <NA>     
[29] <NA>      <NA>     

という風になり、データを解析できません
なぜこのようなエラーが出るのでしょうか? ご意見お聞かせください、お願いします。

  • そのエラーの原因は,入力ファイルの最後の EOF が最終行の末尾に付いているからではないでしょうか。エディタで開いて,最終行の末尾にカーソルを置いてリターンキーを押してファイル保存してみてください。読み込めるようになるはずです。
    なお,最近のバージョンでは,ファイルの末尾が,改行+EOF になっていなくても,ちゃんと読めるようになっているので,もしかしたら別の原因かも?入力した第1要素が文字化けしているので,入力ファイルのエンコーディングが OS のデフォルトとあっていないせいかもしれませんね(Windows で UTF-8 ファイルを読もうとしているとか,Mac で cp932 ファイルを読もうとしているとか)。 -- 河童の屁? 2009-12-03 (木) 18:42:55
  • 河童の屁さんの言う通りファイル形式が間違っていたのかと思い、データをワードパッドで開いて見た所文字化けをおこしてしていました。どうやら保存するときに何かミスをしてしまったようです。もう一度きちんと保存し、やり直した所無事プログラムが動いてくれました。河童の屁さんのおかげです、本当にありがとうございました。 -- 2009-12-04 (金) 12:51:01

contourplotの軸の目盛りを内側にしたい

Saito? (2009-12-01 (火) 17:53:41)

いつもお世話になっています。
過去の投稿、ネットを確認しましたが、見当たらなかったので質問させてください。
例えば

library(lattice)
contourplot(volcano)

で表示される四方の軸の目盛りを内側表示したいのですが、どのようにすればよいでしょうか。
plotであれば、

plot(1, 1, tcl=0.5)

とでもすればできるのですが。contourplotがやっている描画方法がよくわからず、うまく解決できませんでした。どなたか方法をご存知の方がいましたらご教授願えないでしょうか。

ちなみにR-2.9.2、WindowsXPです。
どうぞよろしくお願い致します。

  • contourplot(volcano,scales=list(tck=-1)) -- 2009-12-01 (火) 21:56:04
  • おお、なるほど、tckのほうで軸を書いてしまうというのは思いつきませんでした。どうもありがとうございました。 -- Saito? 2009-12-01 (火) 23:46:54

タイはタイのままの並び替えの方法

おむすび? (2009-11-30 (月) 21:26:10)

行列をつくって,それぞれの値を順番に置き換えたいのですが,どうしたらいいでしょう。

m<-matrix(c(2, 5, 1, 5, 10, 2, 10, 20, 5),nrow=3)

たとえば,rankでやると,

m2<-matrix(rank(m),nrow=3)

これを1から7にしたいのです。

ついでに,orderだと順番が違うのはなぜですか?

  • このようにしたいのですが。
    > m2
         [,1] [,2] [,3] 
    [1,]  2  3  4 
    [2,]  3  4  5 
    [3,]  1  2  3  
    1から5でした。すみません。 -- おむすび? 2009-11-30 (月) 22:07:31
  • > orderだと順番が違うのはなぜですか?
    確かに,オンラインヘルプの説明はわかりにくいかもしれないが,order は,一番小さいのは何番目にある要素か,二番目に小さい要素は何番目にある要素か,,,というのを求める関数ですよ。
    > order(c(4,2,1,5,3))
    [1] 3 2 5 1 4
    という例を考察すればよいでしょう。一番小さい1は3番目,2番目に小さい2は2番目,3番目に小さい3は5番目,4番目に小さい4は1番目,5番目に小さい(一番大きい)5は4番目ということ。
    一方 rank は順位付けを行うけど,同順位をどう扱うかは ties.method 引数で指定できるよとオンラインヘルプに書いてある。
    > x <- c(1,2,2,3,3,3,3,4,5)
    > rank(x, ties.method="average") # これが,デフォルト(平均順位)
    [1] 1.0 2.5 2.5 5.5 5.5 5.5 5.5 8.0 9.0
    > rank(x, ties.method="first")
    [1] 1 2 3 4 5 6 7 8 9
    > rank(x, ties.method="random")
    [1] 1 2 3 4 7 5 6 8 9
    > rank(x, ties.method="max")
    [1] 1 3 3 7 7 7 7 8 9
    > rank(x, ties.method="min") # これが世間でよく行われる方法?
    [1] 1 2 2 4 4 4 4 8 9
    とにかく,オンラインヘルプをよくお読みになることをおすすめします。
    また,投稿法についても,編集ウインドウの下にある「テキスト整形のルールを表示する」を参照することをおすすめしておきます。 -- 河童の屁? 2009-11-30 (月) 21:56:14
  • 河童の屁さん,ご丁寧にありがとうございます。しかし私の質問の仕方が悪かったです。
    > m2
         [,1] [,2] [,3] 
    [1,]  2  3  4 
    [2,]  3  4  5 
    [3,]  1  2  3 
    こんなのになりませんか? -- おむすび? 2009-11-30 (月) 22:29:53
  • たとえば,以下のようにすればよいでしょう。 -- 河童の屁? 2009-11-30 (月) 22:37:19
    > m <- matrix(c(2, 5, 1, 5, 10, 2, 10, 20, 5), nrow=3)
    > values <- as.numeric(names(table(m)))
    > m2 <- m
    > for (i in 1:length(values)) {
    + 	m2[m2 == values[i]] <- i
    + }
    > m2
         [,1] [,2] [,3]
    [1,]    2    3    4
    [2,]    3    4    5
    [3,]    1    2    3
  • コマンドの意味を理解するのにしばらく時間がかかりましたが,できました!すばらしい発想ですね。ありがとうございます。 -- おむすび? 2009-11-30 (月) 22:45:27

matplotでx軸に日付データを表示したい

kobayashi? (2009-11-29 (日) 22:19:04)

以下のようにデータを作り、エクセルのシリアル値であるDay(今回は例として適当に定義)を日付データ(newDay)にしてx軸をプロットします。

Day <- c(33000, 36000, 39000)
Value1 <- 1:3
Value2 <- 4:6
x <- data.frame(Value1, Value2)
newDay <- as.Date(Day, origin="1900/01/01")

plot(newDay, x[, 1], type="l")
matplot(newDay, x[, 1], type="l")

> x
  Value1 Value2
1      1      4
2      2      5
3      3      6
> newDay
[1] "1990-05-09" "1998-07-26" "2006-10-12"

すると、plotではx軸は日付データになってくれるのですが、matplotではx軸が変な値になってしまいます。(変換前のシリアル値にもなっていません)
原因及び解決方法を教えていただけないでしょうか。

  • newDay の as.integer( ) は,as.integer(newDay) ==> 7433 10433 13433 で,それは,origin="1970/01/01" になっているので,as.Date(newDay, origin="1970/01/01") == as.Date(as.integer(newDay), origin="1970/01/01") ==> "1990-05-09" "1998-07-26" "2006-10-12" ということになっています。
    で,matplot でも日付を目盛りラベルとして描こうと思うならば,以下のようにして自分で axis を使って描くしかないかも。 -- 河童の屁,もう寝る? 2009-11-29 (日) 22:53:33
    matplot(newDay, x[, 1], type="l", xaxt="n")
    axis(1, at=newDay, label=as.Date(newDay, origin="1970/01/01"))
    # 単に,axis(1, at=newDay, label=newDay) でよいようだ。。。

テキストマイニングについて

sisisi? (2009-11-25 (水) 10:20:58)

始めまして、私はテキストマイニングについて勉強しているものです。
最近は大学の講義データの講師の音声データと授業のスライドデータをテキスト化したものをテキストマイニングしようとしていますが、なかなか思うようにデータが集まりません。
このような異なる二つのデータをテキストを分析するときはどのような分析方法がよいのでしょうか?
どうかご意見お聞かせ下さい。

  • 「思うようにデータが集まらない」というのと、「どのような分析方法が良いのか」というのは、別々の質問でしょうか?それとも、前のは愚痴で、後者が質問ですか?だとすると、あなたは今はどのような方法で分析していて、それにはどのような問題点があるとお考えなのでしょうか。 -- 河童の屁? 2009-11-25 (水) 10:48:28
  • 返信が遅れて申しわけありません。愚痴のような事を言ってしまいすみません、後者の方が質問です。今はネットワーク分析や探索分析を用いて分析を行っているのですが、どちらも一つのデータを調べるときに使うものです。そこで二つの異なるデータを調べるときにはどんな分析方法があるかを質問させてもらいました。わかりにくくなってしまい申し訳ありません。 -- 2009-12-03 (木) 11:52:15

SIMCA分析

kao? (2009-11-24 (火) 15:00:05)


Rで、soft independent modeling of class analogy(SIMCA)分析を行いたいです。
パッケージがあるのであれば、教えていただけないでしょうか。
よろしくお願いします。

Rで、トランスログ

tsuyoshi? (2009-11-21 (土) 18:25:42)

初心者です
Rで、トランスログ生産関数分析をしたいです。
どなたかご存知でしたら教えていただけると幸いです。

  • 疑問点が曖昧なので、返事を出しにくいのじゃないでしょうか?「どなたか”何を”ご存知でしたら」と聞いてみては?Googleで調べると、http://oshiete1.watch.impress.co.jp/qa3229606.htmlがあるようですね. -- akira? 2009-11-23 (月) 08:51:12

傾いた tick mark

柳沢? (2009-11-20 (金) 03:16:30)

こんにちは.windows で R 2.9.0 を使っています.

例えば plot(c(1,22)) を描いたとします.そのとき y-axis の 5, 10, 15, 20 のところに tick mark が現れます. この tick mark を傾けることは可能ですか? それが「良いグラフィックス」かどうかは別問題としてください.

plot(c(1,22), yaxt='n')
text(rep(1,length(z<-axTicks(2))), z, '|', srt=-45)


が一番求めるものに近いのですが,xaxs='i' としない場合, 上記の text の中の x軸の値がいくつになるのかが分かりません.

どうぞよろしくお願いします.

  • 自分でつっこみです. text を使うと図の外に描けないのでだめでした. -- 柳沢? 2009-11-20 (金) 03:19:36
  • plotする前にx軸の値が分からない(座標が分からない)なんてことはないと思いますが…角度にこだわらないならpch="/"やpch="\\"ではダメですか? -- akira? 2009-11-20 (金) 11:00:31
  • tick-mark を自分で書きたい(画像,文字,線?)と言う意味でなら
     plot(c(1,22), yaxt='n')
     axis(2,tick=F)
     par(xpd=T)
     text(rep(par()$usr[1]-strwidth("|"),length(axTicks(2))),axTicks(2),"|",srt=45)
     par(xpd=F)
    こんな感じは参考になるかも -- 2009-11-20 (金) 11:15:52
  • どうもありがとうございました。サンキュー。 -- 柳沢? 2009-11-20 (金) 13:36:05

Date型の演算について

R初心者? (2009-11-18 (水) 00:58:33)

as.Date("2009-11-1")の1ヶ月後や2ヶ月後をRで計算できないものでしょうか?
1日後だったら、as.Date("2009-11-1")+1で簡単に計算できるのですが、1ヶ月後は
tail(seq(as.Date("2008-1-1"), len=2, by="1 month"), 1)
しか思いつかなかったので、質問させていただきました。
この方法だと、as.Dateの部分が日付のベクトルだとうまくいかなくなります。
何か良い方法があれば教えていただければと存じます。

  • よい方法を求める前に,「一ヶ月後」の定義をはっきりさせる必要があるでしょう。以下のようなテストデータで,不具合があることがわかります。 -- 河童の屁? 2009-11-18 (水) 09:23:48
    > test <- function(str)
    + {
    + 	str2 <- tail(seq(as.Date(str), len=2, by="1 month"), 1)
    + 	cat(sprintf("%s %i\n", str2, difftime(as.Date(str2), as.Date(str))))
    + }
    > test("2009-01-01")
    2009-02-01 31
    > test("2009-01-31") # 一ヶ月後は31日後になっている
    2009-03-03 31
    > test("2009-02-01") # 一ヶ月後は28日後になっており,
    2009-03-01 28        # 2月になっての一ヶ月後は1月最終日からの一ヶ月後より早い
    日付にベクトルを与えられないというのは本質的なものではなくて,以下のように対処すればよいだけでしょう。
    > func <- function(str)
    + {
    + 	sapply(str, function(str2) as.character(seq(as.Date(str2), len=2, by="1 month")[2]))
    + }
    > func(c("2009-01-01", "2009-01-31", "2009-02-01"))
      2009-01-01   2009-01-31   2009-02-01 
    "2009-02-01" "2009-03-03" "2009-03-01" 
    あるいは,as.POSIXct を使うと,引数がベクトルの場合でも指定日数後の日付を得ることができます。
    > as.POSIXct(c("2009-01-01", "2009-02-01"))+60*60*24*30
    [1] "2009-01-31 JST" "2009-03-03 JST"
  • 返信が遅くなってすみません。 日付の定義ですが、当面のところ 1/1 や 2/1 のように、 日にちは 1 日にしか使用しないので、月の部分を単純に増加させていき、 12 月の次は 1 月になれば問題ないです。 日付の演算をよくすることがあるので、 専用の関数が提供されているのかなと思ったのですが、 ご指摘いただいたような方法で、自分で作るしかないようですね。 素早いご回答ありがとうございました。大変、参考になりました。 -- R初心者? 2009-11-24 (火) 02:06:44

デンドログラム、またヒートマップのデンドログラムの高さ調節について

aoi? (2009-11-17 (火) 17:35:07)

いつも丁寧に教えてくださり、本当にありがとうございます。

実験データをもとにしてヒートマップとデンドログラムを書いています。大変単純な質問で恐縮なのですが、距離をユークリッドやマンハッタンではなくコサイン距離で書いてみたいと思っていて、一応は書くことができたのですが、デンドログラムが細かく分かれすぎてしまい、分岐の最後までpdfにしても書くことが出来ません。(heatmapにしてもhclustでplclustにしても同様です。)
heatmap 関数のmargins=c(5,5)も変更してみたり、pdfのサイズを大きくしたりしているのですがうまくいきません。もっと最後の分岐まで書きたいです(現状では長過ぎて裏返ってしまっています)良い方法がありましたら、教えていただければと思います。

ちなみにコサイン距離の関数は
http://rbloger.blog51.fc2.com/blog-entry-26.html
より利用させていただき

cosine.function <- function(x) { # 列ベクトルのコサイン距離の計算
  col.similarity <- matrix(NA, ncol=ncol(x), nrow=ncol(x))	# コサイン距離を格納する行列
  for (i in 1:ncol(x)) {
    for (j in 1:ncol(x)) {	 # コサイン距離の算出
      col.similarity[i, j] <- (x[, i] %*% x[, j])/(sqrt(sum(x[, i]^2))*sqrt(sum(x[, j]^2)))
    }
  }
  rownames(col.similarity) <- colnames(x)	 # 列名の付与
  colnames(col.similarity) <- colnames(x)	 # 行名の付与
  return(col.similarity)	 # コサイン距離の行列を返す
}

転置してheatmapの関数に組み込むようにheatmap関数を変更しています。

また

> sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-apple-darwin8.11.1

です。よろしくお願いします。

  • この関数を使って,どのようなデータを使ったらどんな風に不満足な図になるのかを他の人も追試できるようにしてくれないと,回答は難しいでしょう。あなたのやったことを再現できないといけないのですよ。
    「長過ぎて裏返ってしまう」というのさえ,どういうことなのか理解できません。 -- 河童の屁? 2009-11-17 (火) 17:40:46
  • ありがとうございます。失礼しました。データ自体は糖鎖とサンプルの反応値を集めた物です。
    例えば
    Answer1 Answer2 Answer3
    A       1       2       3
    B       5      10      15
    C      89     135      78
    D      26      49      42
    E      36      70      30
    F     167     216     144
    G     125     143      89
    H     145     229    1110
    I      13       5      11
    J      58      61      49
    K      77      91      25
    といったようなデータでこれでA,B,C・・・に当たる物が糖鎖で Answer1,Answer2・・・に当たる物がサンプルでこれが400行、300列くらいあります。 filemixmix.txt
    サンプルだとうまくいくのですが、データが大きくなるとデンドログラムの下の方がぺたんと折り返された形になってしまうのです。デンドログラムのみですと以下のような形です。
    mmscf_hclust.png
    この長さを調節するには関数のなかのどこを調節すればいいのか、もしくは他の関数を利用すれば良いのか、教えていただければと考えた次第です。-- aoi? 2009-11-17 (火) 18:09:15
  • Quartz ウィンドウに描いたのですか?plot, hclust のオプションも無関係ではないでしょうけど,なぜ,こんなに横幅の狭いグラフにしたのでしょうね。
    それはさておき,解決策を。
    mixmix.txt は,列名が不適切だったり,行あたりの変数の個数が異なる行があったりで read.table では読み込めないので,0/1 データからなる以下のような乱数データを使って説明します。下のプログラムをコピーして,コンソールにペーストすると,作業ディレクトリに dendrogram.pdf というファイルができます。
    プリントできるかどうかは気にせず(というか,そんなおおきなグラフは出力できないだろうけど),横幅の大きい pdf ファイルに出力します。width, height はインチ単位なので,その数値に72を掛けたものがピクセル数になります。
    以下のようにして書かれたファイルを何らかのソフト(Adobe Reader でもよい)で開いて,拡大すると,細部までちゃんと見えるでしょう。 -- 河童の屁? 2009-11-17 (火) 18:58:32
    set.seed(123456789)
    x <- matrix(sample(0:1, 400*300, replace=TRUE), 400) # 400行,300列のデータファイル
    pdf("dendrogram.pdf", width=150, height=6) # width, height を適当に設定(詰まっていれば大きく)
    plot(hclust(as.dist(cosine.function(x))), hang=-1)
    dev.off()
    dendrogram.png
  • 何とかデータファイルを読めました。1列目が名前になっているんですね。また,距離行列は,データを転置したものについて求めるのかな。いずれにしても,pdf ファイルに描き出せばよい。Quartz に描いてもよい。ウインドウの右下をつかんでは広げ,ウインドウを左に寄せて,また右下をつかんでは広げということを繰り返せば,横幅が拡大されて,細部が見えるようになるでしょうけど。 -- 今日の河童の屁は,これでおしまい? 2009-11-17 (火) 21:17:44
    x <- read.table("mixmix.txt", header=TRUE, sep="\t")
    pdf("dendrogram2.pdf", width=100, height=5)
    plot(hclust(as.dist(cosine.function(t(x[,-1])))), hang=-1)
    dev.off()
    なお,蛇足ではあるが,ブログから参照したという関数は無駄が多いというか稚拙なプログラムなので,以下のようにした方が300倍ほど速い。
    > cosine.function2 <- function(x)
    + {
    + 	x <- as.matrix(x)
    + 	ss <- 1/sqrt(colSums(x^2))
    + 	col.similarity <- t(x) %*% x*outer(ss, ss)
    + 	colnames(col.similarity) <- rownames(col.similarity) <- colnames(x)
    + 	return(col.similarity)
    + }
    > system.time(a1 <- cosine.function(t(x[,-1])))  # 二重の for ループを使っているので遅い!
       ユーザ   システム       経過  
        14.962      0.070     14.894 
    > system.time(a2 <- cosine.function2(t(x[,-1]))) # 圧倒的な速度
       ユーザ   システム       経過  
         0.046      0.002      0.048 
    > all.equal(a1, a2)                              # 言うまでもないが,同じ結果
    [1] TRUE
  • ありがとうございます!出来ました。hangを解除したらまたきれいになりました。 -- aoi? 2009-11-17 (火) 22:08:21
  • ありがとうございます。やってみます。大変感謝です。 -- aoi? 2009-11-17 (火) 22:10:13

求根、といえばいいのでしょうか

b.b.? (2009-11-17 (火) 14:49:43)

Height ~ SI * (1 + exp (8.285 -1.22 * log(60 + 16.195) - log(SI))) /
              (1 + exp(8.285 -1.22 * log(Age + 16.195) - log(SI)))

という非線形関数で、AgeとHeightが分かっている場合に、SIの値を求める方法を知りたいのですが、どのようにすればよいのでしょうか。

  • uniroot 関数を使います。
    > root <- function(Height, Age) {
    +      uniroot(function(SI) SI * (1 + exp(8.285 -1.22 * log(60  + 16.195) - log(SI))) /
    +                                (1 + exp(8.285 -1.22 * log(Age + 16.195) - log(SI))) -
    +                                   Height, c(0.01, 1e10))
    + }
    > root(8.889316, 50)
    $root  # これが答え
    [1] 10
    
    $f.root
    [1] -1.202766e-08
    
    $iter
    [1] 5
    
    $estim.prec
    [1] 6.103516e-05
    Height, Age, SI のうちの任意の 2 変数の値を与えれば,残りの 1 変数の値を求めることができるようにするには,stats パッケージの power.t.test などに参考になるプログラム例があります。 -- 今日は寒いぞ河童の屁? 2009-11-17 (火) 16:01:29
    > root <- function(Height=NULL, Age=NULL, SI=NULL) {
    + 	Height.function <- quote(SI * (1 + exp(8.285 -1.22 * log(60  + 16.195) - log(SI))) /
    + 	                              (1 + exp(8.285 -1.22 * log(Age + 16.195) - log(SI))))
    + 	if (sum(sapply(list(Height, Age, SI), is.null)) != 1) stop("NULL は 1 変数のみ")
    + 	if (is.null(Height)) {
    + 		Height <- eval(Height.function)
    + 	}
    + 	else if (is.null(Age)) {
    + 		Age <- uniroot(function(Age) eval(Height.function)-Height, c(1, 1000))$root
    + 	}
    + 	else if (is.null(SI)) {
    + 		SI <- uniroot(function(SI) eval(Height.function)-Height, c(0.01, 1e10))$root
    + 	}
    + 	return(c(Height=Height, Age=Age, SI=SI))
    + }
    > root(Height=8.889316, Age=50) # SI を求める
       Height       Age        SI 
     8.889316 50.000000 10.000000 
    > root(SI=10, Age=50)          # Height を求める
       Height       Age        SI 
     8.889316 50.000000 10.000000 
    > root(Height=8.889316, SI=10) # Age を求める
       Height       Age        SI 
     8.889316 50.000013 10.000000 

Cox比例ハザードモデルで生存期間を推定したい

akira? (2009-11-16 (月) 21:34:21)

library(survival)のcoxphで作成したモデルを使ってpredict.coxphで生存期間を予測したいと思うのですが、type="expected"を出力する方法が分からず、困っています.基本的なことなのでしょうが、教えていただけるとうれしいです

> fit <- coxph(Surv(time, status) ~ age + ph.ecog + strata(inst), lung) #このモデルを使って
> head(lung)
  inst time status age sex ph.ecog ph.karno pat.karno meal.cal wt.loss
1    3  306      2  74   1       1       90       100     1175      NA
2    3  455      2  68   1       0       90        90     1225      15
3    3 1010      1  56   1       0       90        90       NA      15
4    5  210      2  57   1       1       90        60     1150      11
5    1  883      2  60   1       0      100        90       NA       0
6   12 1022      1  74   1       1       50        80      513       0
> predict(fit,type="lp") #これは線形回帰の係数と思ってます
> predict(fit,type="expected") #これはモデルに使ったデータを回帰した生存期間ですよね?
> predict(fit,newdata=lung[1,]) #これはtype="lp"を返しますが...
# predict(fit,newdata=lung[1,],type="expected") #生存期間は返してくれない

type="lp"からリスクスコアは出せると思うのですが、log h(t) = a + b1x1 + b2x2 + ... + bnxn の時間tは出せないものでしょうか?
そもそも、理解を間違っているのでしょうか?

  • あなたが付けたコメントとオンラインヘルプの説明が微妙に(?)ずれている? -- 2009-11-16 (月) 22:28:29
    type: the type of predicted value.
      Choices are the linear predictor ("lp"),
      the risk score exp(lp) ("risk"),
      the expected number of events given the covariates and follow-up time ("expected"),
      and the terms of the linear predictor ("terms").
  • ありがとうございます.helpを読み違えてました.でも、それ以前にCox比例ハザードを理解できていないようで…あれから調べているのですが、はっきりしません.統計プロパーな質問かもしれませんが、もう少し教えて下さい.
    # lungのinst==1だけで動作を理解してみました.
    x <- subset(lung,subset=inst==1,select=c("time","status","age","ph.ecog"))
    cxfit <- coxph(Surv(time, status) ~ age + ph.ecog,x) # Coxモデルを作る
    all(exp(predict(cxfit,type="lp")) == predict(cxfit,type="risk")) # log(lp) = riskのこと
    predict(cxfit,type="terms") # log h(t) = a + b1x1 + b2x2 の b1x1 と b2x2 の項
    
    predict(cxfit,type="expected") # ここの返り値で思考が止まってしまいます.
    ヘルプの「the expected number of events given the covariates and follow-up time (‘"expected"’)」を見てtype="exprected"はeventの数は時間tにおけるstatusを返すと思い込んでいました… ← ここが分かっていない
    # で、predict.coxphで1つ目のデータを推定してみました.
    y <- x[1,]
    predict(cxfit,y,type="lp"); predict(cxfit,type="lp")[1] #ほぼ同じ値
    # predict(cxfit,y,type="risk"); predict(cxfit,type="risk")[1] #これもほぼ同じ値
    predict(cxfit,y,type="terms"); predict(cxfit,type="terms")[1,] #これもほぼ同じ値
    # predict.coxphはlp, risk, termをそれぞれ推定することは理解できました
    Cox比例ハザードはlog h(t) = a + b1x1 + b2x2 + ... + bnxn だから時間tに依存せずにlog h(t)が出るんですよね…そうすると、生存期間を臨床情報で多重回帰した式から生存期間は求められないような気がしてきました…どうでしょうか?-- akira? 2009-11-17 (火) 09:20:11
  • 自己レスです.思い違いを指摘してほしいので書きます.
    目的は「生存時間データを学習データにして未知のデータを判別したい」のですが、そもそもCox比例ハザードモデルは時間変数を右辺に持たないので、
    1. 特定時間のstatusでCox比例ハザードモデルを作る(イベントありがstatus=1)
    2. 未知データでpredict.coxphする
    3. リスクを計算して、risk>1ならイベントあり、risk<=1ならイベントなし
    と理解したのですが、「3」がすごく不安です. -- akira? 2009-11-17 (火) 14:03:32
  • 時間tに依存しないのは,h(t) ではなく, h(t)/h0(t) です -- surg? 2009-11-17 (火) 16:52:09
  • ありがとうございます.やっぱり、ちゃんと理解していないですね.「生兵法は…」と言われそうです…
    かなり混乱しているのですが、
    predict.coxphのtype="risk"は R = b1x1 + b2x2 + ... + bnxn ですよね.これはlog h(t) = a + b1x1 + b2x2 + ... + bnxn を変換した、log h(t) - a = b1x1 + ... + bnxnで、a = log h0(t) とした R = log (h(t)/h0(t)) のことなんでしょうか?
    考えていた判別は
    library(survival)
    x <- subset(lung,subset=inst==1,select=c("time","status","age","ph.ecog"))
    y <- x[1,]
    cxfit <- coxph(Surv(time, status==1) ~ age + ph.ecog,x) # Coxモデルを作る
    predict(cxfit,y,type="risk") # yのstatusが「1」となるリスク
           5 
    1.027764 
    y$status
    [1] 2
    #「predict(cxfit,y,type="risk")が1より大きいが、y$statusは「2」なのでpredictと一致しない」
    と思っていたのですが -- akira? 2009-11-17 (火) 21:44:32
  • b1x1 + b2x2 + ... + bnxn は lp (linear predictor) で、type="risk" だと exp(lp) ですよね。それ以前にイベントの有無は時間に大きく依存しているので,lp や exp(lp) の値でイベントの有無を判別するのは無理だと思いますが。「特定時点のstatus」と書いてありますが,Cox 回帰である以上,イベントありの場合はイベントの発生した時間が time に入っているんですよね? -- surg? 2009-11-18 (水) 21:58:24
  • surgさん、ありがとうございます.質問内容が「統計学なんでもあり」かなと思ってますが、クロスポストは嫌なので、もう少し教えて下さい.
    扱うデータはtime、status、変数を持ち、上のスクリプトを使ってご説明します.扱うデータは時間tにおける生死(status=2がdeath/censor,status=1がalive)情報と変数がageとph.ecogをもつデータ「x」です。
    このとき、「cxfit」はデータ「x」のageとph.ecogを変数にしたCox比例ハザードモデルなので、変数ageとph.ecogの値をもつデータ「y」があれば、z <- predict(cxfit,y,type="risk")が時間「t」におけるデータ「y」のリスク比を出す。
    で、今はstatus=2/status=1なので「z>=1ならstatus=2になるリスクが高い」と思っているのですが… -- akira? 2009-11-19 (木) 08:40:18
  • predict(type="risk")が返す値(exp(lp))はハザード比です。ハザードと生存率(死亡率)との関係について,調べられた方がよろしいかと. -- surg? 2009-11-19 (木) 15:39:54
  • ありがとうございます.なんとなく分かってました.これ以上は勉強の範疇なので、読み漁ります.もし、R的な疑問が出たら別スレッドをたてます. -- akira? 2009-11-20 (金) 11:15:01

テキストマイニングのネットワーク分析について教えてください

sibu? (2009-11-16 (月) 15:01:39)

私はネットワーク分析でテキストマイニングを行おうとしているのですが

ー structure(.External("dotTclObjv", objv, PACKAGE = "tcltk"), class = "tclObj") : 
 [tcl] bad screen distance "R_call 01C0BFF8 1.38998e+213raph".

というエラーが出て分析することができないのです。
Rについては初心者でこのエラーが何を意味するかわかりません
どうかこのエラーの意味を教えてください。
ちなみに今回のネットワーク分析ではigraphとtcltkを使っています。

  • 何をどうやってこのエラーがでたかも書いておくとよいと思いますけど。石田先生のページに bad screen distance について言及があった
    1.38998e+213 などという数値(何を表す数値か知りませんが)が,でかすぎるからじゃないでしょうか?
    これだけの情報でも的確なコメントができるスーパーマンもいるようなので,もう少しお待ち下さい。 -- 河童の屁? 2009-11-16 (月) 15:44:59
  • 質問したものですが、無事分析を終えることができました。結局エラーの原因はよくわからなかったのですが、一行のプログラムを二行にわけて書いたのがいけなかったのでしょうか? 兎も角無事解決することができました、河童の屁さんどうもありがとうございました。 -- sibu? 2009-11-17 (火) 12:38:47

Mantel-Haenszel testついて教えてください

sakura? (2009-11-15 (日) 18:37:09)

epiRにあるcmh.testとmantelhaen.test(stats)では微妙に結果が違うのは何故でしょうか?

  • どのようなデータをどのように適用したら,どのような結果が得られたかを追試できるように,あなたがやったことをそのまんまコピー・ペーストすれば宜しいのではないかと思いますけど。これだけの情報でも,わかるよという方もいると思いますので,もう少しお待ち下さい。
    =====少し時間経過がありまして
    epiR に cmh.test は,ないのじゃないかと思うのですけど,まちがってますか? lawstat ライブラリにある奴なんですかねえ? もう少し勉強した河童
    cmh.test {lawstat}	R Documentation
    The Cochran-Mantel-Haenszel Chi-square Test
    
    Description
    
    This function performs the Cochran-Mantel-Haenszel (CMH) procedure. The CMH
    procedure tests independence of two variables in each stratum, conditionally 
    on the levels of a third variable. This procedure is widely used in various    
    law cases, in particular, on equal employment and discrimination, as well in 
    biopharmaceutical studies (Agresti, 2002; Gastwirth, 1984; Hall et al., 1999).
    
    mantelhaen.test {stats}	R Documentation
    Cochran-Mantel-Haenszel Chi-Squared Test for Count Data
    
    Description
    
    Performs a Cochran-Mantel-Haenszel chi-squared test of the null that two   
    nominal variables are conditionally independent in each stratum, assuming that 
    there is no three-way interaction.
    単に,オンヘルプをコピーしただけの河童でした。
    =====少し時間経過がありまして
    で,もうちょっとやってみて,両者の違いがこんな具合だと言うことも確認しましたが,その次は,それぞれのプログラムを読んでみることかなあ。
    > cmh.test(blackhire
    
    	Cochran-Mantel-Haenszel Chi-square Test
    
    data:  blackhire 
    CMH statistic = 145.840, df = 1.000, p-value = 0.000, MH Estimate =
    0.477, Pooled Odd Ratio = 0.639, Odd Ratio of level 1 = 1.329, Odd
    Ratio of level 2 = 0.378, Odd Ratio of level 3 = 0.508, Odd Ratio of
    level 4 = 0.357, Odd Ratio of level 5 = 0.209, Odd Ratio of level 6 =
    0.412, Odd Ratio of level 7 = 0.250, Odd Ratio of level 8 = 0.820 
    
    > mantelhaen.test(blackhire)
    
    	Mantel-Haenszel chi-squared test with continuity correction
    
    data:  blackhire 
    Mantel-Haenszel X-squared = 145.2466, df = 1, p-value < 2.2e-16
    alternative hypothesis: true common odds ratio is not equal to 1 
    95 percent confidence interval:
     0.4225550 0.5395037 
    sample estimates:
    common odds ratio 
            0.4774621 
    カイ二乗値が 145.84 と 145.2466 の違いなんですね??たいへんだあ
    =====少し時間経過がありまして
    さてね〜〜〜 プログラムを読んで,見まして,追加しますよ。(苦労してるんですよ。なんで,あなたのために苦労する必要があるのかわからないけど。。。)
    つまりは,デフォルトで連続性の補正をするかどうかの違いじゃないっかな。
    mantelhaen.test で,連続性の補正をしないように指定すると, cmh.test のデフォルトの結果と同じ答えになるでしょう。
    > mantelhaen.test(blackhire,correct=FALSE)
    
    	Mantel-Haenszel chi-squared test without continuity correction
    
    data:  blackhire 
    Mantel-Haenszel X-squared = 145.8403, df = 1, p-value < 2.2e-16
    alternative hypothesis: true common odds ratio is not equal to 1 
    95 percent confidence interval:
     0.4225550 0.5395037 
    sample estimates:
    common odds ratio 
            0.4774621 
    このような確認は,必要だと思う人(ユーザ)が自分でやることかなあ。どこかに書いておいてくれればよいことでしょうけど。そのようなものがないときは,こんな風にすれば,確認できるでしょうという筋道の例示としては存在意義があるのかなあ? -- 推測力に乏しい河童の屁? 2009-11-15 (日) 19:47:59
  • cmh.test はlawstat ライブラリでした。申し訳ありません。具体的数値を載せられなくて済みません。思慮深い配慮を頂きありがとうございます。htestクラスの結果の日本語化にわずかに表記されていますが、連続性の補正の意味が呑み込めないでいるところです。不勉強でお恥ずかしい限りです。 -- sakura? 2009-11-16 (月) 00:38:37
  • > 連続性の補正の意味が呑み込めないでいるところです
    検定統計量がとびとびの値しかとらないのを,連続分布であるカイ二乗分布でもっとよく近似できるようにする操作です。2×2分割表のカイ二乗検定のイエーツの補正と同じ考え方。 -- 河童の屁? 2009-11-16 (月) 08:40:04
  • >2×2分割表のイエーツの補正(連続性の修正) には採用の是非について考え方がいろいろあるようですが、、、。 -- sakura? 2009-11-16 (月) 15:44:39
  • 2009/04/19(日)に「chisq.test()の出力について」という質問がこのWikiに出ていました。その中で、イエーツの補正のことが記載されています。
    Alan AgrestiのCategorical data analysis(second edition)を読んで著者の考え方が分かるものかどうか・・・。

行名の参照によるデータフレームのハンドリング

きむ? (2009-11-13 (金) 19:14:43)

少しづつRを使い始めています。
過去のQ&AやTipsを見たのですが、見つけきれませんでしたので、教えてください。

以下の様な2つのデータフレームがある場合、DB1(の行名)のうち、DB2(の行名)に含まれるものだけ抽出して新しいデータフレームDB3を作成するにはどのようにすれば良いでしょうか?
(例の場合、a,c,eだけのデータフレームにしたい)

DB1 <- as.data.frame(matrix(1:10,ncol=2))
rownames(DB1) <- letters[1:5]
DB2 <- as.data.frame(matrix(101:110,ncol=2))
rownames(DB2) <- letters[c(1,3,5,7,9)]

行名ではなく、要素であれば参照する方法はQ&Aで確認できたのですが、、行名の引用方法がわかりません。行名を要素に追加してからハンドリングすれば良いのかも知れませんが、行名を直接引用する方法があれば教えてください。

(ついでに、)同様に、行名でDB1に、DB2の値をリスト参照・追加して、DB3を作成することは可能でしょうか?
(DB1のa,c,eにDB2の要素値を追加する:EXCELのVLOOKUPのイメージ)

以上、
かなり基本的な質問かと思いますが、よろしくお願いいたします。

  • ?"%in%" ?match -- 2009-11-13 (金) 19:43:27
  • さっそくの回答ありがとうございました。DB3 <- DB1[rownames(DB1) %in% rownames(DB2),] でできました。R-Tipsも参照しているのですが、なれていない者はやりたいことができる関数になかなかたどりつけません。。本サイトの検索のコツも参照したのですが。。くじけずにがんばります。 ちなみに、追加の方は、DB3 <- cbind( DB1[rownames(DB1) %in% rownames(DB2),], DB2[rownames(DB1) %in% rownames(DB2),]) にはできました。DB1を削除したくないので、ひきつづき考えてみます。 -- きむ? 2009-11-13 (金) 21:23:43
  • DB3 <- cbind( DB1[rownames(DB1) %in% rownames(DB2),], DB2[rownames(DB1) %in% rownames(DB2),]) は,cbind ではなく,data.frame を使う方がよいですが,間違えていると思いますよ。どれとどれが結合しているか,よく確認してみて下さい。 -- 河童の屁? 2009-11-13 (金) 21:51:00
  • 色々なやり方があるでしょうけど,二つのデータフレームの列名には重複がないようにして,行名を持つ列を追加して,merge 関数を使って,不要な行名を持つ列を削除するというのが,確実でしょう。 -- 河童の屁? 2009-11-13 (金) 22:06:53
  • DB3 <- data.frame( DB1[rownames(DB1) %in% rownames(DB2),], DB2[rownames(DB2) %in% rownames(DB1),]) でした。。河童さま、ご指摘ありがとうございました。data.frameを使うとDB1とDB2の列名が識別されるのでした! -- きむ? 2009-11-13 (金) 22:08:48
  • merge関数についても調べてみます。とっかかりをいただきありがとうございます。 -- きむ? 2009-11-13 (金) 22:10:40
  • DB3 <- data.frame( DB1[rownames(DB1) %in% rownames(DB2),], DB2[rownames(DB2) %in% rownames(DB1),]) も間違えていますよ。正しい答えのように見えるのは,DB2 が特殊だからです。例えば,下に示すような DB2 のとき,あなたのプログラムは正しい答えを示さないでしょう。 -- 河童の屁? 2009-11-13 (金) 22:14:21
    > DB1
      V1 V2
    a  1  6
    b  2  7
    c  3  8
    d  4  9
    e  5 10
    > DB2
       W1  W2
    c 102 107
    g 104 109
    i 105 110
    a 101 106
    e 103 108
    > db1 <- data.frame(ID=rownames(DB1), DB1)
    > db2 <- data.frame(ID=rownames(DB2), DB2)
    > db3 <- merge(db1, db2)
    > rownames(db3) <- db3[,1]
    > db3 <- db3[-1]
    > db3                 # 正しい答えは,これです
      V1 V2  W1  W2
    a  1  6 101 106
    c  3  8 102 107
    e  5 10 103 108
  • たまたま並び順が同じだから、、ということですね?(DB2の順がランダムだと×) やはり手抜き?をせずに行名を要素で追加してmerge関数(by指定)で合成してから%in%で抽出するようにします。 ちなみにdata.frame・・・の方だとforを使わなければいけないのですよね。 -- きむ? 2009-11-13 (金) 22:33:17
  • かっぱ様ありがとうございます。↑は式欄を入力いただく前に記入してしまいました。 -- きむ? 2009-11-13 (金) 22:37:02
  • db3 <- merge(db1, db2) ではうまくいかなかったので、db3 <- merge(db1, db2,by="ID") でうまくいきました。 ありがとうございました!! -- きむ? 2009-11-13 (金) 22:40:17
  • by は要らないはずですけど(指定した方が間違いはないけど) -- 河童の屁? 2009-11-13 (金) 22:42:27
  • 手抜きをして元の列名が同じ、元のDB1とDB2で実行していました。(この場合、”<0 行> (または長さ0のrow.names) ”とでました。) DB2の列名を変えるとOKでした。 奥が深いです。。 -- きむ? 2009-11-13 (金) 22:50:50

イベント発生時刻のリストからヒストグラムを作りたい

motok? (2009-11-13 (金) 14:37:25)

あるイベントが発生した時刻を "2009.11.13 14:32" の形で1行に1個づつ記録したデータファイルがあります。同じ時刻(1分以内)にイベントが発生すると、その時刻が2個3個と記録されます。
このデータファイルから例えば5分刻みのイベント発生頻度を数えてヒストグラムにしたいのですが、ちょっと手も足も出ていません。

mydata <- read.table("test.dat", sep=",")
names(mydata) <- c("event")
attach(mydata)
x <- strptime(event, format="%Y.%m.%d %H:%M")

として文字列を時刻オブジェクト(?)にしたところで立ち往生しています。
なにかヒントを頂けるととてもうれしいです。
# FAQでないことをいのりつつ。

  • cut して table で数えて plot したら? -- フォルテ? 2009-11-13 (金) 15:20:36
  • て言うかさ、自分が書いたのがちゃんと表示されているかチェックしないのかな? pre> って何さ。試せるデータは? -- フォルテ? 2009-11-13 (金) 15:22:52
  • HTML タグを使ったつもりなんでしょうね。で,直し方もわからないと。で,直しておきました。 -- 河童の屁? 2009-11-13 (金) 15:49:52
  • テストデータを適当に作ってやってみる。あなたがファイルから読み込んだデータを,ここで作ったデータ(x)の書式にあうように変換する必要があるかもしれないけど,答えは得られる。
    ランダムな時間データを作る方法を探すのが面倒だったので,Sys.time からランダムな整数を引いてやるという強硬手段を使ってしまった。
    as.POSIXct("2009-11-13 12:45:35 JST") + sample(10, 5, replace=TRUE)
    のようにするほうが,再現性を保証するためにはよいだろうけど。 -- 河童の合羽も雨に濡れ? 2009-11-13 (金) 16:30:22
    > x <- sort(Sys.time()-sample(3600, 2000)-10000, replace=TRUE)
    > head(x) # 以下のようなフォーマットです(このほかにも許容されるフォーマットがある)
    [1] "2009-11-13 12:45:35 JST" "2009-11-13 12:45:36 JST" "2009-11-13 12:45:38 JST"
    [4] "2009-11-13 12:45:39 JST" "2009-11-13 12:45:41 JST" "2009-11-13 12:45:43 JST"
    > y <- difftime(x[-1], x[-2000], units="secs") # 時間の差をとる(単位は sec で)
    > head(y)
    Time differences in secs
    [1] 1 2 1 2 2 1
    > hist(y, breaks=c(seq(0, 20, by=1))) # 階級幅はお好きなように
  • もろもろ至りませんですみません。どうも有り難うございました。 -- motok? 2009-11-13 (金) 16:38:46

変数の多い主成分で、第一主成分への寄与率の大きい変数を探す方法

主成分分析初心者? (2009-11-10 (火) 17:03:08)

Rコマンダーを使用し、主成分分析を行ってます。手順は、コマンダーで、エクセルを読み込んで、主成分分析を行い、寄与率をエクセルにコピペしている初心者です。
変数が多くなり(40変数)どれが、有効な変数なのか、苦戦しております。
現在は、コマンダーで出た、

Dataset <- sqlQuery(channel = 1, select * from [Sheet3$])
.PC <- 
  princomp(~変数1+変数2+・・・・+変数40,
   cor=TRUE, data=Dataset)
unclass(loadings(.PC))  # component loadings
.PC$sd^2  # component variances
summary(.PC) # proportions of variance
remove(.PC)

をもとに、エディターで、

princomp(~○○,  cor=TRUE, data=Dataset)

○○部分を書き換えやっていましたが、40変数より39、38・・・とやっていこうとすると膨大なパターンを行わなくてはいけず、困っています。
出来ましたら、組み合わせ的に、40変数より、変数39の時の計算方法39通りでの、第一主成分の寄与率が、保存できる方法がありましたら、どなたか教えて頂きたく、思います。よろしくお願いいたします。

  • 確認したいのですが,40 個の変数があって,その中から 1 つずつ変数を抜いて(つまり 39 個の変数を使って)40 通りの主成分分析を行い,それぞれの結果の第1主成分の寄与率を求めたいということですね?
    まず,毎回正直に主成分分析をする必要はないです。固有値固有ベクトルを求める eigen 関数を使い,返り値の value 要素の1番目の要素を記録するだけでよいです。
    また,データから 1 つずつ変数を抜いて毎回相関係数を求める必要はなく,40 変数全部を使った相関係数行列を求めておき,そこから,i 行,j 列を除いた相関係数行列を使うだけでよいです。
    そして,その操作を sapply 関数を使って組み立てればよいでしょう(for 文を使ってもよいですけど)。
    1 行でも書けますが,ちょっと馬鹿丁寧に書いてみましょう。
    set.seed(123456789)           # 毎回同じデータが得られるように,乱数の初期値を設定
    d <- matrix(rnorm(4000), 100) # 100x40のデータ行列(データフレームでもよい)
    r <- cor(d)  # すべての変数を使って相関係数行列を計算しておく
    sapply(1:40, # 1 番目から 40 番目の変数に対して順に以下を行う
    	function(i) {
    		r2 <- r[-i, -i]      # i 番目の変数を除いたときの相関係数行列
    		v <- eigen(r2)$value # 固有値ベクトルを v に付値 
    		return(v[1]/39)      # 1 番目の固有値を 39 で割ったものが,第 1 主成分の寄与率
    	}
    )
    答えは以下のようになります
     [1] 0.06285943 0.06326298 0.06333256 0.06192062 0.06229890 0.06145829
          中略
    [37] 0.06249882 0.06298219 0.06305921 0.06190447
    なお,このプログラムは,元の 40 個の変数が欠損値を含まないことを前提にしています。欠損値を含むときには相関係数行列を求めるときに,欠損値を含まないデータだけを使って相関係数行列を求めるようにしてください。
    上のプログラムの d に,エクセルから読み込んだデータの,余計なものを除いた必要な 40 個の変数だけを含む(40列の)データを付値すればよいのです。
    でも,これをやることで,重要な変数が選別できるかどうかはちょっと疑問ですね。 -- 河童の屁? 2009-11-10 (火) 17:52:20
  • 主成分分析で,主成分の個数と分析に含まれる変数を選択するには以下のような手順で行うとよいでしょう。
    まず,全部の変数を使って主成分分析を行う。固有値が1より大きいものの数を数え,それを主成分の数とする。
    主成分負荷量を求め(R で計算される loadings は,固有ベクトルであって,負荷量ではないので注意),それを二乗したものの行和(変数ごとの和)を求め,その値がある程度大きい(0.3とか0.4とか,相対的なものなのでこれと決まった閾値はない)変数を有用な変数とする。
    有用な変数だけを使い,決めた主成分の個数まで主成分を求めたものを最終の結果とする。
    どこやらにあった prcomp2 をデフォルトで使うと,固有値1以上の主成分が抽出され,Contribution と書かれた列の数値が主成分負荷量の二乗和で変数の重要性をあらわすものになる。 -- 河童の屁,第二弾? 2009-11-10 (火) 18:14:13
  • 早速のお返事ありがとうございます。小生の文章が不十分で、計算したいことが伝わらなかったのと、主成分分析の理解力のなさで、確認させてください。変数は、40あり(各変数には1680のデータだある)、初めは全変数40を使い主成分分析の第一主成分の寄与率を求める。次に変数を39にする。変数1を入れないで計算し、第一主成分の寄与率を求め、次に変数2を入れないで第一主成分の寄与率を求める。次に変数3で・・・、変数4で・・・、変数40を抜いて・・・。今度は、変数の数を38にして、変数1・2を除き、第一主成分の寄与率を求め、次に変数1・3を除き・・・。順に行い、変数の数を2個にて、計算を・・・。としたいのです。答えていただいた件は、理解すべく検討してみます。よろしくお願いいたします。 -- 主成分分析初心者? 2009-11-10 (火) 22:46:44
  • 要するに,使う変数の全ての組み合わせ(変数が1の場合を除く)について主成分分析をして,そのときの第一主成分の寄与率を求めたいと。。。そうですか,やってやれないことはないけど,繰り返しますがそれで,重要な変数を選べるかどうかははなはだ疑問。なぜかというと,40個の変数の全ての組み合わせは 2^40-40-1 とおりあるんですね(-40は変数の個数が1個になる分析,-1は変数が0になる分析)。その数は 1099511627735 個になります。出力するのも大変(もちろん計算はもっともっと大変),見るのはもっと大変。どんなプログラムになるか見てみたいですか(^_^;) -- 河童の屁は今日は最終弾? 2009-11-10 (火) 22:59:15
  • いつもお返事ありがとうございます。途方もない計算数なので、事象として、削除しながらやってみたのですが、イレギュラー的な値があり、気になってきたのです。変数の数39での第一主成分の寄与率の高いものの組み合わせ、38数での高いものと、順に、抽出するのは、パソコンでは、現実的でないのでしょうか?また、明日考えて見ます。 -- 主成分分析初心者? 2009-11-10 (火) 23:09:44
  • いずれ,このような回答が欲しいといわれるのではないかと思ってはいたのだけど
    > パソコンでは、現実的でないのでしょうか
    先ほどの数値どれほどかわかりますか?一回の主成分分析が 1/1000 秒でできるとしても,35年ほど掛かりますね。計算結果を A4 用紙に 1 枚当たり 100 行で書いたら,100 億枚の紙が必要です。
    http://aoki2.si.gunma-u.ac.jp/R/index.html にあるプログラムを参考にすると,以下のようなプログラムが書けます。
    繰り返しますが,このプログラムは実行しない方が良いでしょう。以下では変数の個数を 10 個にしていますので,コピペで動かしてもよいですけど,間違っても nv <- 40 にして実行しないで下さいね(^_^;)
    計算時間のことはともかく,このやり方では重要な変数を選ぶことはできないでしょう。 -- ちょっと時間が掛かった河童の屁? 2009-11-10 (火) 23:46:46
    set.seed(987654321) # 乱数初期化
    nv <- 10            # 変数の個数(ほどほどにしないと,死んでも終わらない)
    d <- matrix(rnorm(100*nv), 100)    # 100xnv データ行列
    r <- cor(d)         # 元の相関係数行列
    var.no <- paste("V", 1:nv, sep="") # 変数番号(どの変数が使われた分析か示すために)
    n <- 2^nv           # 組み合わせの数
    bincomb <- matrix(FALSE, nrow=n, ncol=nv) # 組み合わせの生成
    for (j in 1:nv) {
    	bincomb[, j] <- rep(c(rep(FALSE, n/2^j), rep(TRUE, n/2^j)), length = n)
    }
    bincomb <- bincomb[-1,] # どの変数も使われない場合を除く
    n <- n-1
    result <- numeric(n)    # 結果の保存
    vars <- character(n)    # 分析に使った変数名の保存
    for (i in 1:n) {
    	sel <- bincomb[i,] # どの変数が使われたかの論理ベクトル
    	vars[i] <- paste(var.no[sel], collapse=",") # 変数名記録
    	if (sum(sel) >= 2) {
    		result[i] <- eigen(r[sel, sel])$val[1]/sum(sel) # 結果の記録
    	}
    	else {
    		result[i] <- NA
    	}
    }
    RESULT <- data.frame(vars, result)         # 結果をデータフレームにして,
    o <- order(RESULT$result, decreasing=TRUE) # 寄与率の大きい順に並べ替えて,
    RESULT[o,]                                 # 表示
    以下のようなものが1023行も出ます
                                  vars             result
    72                            V4,V7 0.6079310385256367
    260                           V2,V8 0.5864172084814746
    514                           V1,V9 0.5793448970957535
    36                            V5,V8 0.5781238621539512
    272                           V2,V6 0.5730279383691933
      :
    959     V1,V2,V3,V5,V6,V7,V8,V9,V10 0.1507698641888030
    1015    V1,V2,V3,V4,V5,V6,V8,V9,V10 0.1506910833840152
    1023 V1,V2,V3,V4,V5,V6,V7,V8,V9,V10 0.1392082155345871
        以下ゴミの行が変数の個数分続く
  • あ〜〜,質問のタイトルだけ見ていて,「第一主成分への寄与率の大きい変数」って,なんだ40個全部の変数を使って第1固有値に対する固有ベクトルの絶対値が大きい変数が,求める変数じゃないですか。絶対値の大きい方から好きなだけ採って!!という,あっと驚く解答でしょう。 -- もう寝る河童の屁? 2009-11-11 (水) 00:37:42
  • 大変有難うございます。もやもやが、すっきりしました。業務上解析を手段に、多変量にて何かを見出そうとしていたのですが、とてもいい勉強になりました。40変数より、任意の変数を1つ決め組み合わせを行い、任意の変数6個まで無知ゆえやってましたが、貴重なご意見で、主成分分析に関する取り組みに新境地(レベルが低いですが、個人的には、新発見)が開けました。時間を見つけn=3くらいかやってみて、事象検討から変数設定を行ったものと比較してみます。返す返すも有難うございます。 -- 主成分分析初心者? 2009-11-11 (水) 09:25:27

R + eclipse + StatET のデバッグについて

初心者? (2009-11-08 (日) 11:41:34)

R + eclipse + StatET を導入して、無事、eclipse 上で R のコードを実行できるようになったのですが、
ブレークポイントを置いてデバッグするということはできません。
(ブレークポイントはおけるのですが、デバッグモードで R を起動できません)
これは設定が足りないだけなのでしょうか、それともそこまで StatET がサポートしていないのでしょうか。
R : 2.10.0, eclipse : 3.5.1, StatET : 0.8.0
よろしくお願いします。

階層型データフレームの作成

きむ? (2009-11-05 (木) 19:38:58)

かなりの初心者です。
windowsXPでRのver2.9.0を仕様しています。

データフレームのラベル設定に関する質問です。
いくつかのデータフレームを結合して一つのデータフレームにしようとしています。その際に、基のデータフレーム(名)を持った形で作成したいのですが、どのようにデータフレームを作成すれば良いでしょうか?

イメージしているのは、例えばライブラリ[kohonen]のサンプルデータ(nir)です。
spectra,composition, temperature, trainingといったカテゴリー?の下に個々にデータセットを有する形となっています。
(data(nir)とすることで、nir$spectra等でのハンドリングが可能)

例えば、以下のA、BというデータフレームからCを作成する場合に、どのような手順で処理を行えば上記例のようなデータフレームが作成できるのでしょうか?
(ex C$A,C$Bという形でハンドリングしたい)
(データセットのラベルはC$A.a, C$A.b, のように)

A <- data.frame(a=c(1, 2, 3), b=c(0, 0, 0))
B <- data.frame(a=c(4, 5, 6), b=c(1, 1, 1))
C <- cbind( A, B )

単純に上記のようにデータフレームを作成・結合し、paste関数とcolname関数を用いて(A.a, A.b,B.a,B.b)を与えてみたりしたのですが、うまくいきません。
(そもそも上記「nir」はdata関数が使えますが、上記で作成した「C」は使えません。)
(←作成したデータフレームをデータセットとして設定しないといけないのかもわかりませんが、その方法がわかりません。)

以上、
かなりまとまりのない質問ですみません。要は「nir」のようなデータフレームを作成する手順がわかりません。よろしくお願いします。

  • えーと、見てみたところnirはdata.frameではないわけですが…
    library(kohonen)
    data(nir)
    class(nir)
    nirのようなlistがつくりたい、ということであれば、
    A <- data.frame(a=c(1, 2, 3), b=c(0, 0, 0))
    B <- data.frame(a=c(4, 5, 6), b=c(1, 1, 1))
    (C <- list(A=A, B=B))
    でよろしいかと。 それとも、きむさんが必要としてるのは
    C <- cbind(A, B)
    names(C) <- c("A.a", "A.b", "B.a", "B.b")
    みたいなものなのかな。 nirのような「list」が得たいのか、C$A.a, C$A.b…のようなラベルが付いた「data.frame」が得たいのか、ちょっと分からないですけれども。 -- 2009-11-05 (木) 20:19:33
  • 早々のアドバイス、ありがとうございます!「nir」はlistでしたか。。勉強不足ですみません。基本的にはlistでOKです。たた、「nir」はdata関数を使う前はA.aのようなラベルがついたデータとして表示されるので、、そのあたりが良くわかりませんでした。(data(nir)としてからはlistで処理したように表示されます。。) -- きむ? 2009-11-05 (木) 21:05:01
  • すみません。上記は、nir <- as.data.frame(nir)とした「nir」を見ていたものでした。こうするとA.aのようなラベルがついたデータフレームにもできるのですね。もっと勉強します。ありがとうございました。 -- きむ? 2009-11-05 (木) 21:17:55
  • もう,片付いた問題なのかしらねども,C を作るのに cbind を使ったから列名がヘンチョコリンになったのかな。data.frameを使えば,規則性のある(元の名前の名残のある)名前になったのかなとも思いますが, -- 夜も更けて,寒々しい,河童の屁? 2009-11-05 (木) 22:14:04
    > A <- data.frame(a=c(1, 2, 3), b=c(0, 0, 0)) # コメントが,遅かりし?
    > B <- data.frame(a=c(4, 5, 6), b=c(1, 1, 1))
    > C2 <- data.frame(A, B) # データフレームの結合には,data.frame を使う,そうすれば,,,,
    > C2            # のように,同じ名前の列名は修飾されるので,識別可能となる
      a b a.1 b.1
    1 1 0   4   1
    2 2 0   5   1
    3 3 0   6   1
    > C2$a          # C2$a と
    [1] 1 2 3
    > C2$a.1        # C2$a.1 は,別物なんだ
    [1] 4 5 6    # でもね,その違いは些細なものなんだから,そんなのに依存して区別するのも考えもの

任意のX軸と曲線との交点(Y値)の値の算出

coro? (2009-10-31 (土) 01:50:23)

初心者です。このような質問をするのは恥ずかしい限りです。
windowsXPでversion2.3.0を使用しております。

作成した曲線と任意のX軸と曲線との垂直交点の値(Y値)を求める方法を探しております。
例えば、

V <- c(84,80,76,68,59,50,44,38,35,33,32,34,37,41,49,63,73,81)
plot(V,type="b")
abline(v=12.5)

上記にてX軸12.5のときのY値を算出するにはどのようにすればよいのでしょうか?細かいグリッドを付けて交点を探したりもしましたが、計算できる方法がありましたらお教え頂きたく投稿致しました。

  • まずお聞きしたいのは,「作成した曲線」と仰っているが,実際は折れ線ですので,X値を含む値域に対応する折れ線(直線)でY値を予測したいというのでしょうか。あるいは,このデータ点に何らかの曲線式をあてはめて,その曲線式において任意のX値のときのY値を求めたいのでしょうか。ということ。
    後者の場合には,なにか特別の曲線を意図しているのでしょうか(多項式曲線とか三角関数とかその他),あるいは,関数では表せないがデータ点を通るなめらかな曲線を使いたいのでしょうか?ということ。 -- 河童の屁? 2009-10-31 (土) 08:38:35
  • さっそくのお返事ありがとうございます。Y値を予測したいということであります。 -- coro? 2009-10-31 (土) 18:04:30
  • 「Y値を予測したい」ということは最初の質問でわかっています。どうやって,予測するかの選択肢が複数あるのでどれにしますか?と聞いているんです。(河童語は人間に通じないのだろうなあ) -- 河童の屁も馬耳東風?? 2009-10-31 (土) 20:51:48
  • お返事ありがとうございます。あるソフトを用いて上記の値を入力すると値が算出されるのですが、この折れ線に対してなんらかのフィッティング曲線を描いているらしいのですがブラックボックスでよくわからないのです。ご迷惑をおかけして申し訳ありません。自分なりにいろいろ試してみたのですがわからず投稿してしまった次第です。 -- coro? 2009-10-31 (土) 23:25:10
  • 「求める方法を探しております」と書いているので,「あるソフトを用いて上記の値を入力すると値が算出されるのですが,ブラックボックスでよくわからない」などということとは思いもよらず。それにしても,「あるソフト」などといわず,どういうソフトかぐらいの情報は書いてもよいのではないかな。そのソフトを使えば目的が達成できるなら,それでよいじゃあないですか? -- 遅く起きた河童の屁? 2009-11-01 (日) 10:00:27
  • 上記のコードだと、Rではxに1-18 (Vの数値の個数) をとり、yにVの値をプロットして、そのプロットを線で結んでいるだけです。そのソフトでどういう式でフィッティングしたかわからないと、任意のxに対応するyを調べることはできません。 -- aor? 2009-11-01 (日) 13:38:34
  • ↑いや,だからね,「そのソフトでどういう式でフィッティングしたか」を知りたいと言っているみたいなんですよ。そんなこと,そのソフトが何かなど,基本的な情報がなんにもないから,わからないでしょう?と回答しているところです。 -- 河童の屁? 2009-11-01 (日) 16:19:24
  • なかなか,話がスムーズに進まないので,こんな回答でも。そのソフトの挙動が「ブラックボックスでわからない」ということからすると,データさえ与えれば,ユーザが何の指定もせずに答えが出てくると言うことということから,スプライン関数を使っているのかなと推定。以下のようにすれば,R で答えが出てきますよ(二通りの関数を使ったが,少し異なった答えが出る)。 -- 疲れた河童の屁? 2009-11-01 (日) 16:54:06
    > x <- 1:18
    > V <- c(84,80,76,68,59,50,44,38,35,33,32,34,37,41,49,63,73,81)
    > plot(x, V,type="p")
    > ans <- spline(x, V, n=100)
    > lines(ans, col="red")
    > spline(x, V, n=100, xout=12.5)
    $x
    [1] 12.5
    
    $y
    [1] 35.44528
    
    > library(splines)
    > ans2 <- interpSpline(x, V)
    > predict(ans2, 12.5)
    $x
    [1] 12.5
    
    $y
    [1] 35.44523
    
    attr(,"class")
    [1] "xyVector"
    spline.png
  • 引越しでネット回線使えず返事遅れて申し訳ありませんでした。ご丁寧にお返事賜り申し訳ありません。いろいろ調べてみたのですがやはり教えてもらえないみたいなので、上記で算出した値とソフトの値の相関をとって検討したいと考えております。本当にありがとうございました。 -- coro? 2009-11-04 (水) 13:06:01

並列計算の計算経過の進行具合を表示させるには

Saito? (2009-10-29 (木) 14:57:19)

いつもお世話になっています。
今日は並列計算中の途中経過を表示(例えば全体の何%終わったか)させる方法についてご教授いただければ、と思います。例えば、普通のfor()だと、

M <- NULL
for (i in 1 : 1000) { 
 M[i] <- rnorm(1, i, 10)
cat(paste((i/1000)*100, "%"),  "\n")
}

とでもすれば、今、全体の何%ほど完了しているのか見ることができます。しかし、並列計算になってくると上手くいきません。以下に上手くいっていないサンプルコードを示します。

library(rlecuyer)
library(snow)
f <- function(n){
  a <- rnorm(1, n, 1)  
  b <- rnorm(1, n, 2)
  return(c(a=a, b=b))
}
cl <- makeSOCKcluster(c("localhost", "localhost"))
clusterSetupRNG (cl,seed=12)
clusterExport(cl, "f")
system.time(ff <- parSapply(cl, 1:10, 
function(x){return(f(1))
cat(paste((x/25)*100, "%"),  "\n")
})
)

計算結果はきちんと保存されていくのですが、進行具合が上手く表示されないようです。
どなたか、このような場合に上手く進行具合を表示させる方法をご存知でしたら、ご教授いただけないでしょうか。
なお、環境はR-2.10.0、WindowsXP(SP3)です。どうぞよろしくお願いいたします。

  • ぱっとみ、catがreturnのあとになってるからな気がします。 -- 2009-10-29 (木) 16:20:59
  • 返信ありがとうございます。catとreturnの場所を変えてみましたが、上手くいかないようです。-- Saito? 2009-10-29 (木) 16:23:55
    system.time(ff <- parSapply(cl, 1:10, 
    function(x){
    cat(paste((x/25)*100, "%"),  "\n")
    return(f(1))
    })
    )
  • makeSOCKclusterの引数にoutfile=""を加えましょう。The optionoutfile can be used to specify the file to which slave node output is to be directed. The default is /dev/null; during debugging of an installation it can be useful to set this to a proper file. On some systems setting outfile to "" or to /dev/tty will result in worker output being sent tothe terminal running the master process. -- 2009-10-29 (木) 16:56:20
  • なるほど。確かにこうすれば、ワーキングディレクトリにcat.txtが出来て、進行具合が保存されますね。
    cl <- makeSOCKcluster(c("localhost", "localhost"), outfile="cat.txt")
    ただ、欲をいえば、合計が100%になるような表示だと見易くて良いです。
    どうやらxの関数だと上手くいかないので今は、
    system.time(ff <- parSapply(cl, 1:10, 
    function(x){
    cat(paste((1/10)*100, "%"),  "\n")
    return(f(1))
    })
    )
    のようにしていますが、これだとcat.txtの中身は
    starting worker for localhost:10187 
    Type: EXEC 
     要求されたパッケージ rlecuyer をロード中です 
    Type: EXEC 
    Type: EXEC 
    10 % 
    10 % 
    10 % 
    10 % 
    10 % 
    となってしまい、10%の数を数えなければ進行状況がわかりません。
    まぁこのくらいの数なら数えればいいんですが、もっと多くなると少し面倒で…。
    これが自動で合計100%表示になるような処理の仕方があればご教授頂けないでしょうか。 本当は一回にかかった時間も10%表示の横に逐一出ればさらにいいのですが…。すみません。ちょっと欲張りすぎですね。もし可能であればご教授ください。-- Saito? 2009-10-29 (木) 17:12:10
  • すみません、自己レスです。xの関数だと上手くいかなかったはずなのですが、今上手く行きました。原因はよくわかりませんが、以下にコードを示します。
    cl <- makeSOCKcluster(c("localhost", "localhost"), outfile="cat3.txt")
    clusterSetupRNG (cl,seed=12) 
    clusterExport(cl, "f")
    system.time(ff <- parSapply(cl, 1:10,  function(x){
    cat(paste((x/10)*100, "%"),  "\n") 
    return(f(1))
    }) 
    )
    そのcat3.txt内の出力結果。
    starting worker for localhost:10187 
    Type: EXEC 
     要求されたパッケージ rlecuyer をロード中です 
    Type: EXEC 
    Type: EXEC 
    60 % 
    70 % 
    80 % 
    90 % 
    100 % 
    ただ、60%からスタートしているのが気にかかります。片方のコアの結果のみ出力しているのでしょうか? それと、試行回数を増やすと、なんだか変な出力になってしまうようです。以下に例を示します。
    system.time(ff <- parSapply(cl, 1:100, 
    function(x){
    cat(paste((x/100)*100, "%"),  "\n")
    return(f(1))
    })
    )
    結果。-- Saito? 2009-10-29 (木) 17:44:38
    starting worker for localhost:10187 
    Type: EXEC 
     要求されたパッケージ rlecuyer をロード中です 
    Type: EXEC 
    Type: EXEC 
    51 % 
    <snip>
    50 % 
     
    100 %
  • outfileはクラスタ(シングルコア)を想定してた時代の物(排他も無いし)なので, マルチコアかつWindows限定ならば -- 2009-10-29 (木) 21:12:03
    require(snow)
    cl <- makeCluster(2)
    clusterSetupRNG (cl,seed=12) 
    
    pbar.open<-function(cl)
    {
      dummy<-winProgressBar(paste(cl$host,cl$rank),"0%",0,100,0)
      close(dummy) # これはおまじない
      assign("pb",
             winProgressBar(paste(cl$host,cl$rank, "!!下にも居るよ!!"),
                             "0%",
                             0, 100, 0),
             envir=.GlobalEnv)
      NULL
    }
    pbar.close<-function(cl)
    {
      close(get("pb",envir=.GlobalEnv))
      NULL
    }
    clusterExport(cl, "pbar.open")
    clusterExport(cl, "pbar.close")
    
    f <- function(n){
      a <- rnorm(1, n, 1)  
      b <- rnorm(1, n, 2)
      return(c(a=a, b=b))
    }
    clusterExport(cl, "f")
    
    dummy<-clusterApply(cl,cl,pbar.open)
    
    ff <- parSapply(cl,
                    1:10,
                    function(x){
                       setWinProgressBar(pb,
                                         (x/10)*100,
                                         label=paste((x/10)*100,"%"))
                       Sys.sleep(5)
                       return(f(1))
                   })
    
    clusterCall(cl,pbar.close)
    stopCluster(cl)
    おまじない以外は自分で調べてみてください.
  • すごいですね!まさかこんな風に表示できるとは思っていませんでした。ありがとうございました。 -- Saito? 2009-10-30 (金) 14:25:41

出力された結果のコピー&ペースト

R使用開始3日目? (2009-10-29 (木) 13:24:28)

Rを使用して3日目の初心者です。よろしくお願いします。

得られたデータについて、Rでクロス集計を行い、その結果をExcelに移し、まとめたいと考えています。

data<-read.table("sample.csv", header=T, sep=",")
data[,3] <- factor(data[,3], levels=1:5, labels=c("AG", "CO", "EX", "NEUR", "OP"))
data[,2] <- factor(data[,2], levels=1:2, labels=c("男", "女"))
cross(2, 3, data, latex=F)

以上、クロス集計はできたのですが、その結果をRコンソールからコピー&ペーストでExcelに貼り付けようとすると、1行の毎の情報が1つのセルに情報が入ってしまい、情報が区切られていません。

                    person
sex     AG      CO      EX      NEUR    合計
男      7       6       7       8       28
%       25.0    21.4    25.0    28.6    100.0
女      4       9       5       4       22
%       18.2    40.9    22.7    18.2    100.0
合計    11      15      12      12      50
%       22.0    30.0    24.0    24.0    100.0

この表示のまま、つまり、各セルに「男」や「合計」、「24.0」などが入るように、Excelに情報を移したいのですが、どのような方法をとればいいでしょうか?

環境は、「Windows XP sp3」「R 2.9.2」です。

出来る範囲で色々と試してみたのですが、元々プログラム言語に触れたことがなく、分かりませんでした。

どうぞ、よろしくお願いします。

  • エクセルへ値コピー -- surg? 2009-10-29 (木) 13:28:49
  • おかしいですね。コンソール出力にはタブコードがちゃんと入っているので,エクセルにコピーするとちゃんとセルごとに分かれるようですけど(質問で出力をペーストしているのをみると,ちゃんとタブコードが生きている)。ウィンドウズだと違うのかな。 -- 河童の合羽? 2009-10-29 (木) 13:43:38
  • 河童の合羽さま 早速の返信ありがとうございます。 -- R使用開始3日目? 2009-10-29 (木) 13:47:12
  • Windows の Excel 2003 の場合,R のコンソール出力に含まれるタブコードを認識しないみたいですね。
    Excel にペースト後,「データ」→「区切り位置」→「カンマやタブなどの。。。」で,区切り文字としてタブ,スペースを選択して入力データを区切ってやる必要があるようですね。Excel がそういう仕様なのでしょうか。
    それも面倒な話なので,cross 関数の output 引数でファイル出力を指定し,そのファイルをExcel で入力するようにすれば,タブコードを認識してくれて,入力するだけでセルにそれぞれ入力できるようです。たくさんの表を読み込むときにはコンソールからのコピペじゃない方がよいと思いますし。 -- 合羽橋で河童に会った? 2009-10-29 (木) 14:22:42
  • >surg様 ありがとうございます。教えていただいたようにしたのですが、上手くいかないみたいです。 >合羽橋で河童に会った様 output引数ですね。やってみます。 -- R使用開始3日目? 2009-10-29 (木) 14:42:02
  • 河童様に教えていただいた方法で上手くいきました。ありがとうございました。 -- R使用開始3日目? 2009-10-29 (木) 14:58:46

text 関数で文字列が描けない場合がある

河童も驚いた? (2009-10-28 (水) 22:57:27)

以下のようなプログラムで,abcde しか描かれない。

plot((1:10)^2)
text(4, 50, "abcde")
text(4, 40, " fghij")
text(4, 30, "xyz 123")
text(c(4, 6, 8), 20, paste("Var", 1:3))

文字列に空白が含まれる場合には,描かれない(描かれているけど見えない??)

> sessionInfo()
R version 2.10.0 Patched (2009-10-27 r50238) 
i386-apple-darwin9.8.0 

locale:
[1] ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

なんということだ。

  • すべて描かれますが? -- 2009-10-28 (水) 23:35:46
  • なるほど。Leopard なら描けますね。Snow Leopard だったからかな? -- へ〜〜!河童の屁? 2009-10-29 (木) 10:03:40
  • 雪豹では描けませんね。再現しました。 -- 2009-10-31 (土) 20:47:52
  • たしかに再現しますね。Snow Leopard上特有のバグ...かな -- 2009-10-31 (土) 23:26:42
  • 雪豹を使っています。R 2.9.2 GUI 1.29 Tiger build 32-bit (5464)では、上記の例は表示されました。 -- beerdog? 2009-11-04 (水) 07:49:29
  • http://r.research.att.com/ にある,R-2.10-branch-leopard-universal.tar.gz ( R version 2.10.0 Patched (2009-11-02 r50295))ではどうでしょうか?私のマシンでは,やはり空白を含む文字列は表示されません。私のマシン特有の症状だとしても,何が原因なんでしょうかねぇ。困ります。なお,画像ファイルに出力する場合には問題なく空白を含む文字列も表示されます。Quartz のせいなのかなぁ? -- あっと驚く,河童の屁? 2009-11-04 (水) 09:16:14
  • 別のマシンで確かめましたけど,やはり表示されませんね。驚いたことに,R version 2.9.2 Patched (2009-09-24 r50037) でも表示できません。前に書きましたが念のため,Snow Leopard(Mac OS X 10.6)です。 -- びっくり河童の屁? 2009-11-04 (水) 10:57:32
  • R.app では無く R64.app もですか? -- 2009-11-04 (水) 13:05:34
  • どちらもです。 -- 眠い,河童の屁? 2009-11-04 (水) 13:37:12
    R version 2.10.0 Patched (2009-11-02 r50295)
        :途中省略
    [R.app GUI 1.30 (5510) x86_64-apple-darwin9.8.0]
  • フォントまわりが変わったと言うのは見ましたが, 実機が無いのでわかんないです. 似たような現象とかどうでしょうか, あとpdfにquartz(表示は出きるけども, PDFにすると見えない)から保存する場合も何かあるようです. いずれにせよ, まだ人柱の世界のように思います.>10.6 -- 2009-11-04 (水) 15:09:19
  • フォントの重複を解消しても、変化は見られず。文字自体が表示できないのではなく、空白を含む文字列が表示されないので、フォントの問題とも言い切れないような気も。 -- 河童の屁理屈? 2009-11-04 (水) 15:39:46
  • フォントの問題と言うのは不適切でした. フォントシステムとの不整合と言った意味です. たぶん作図領域外に書かれているのではないかと思います. 怪しげと言うと, CGFontGetGlyphsForUnichars?付近が以前からすっきりとはしていませんがはずれてるかもしれません. -- 2009-11-04 (水) 16:34:50
  • 今,新しいバージョンをダウンロードして実験したときに,ちょっとしたタイプミスでしたが,怪我の功名でちゃんと空白を含む文字列を表示することができる方法を発見しました (文字列の最後で改行。開業後にダブるクオートを閉じる。)。なぜ,この方法が有効なのか,訳はわかりませんが回避法が見つかった(こんな回避法を適用するのも馬鹿馬鹿しいが) -- ねむねむまなこの河童の屁? 2009-11-04 (水) 22:32:47
    R version 2.10.0 Patched (2009-11-03 r50305), Mac OS X 10.6.1 (Snow Leopard)  OS バージョンが 0.1 上がった?
    
    > plot(1:10)
    > text(5, 5, "123 def
    + ")
  • R 2.10.0 GUI 1.30 Leopard build 64-bit (5512)で、やはり、表示OKです。(2009-11-03 r50305)。OSXは10.6.1(ビルド10B504)です。グラフのpdfファイルをここにアップする方法を知らないので、結果を見てもらうことができませんけど・・・。 -- beerdog? 2009-11-05 (木) 00:38:09
  • ↑は、R 2.10.0 Patched (2009-11-03) leopard Nov 4 02:15のファイルをインストールしたものです。 -- beerdog? 2009-11-05 (木) 00:42:02
  • plot(1:10)としてstrwidth("123_abc");strwidth("123 abc");strwidth("123 abc\n") あとstrheightも, フォントも日本語の時とHelveticaの時とあると, とりあえずRかOSXかは切り分け出来るとは思います. あとは10.6をお持ちの方で src/library/grDevices/src/devQuartz.c を楽しんでいただける方がいらっしゃると良いのですが... -- 2009-11-05 (木) 09:11:31
  • 以下のようなことでよいのでしょうか。 -- 寒い朝の河童の屁? 2009-11-05 (木) 09:45:29
    > plot(1:10)
    > metric <- function(str) {
    + 	cat("argument:", deparse(substitute(str)), "strwidth:", strwidth(str),
    +          "strheight:", strheight(str), "\n")
    + }
    > metric("123_abc") # 描画される
    argument: "123_abc" strwidth: 1.436108 strheight: 0.2790818 
    > metric("123 abc") # 描画されない
    argument: "123 abc" strwidth: 1.375176 strheight: 0.2790818 
    > metric("123 abc\n") # 描画される
    argument: "123 abc\n" strwidth: 1.375176 strheight: 0.7209 
    > metric("あいう_えお") # 描画される
    argument: "あいう_えお" strwidth: 2.006757 strheight: 0.2790818 
    > metric("あいう えお") # 描画されない
    argument: "あいう えお" strwidth: 1.945824 strheight: 0.2790818 
    > metric("あいう えお\n") # 描画される
    argument: "あいう えお\n" strwidth: 1.945824 strheight: 0.7209
  • すると計算上は描画しているので, OSX10.6上の問題のような気がします, あと出来ることと言えば, fontsmoothとantialiasを無効にするぐらいでしょうか. 純正LCD以外はデフォルトでスムージングしないとかも差別されるようなので, 環境まわりで解決する方法があるのかもしれません.(全ては推測と憶測なので徒労に終わる可能性も高いですが...) -- 2009-11-05 (木) 10:14:34
  • 最初のマシンは MacBook?(ノートパソコン)、次に試したのはデスクトップですが、純正のシネマディスプレイ(液晶)です。 -- 河童の屁? 2009-11-05 (木) 10:20:50
  • これ以上は実機が無いとつかみようが無いです. もし, Helveticaでも同じならR-sig-macに投げればSimonはすぐ直すと思いますが, 日本語固有(日本語だけOTFだし)だとだれかが直さないといけませんね. -- 2009-11-05 (木) 11:53:38
  • 「もし, Helveticaでも同じなら」というのは,どのように確認すればよいのでしょうか? -- ちょっと疲れた河童の屁? 2009-11-05 (木) 14:15:13
  • .Rprofileを消した日本語が出ない状態の事です(本当のデフォルト) quartzのデフォルトフォントファミリーがHelveticaなので. -- 2009-11-05 (木) 15:07:41
  • ちょうど,それかなと思ってやったところでした。ついでに,英語モードの R で確認しました(日本語モードでも同じ結果でした)。
    デフォルト状態(.Rprofile がない状態)では,半角を含む文字列もちゃんと書かれます。
    今のような流れになることがわかっていれば,最初に言っておけば良かったかも知れないのですが,Quartz に日本語を表示するために,R2.7.0,Macintosh版でのグラフィック表示における日本語の内容(profile-1 と呼ぶ)にいくつか追加した .Rprofile(profile-2 と呼ぶ)を使っていました。.Rprofile がない状態(profile-0 と呼ぶ)で空白が含まれる文字列が表示できることを確認後,提示された内容*だ*け*を含む .Rprofile(profile-1)にして再度実験をすると,空白を含む文字列が表示できないという profile-2 と同じ現象が発生しました。
    ということは,件のスレッドの .Rprofile(profile-1)に問題があるのでしょうかね? -- 河童の屁? 2009-11-05 (木) 15:37:53
  • .RProfileとは無関係だと思いますフォントを指示しているだけですので. 選んだフォントによって違うのではと推測しています. plot(1,main="ABC あいう",family=c("Times","AppleGothic?","Osaka",....)) とかしていけば, 何か規則性があるかもしれません. -- 2009-11-05 (木) 18:06:33
  • どうも,私の手には負えないようです。今までのアドバイス,ありがとうございました。 -- お手上げの河童の屁? 2009-11-05 (木) 18:48:26
  • いえ, グリフまわり(現状放置したままだったので...)かなぁと思ってたんですが, 違うような気もしました. Osakaでも同じか解るとありがたいです. もっとも解決策を見つけるための(財務大臣殿のご機嫌など)一寸ハードルは高そうですが... -- 2009-11-06 (金) 09:52:24
  • Hiragino * を Osaka にすればよいのでしょうか。やってみたところ,問題は解消するようです。空白を含む文字列もちゃんと描けるようになりました。もちろん,日本語も描けます。試すことは何でもやりますので(どこをどうしろと詳しく言っていただければ),よろしくお願いします。 -- 今日は休みだ河童の屁? 2009-11-06 (金) 10:21:41
  • ありがとうございます. Osakaで出るのであれば日本語の問題では無いよりフォントよりの問題なので, 処理方法を見直すか環境まわりか(OSXの問題と言う話もあります)ですので, 問題を再現できる環境が無いと難しいので. 概算要求(またの名を家族サービス)に励んでみます. -- 2009-11-06 (金) 10:54:35
  • VLGothicをとってきてFontBook?で追加, text(1,1,"ABC D",family="VL Gothic")とかは出ますね. IPAフォント(otf)はFontBook?に蹴られてしまいます. 現状OpenType?はこの問題がありますが, TrueType?なら大丈夫だと思います. 直ぐには直らないです. -- 2009-11-10 (火) 19:49:40

正規分布乱数で上限と下限を設定したい

akira? (2009-10-28 (水) 18:10:27)

いつもありがとうございます.乱数について教えて下さい.

測定値のシミュレーションをしようとしています.
測定値は100個程度の正規分布を想定していますが、測定限界の関係で上限が0、下限が60,000になります.
この状態で、データを測定値に応じて送別化して、各層でSDを振った擬似データを作りたいと思っています.

rnormで平均とSDを指定した正規分布をとれますが、上限と下限を指定できません.
そもそも、上限と下限がある時点で正規分布でないのですが、測定には有効域があるので上限と下限を指定したいのです.

良い方法をご存じないでしょうか?

  • 有効域の外を削るのはダメでしょうか -- S? 2009-10-28 (水) 18:24:39
    my.rnorm <- function(n,mean,sd,lower,upper){
      x <- vector()
      while(length(x)<n){ 
        x <- c(x,rnorm(n,mean=mean,sd=sd))
        x <- x[x>lower & x<upper]
      }
      return(x[1:n])
    }
    > my.rnorm(100,30,15,0,60)
      [1] 18.737474 14.982537 12.871060 35.218585 46.118110 26.359055 57.167014
      [8] 43.737251 17.558190 37.044597 28.312282 27.937564 37.606587 45.872538
     [15] 31.474119 39.678433 22.517348  1.820924 21.478013 19.614942  7.276308
          :
     [85] 27.630476 53.156905 10.630811 32.732432 27.359767 30.165729 54.583836
     [92] 14.693563 56.358438 17.895591 34.016179  6.088306 36.830447 30.897142
     [99] 30.521995 29.281466
    測定の性質にもよると思いますが、上限下限の外側は、正規分布に従えば存在しても測定不能で、測定不能なデータが欠損した状態が実測データであると考えれば、単純に削れるような。。。
  • 「上限が0、下限が60,000」とはおかしな話ですが,逆なんでしょうね。
    希望する範囲外の乱数を除くと,切り詰められた分布になるので,あまり問題にはならないでしょうが,ちょっと気持ちが悪い。 正規乱数を生成して,その最小値と最大値を希望の最小値と最大値になるように線形変換すればよいのでは? -- 河童の屁? 2009-10-28 (水) 19:12:38
    > set.seed(999)
    > x <- rnorm(10000) # 標準正規乱数でよい
    > r <- range(x)     # 発生された乱数の最小値・最大値を求めて
    > w <- diff(r)      # 範囲を求めて
    > MIN <- 100        # 希望する最小値
    > MAX <- 60000      # 希望する最大値
    > y <- (x-r[1])/w*(MAX-MIN)+MIN # 範囲が [MIN, MAX] になるように線形変換
    > summary(y)
       Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
        100   23730   29370   29470   35320   60000
  • 切断正規分布という分布で、msmパッケージにtnormとして実装されています。 -- 2009-10-28 (水) 20:40:05
  • 文字通り,打ち切られた正規分布で,どこで打ち切るかをうまく設定しないと,正規分布とは言えない分布になってしまう。実際に発生させる乱数は,あきらかな打ち切りデータではないだろうと言うことで。 -- 屁へ屁の河童? 2009-10-28 (水) 22:00:49
    > set.seed(1000)
    > library(msm)
    > x <- rtnorm(10000, mean=30000, sd=20000,lower=0, upper=60000)
    > summary(x)
        Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
        7.26 18600.00 29880.00 30030.00 41630.00 59980.00 
    > hist(x)
    rtnorm.png
  • いろいろなご意見ありがとうございます.
    扱うデータは検出限界外が限界値に詰め込まれるため、上下限で分布が歪みます.完全なモデル化なら、その時点で正規分布じゃないです.でも、計量的には有効範囲があるので、正規分布で近似できる領域の話に落とし込んでいます.
    ご提案の3手法はシチュエーションで使い分けれそうです.今から検証に実装したいと思います.
    他の分布指定があれば、また教えてください. -- akira? 2009-10-29 (木) 00:26:48
  • 検出限界外が限界値に詰め込まれるなら、削るのではなく、nromの出力結果に対して範囲外を限界値に置き換えるようにすればよいだけのことでは? -- S? 2009-10-29 (木) 11:26:31
  • ありがとうございます.上下限の切り詰めをモデルに入れると、有効範囲の動態に影響が出そうな気がします(あくまで気持ちの問題です).でも、正しくは入れなくちゃいけませんよね.これが落ち着いたら考えてみます. -- akira? 2009-10-29 (木) 23:17:55

Anova関数 (carパッケージ) の結果の取り出し

aor? (2009-10-27 (火) 00:25:10)

いつもお世話になっております。

carパッケージのAnova関数を利用し、以下のようなコードで多変量検定を行いました (コード自体は青木先生の掲示板より拝借しました) 。
この結果の一部を取り出したいのですが、どのようにすればよいか教えていただけないでしょうか。

library(car)
hsb2 <- read.table('http://www.ats.ucla.edu/stat/R/faq/hsb2.csv', header=T, sep=",")
result <- Manova(lm(cbind(write,read)~female+math+science+socst, hsb2))
summary(result)

このコードを実行すると、例えば

Multivariate Tests: female
                  Df test stat  approx F num Df den Df     Pr(>F)    
Pillai             1  0.169885 19.851322      2    194 1.4335e-08 ***
Wilks              1  0.830115 19.851322      2    194 1.4335e-08 ***
Hotelling-Lawley   1  0.204653 19.851322      2    194 1.4335e-08 ***
Roy                1  0.204653 19.851322      2    194 1.4335e-08 ***
---

といったような多変量統計量が出力されます。このうち、"test stat"の部分を取り出してベクトルに格納したいのですが、これがうまくいきません。
str(result), あるいはstr(summary(result))で見ても、”Sum of squares and products for the hypothesis:”しか見当たらず、この結果しか取り出すことができません。

結果を別のベクトルオブジェクトに入れておくと後から使いやすいので何とか取り出したいと思っています。よい方法をご存知の方がいましたらよろしくお願いいたします。
環境はR2.9.2, Windows Vistaです。

  • 多変量統計量は出力するだけで返してはくれないので、1) car:::summary.Anova.mlmとcar:::linear.hypothesis.mlmをいじる、またはそれらを参考に自作する(簡単)。2)capture.outputで出力をつかまえて処理する。のいずれかでしょう。私なら参考に作る(コピペで関数作れば十分)を選択します。 -- 2009-10-27 (火) 10:05:21
  • 自分はstrsplit(capture.output(summary(result))," ")[hoge,hoge]とかいう原始的なことやっています。 -- 2009-10-27 (火) 11:41:48
  • ご回答ありがとうございます。おかげさまで解決できました。car:::summary.Anova.mlmの中を見ると多変量統計量はprint.linear.hypothesis.mlmで出力しているようなので、これを書き換えてオブジェクトに格納するようにしました。本当にありがとうございました。 -- aor? 2009-10-27 (火) 19:30:39

因子分析について

hemuhemu? (2009-10-26 (月) 18:26:30)

いつもお世話になっております。
クロス集計を行った結果で因子分析を行いたいのですが、「これらの初期値からは最適化ができません」とのエラーが帰ってきてしまいます。
どういう場合に上記のエラーが帰ってくるのか、また、何か対処法はあるのかを教えていただけませんでしょうか?
エラーメッセージ、因子分析について調べてみたのですが、よく分かりませんでした。
Rは、

R version 2.9.1 
i386-pc-mingw32 

で、windowsXPを使用しております。

どうぞよろしくお願い致します。

  • 「クロス集計を行った結果で因子分析」の部分の意味がよくわからない・・・。 -- 2009-10-26 (月) 18:37:41
  •  説明不足で申し訳ありません。
     以下のような集計データなのですが。
    a  b  c  d  e  f  g  h  i  j
 1  1  0  0  0 12  0  0  0  5  0
 2  0  0  2  0  0  0  2  0  0  0
 3  0  0  0  0  0  0  0  1  0  1
 4  0  8  0  0  2  0  0  0  0  0
 5  0  0  1  0  0  0  7  0  0  0
 6  1  0  0  0  0  0  0  0  2  0
 7  0  0  0  2  0  0  0  0  0  1
 8  0  2  0  0  0  0  1  0  9  0
 9  0  0 10  0  0  0  0  0  0  0
10  0  0  0  0  3  4  0  0  0  0 

 -- hemuhemu? 2009-10-26 (月) 18:55:41

  • 「説明不足」の基準自体が違うようですね。そのデータで,どうやって因子分析をしたのかがわかりませんねぇ。ということですよ。
    因子分析もバリマックス回転をしたかとかプロマックス回転をしたとか,そもそも回転はしなかったとか,ねえ。あなたが何をどうやったか,全くわからないのです。 -- 河童の屁? 2009-10-26 (月) 20:43:26
  • 上記のデータでは項目数とケース数が同じなのでfactanalではエラーになるが、項目数を減らすと普通にできるけど。なにはともあれ因子分析のコードをのせてくれないとなにもできん。 -- 2009-10-27 (火) 11:24:51
  • 上のデータは,「集計表」でしょう?集計表を factanal の第1引数にはできないですよねえ。 -- 2009-10-27 (火) 11:42:41

ワイルドカードってありますか?

ひどい初心者? (2009-10-25 (日) 18:14:23)

R言語にワイルドカード(どんな文字列にもマッチする記号)のようなものはありますか?

ヒストグラムの"Histgram of ○○○"を消す方法

tefu? (2009-10-23 (金) 16:27:11)

非常に初歩的なことだと思うのですが、調べてもわからなかったので質問します。

x <- rnorm(100)
hist(x)
title("abc")

上記のようなプログラムを実行するとヒストグラムのタイトル部分に"histgram of x" と "abc" が重なってしまい見にくいのですが、解決する方法はありますでしょうか?ご教示願います。

  • ?hist でマニュアル読んでください。hist(x,main="")で消せるでしょう? -- 2009-10-23 (金) 17:06:30
  • すみません。ありがとうございました。 -- 2009-10-23 (金) 17:14:33
  • hist のマニュアルとともに,title のマニュアルも読むべきですね(回答者も)。
    title: Its first four principal arguments can also be used as arguments in most high-level plotting functions. つまり,
    hist(x, main="")
    title("abc")
    ではなく,
    hist(x, main="abc")
    とするほうがよいことがわかります。 -- おそかりし?河童の屁? 2009-10-23 (金) 17:30:20
  • ↑まあ、気がついてはいたがとりあえずお望みをかなえてあげたまで。答えは複数あったほうがよい。 -- 2009-10-24 (土) 07:58:03

ラベル名の追記・変更

Ackin? (2009-10-19 (月) 17:22:50)

> A <- data.frame(a=c(1, 2, 3), b=c(0, 0, 0))
> AA <- data.frame(aaa=A[1], bbb=c(4, 5, 6))
> AA
  a bbb
1 1   4
2 2   5
3 3   6

上記例で、AAに既存データフレームのデータをもってきて、ラベル名はaaaにしたいのですが、どうするのでしょうか?似た質問で既存データフレームのラベル名を変更するにはどうしたら良いでしょうか?

  • AA <- data.frame(aaa=A[, 1], bbb=c(4, 5, 6)) とすればよいのです。A[1] と A[, 1] は違うということ。
    「既存データフレームのラベル名を変更」は colnames 関数を使います。 -- 河童の屁? 2009-10-19 (月) 17:28:52
  • 即答ありがとうございました -- Ackin? 2009-10-19 (月) 17:33:58

重み付回帰分析 (分散分析)

? (2009-10-16 (金) 23:08:37)

x1,x2 というふたつのダミー変数を用いて、回帰分析を行いました。
x1, x2 の値によってできる4つのグループ内の分散の逆数を重みとして、重み付回帰分析をしたいのですが、重みをつけても結果が変わりません。
何を間違えているのかわかりません。ご教示いただけたら幸いです。
よろしくお願いします。

でっちあげの例:

x1 <- rep(c(0,1),c(8,18))
x2 <- rep(c(0,1,0,1),c(3,5,10,8))
set.seed(190)
y <- c(rnorm(3,10,2),rnorm(5,11,4),rnorm(10,12,3),rnorm(8,10,4))
w <- 1/ c(rep(var(y[1:3]),3), rep(var(y[4:8]),5),  rep(var(y[9:18]),10), rep(var(y[19:26]),8) )


lm(y~x1*x2)
Call:
lm(formula = y ~ x1 * x2)

Coefficients:
(Intercept)           x1           x2        x1:x2  
     10.202        3.143        1.070       -5.014  


lm(y~x1*x2, weights=w)
Call:
lm(formula = y ~ x1 * x2, weights = w)
Coefficients:
(Intercept)           x1           x2        x1:x2  
     10.202        3.143        1.070       -5.014
  • 係数は結局グループごとの平均なので (10.202 がグループ1,10.202+1.070がグループ2...)重みは関係ありません。 Std. Error は違いますよ。 -- 本多? 2009-10-17 (土) 00:54:12
  • フルモデルだからそうなるでしょう。主効果だけだと係数は違いますよ。 -- へへへの河童? 2009-10-17 (土) 09:06:56
    > lm(y~x1+x2)
    
    Call:
    lm(formula = y ~ x1 + x2)
    
    Coefficients:
    (Intercept)           x1           x2  
        12.4062       0.2772      -2.4567  
    
    > lm(y~x1+x2, weights=w)
    
    Call: 
    lm(formula = y ~ x1 + x2, weights = w)
    
    Coefficients:
    (Intercept)           x1           x2  
         11.857        1.220       -2.129
  • 本多さま、へへへの河童さま、ありがとうございました。~ 少し "R" に関する質問からは遠ざかってしまいますが、Std. Error に関して追加の質問があります。-- ? 2009-10-20 (火) 03:33:04
    > summary(lm1)$coeff
                 Estimate Std. Error    t value     Pr(>|t|)
    (Intercept) 10.202096   1.991574  5.1226306 3.916815e-05
    x1           3.142593   2.270743  1.3839488 1.802549e-01
    x2           1.069892   2.519164  0.4247011 6.751793e-01
    x1:x2       -5.014352   3.003911 -1.6692745 1.092330e-01
    (Intercept) は x1==0 & x2==0 の時の y の平均なのですが、その Std. Error である 1.9915714 という値は y[x1==0 & x2==0] となんらかのシンプルなつながりがあるのでしょうか?
    cbind(rep(1,length(x1)),x1,x2,x1*x2)
    などを見てみましたが、よく分かりませんでした。
    mean(y[x1==0 & x2==0])
    [1] 10.20210
    > sd(y[x1==0 & x2==0])
    [1] 2.927438
  • > Std. Error である 1.9915714 という値は y[x1==0 & x2==0] となんらかのシンプルなつながりがあるのでしょうか
    ありません。Std. Error は,推定値の標準誤差です。どうやって計算されるものであるかは,教科書などの重回帰分析の説明を読まないと。 -- へ?河童? 2009-10-20 (火) 11:01:20
  • へ?河童さま、ありがとうございました。 -- ? 2009-10-20 (火) 23:39:40

日々データの季節変動抽出

森の熊五郎? (2009-10-15 (木) 12:02:28)

ts関数を使う場合、毎月・または毎四半期のデータを入力することになりますが、日々のデータを入れて、7日間での周期で変動するパラメータについて、季節変動抽出をdecompose関数を使って分解したいと考えましたが、日々のデータでの入力がts関数では出来ずに困っています、他の方法があるのでしょうか?ご教示下さい。

  • 追加です。日々の解析はむりでも、週次での分析をすすめたく。月次では平均化されてよいのですが、意思決定には遅くて使えず、せめて週次での傾向をつかみたく。 -- 森の熊五郎? 2009-10-15 (木) 12:05:28
  • > 日々のデータでの入力がts関数では出来ず
    どうも,妙なことをおっしゃる
    時系列分析はよく知らないけど,ts 関数には周期を指定する frequency 引数があるでしょう。それで,7 を指定するだけではないの?
    以下のような架空の,週を周期とするデータを作成して,decompose してみましたが,これでよいのかな? -- 河童の屁? 2009-10-15 (木) 16:03:43
    > set.seed(999)
    > (x <- jitter(rep(c(1, 2, 3, 4, 2, 0, -1), 10), amount=1))
     [1]  0.77814275  2.16612144  2.18933138  4.70526246  2.57349352 -0.76131548
     [7] -0.78710601  0.16191381  1.78154483  3.23894478  3.57137765  2.10224548
       途中省略
     [61]  2.98281213  0.55632492 -0.54765611  1.88545396  2.14234596  2.99028707
    [67]  4.72009442  2.73918408 -0.19494635 -1.33750080
    > (y <- ts(x, frequency=7))
    Time Series:
    Start = c(1, 1) 
    End = c(10, 7) 
    Frequency = 7 
     [1]  0.77814275  2.16612144  2.18933138  4.70526246  2.57349352 -0.76131548
     [7] -0.78710601  0.16191381  1.78154483  3.23894478  3.57137765  2.10224548
       途中省略
    [61]  2.98281213  0.55632492 -0.54765611  1.88545396  2.14234596  2.99028707
    [67]  4.72009442  2.73918408 -0.19494635 -1.33750080
    > (z <- decompose(y))
    $seasonal
    Time Series:
    Start = c(1, 1) 
    End = c(10, 7) 
    Frequency = 7 
     [1] -0.7309683  0.5398884  1.1755496  2.2610667  0.8231408 -1.7139546
     [7] -2.3547226 -0.7309683  0.5398884  1.1755496  2.2610667  0.8231408
       途中省略
    [61]  0.8231408 -1.7139546 -2.3547226 -0.7309683  0.5398884  1.1755496
    [67]  2.2610667  0.8231408 -1.7139546 -2.3547226
    
    $trend
    Time Series:
    Start = c(1, 1) 
    End = c(10, 7) 
    Frequency = 7 
     [1]       NA       NA       NA 1.551990 1.463957 1.409018 1.558963 1.396979
     [9] 1.329658 1.304173 1.413051 1.419239 1.532508 1.403111 1.556131 1.436136
       途中省略
    [57] 1.644785 1.678867 1.847450 1.884422 2.136606 2.083784 2.096797 2.104237
    [65] 2.069433 1.962109 1.849274       NA       NA       NA
    
    $random
    Time Series:
    Start = c(1, 1) 
    End = c(10, 7) 
    Frequency = 7 
     [1]           NA           NA           NA  0.892205746  0.286395450
     [6] -0.456378671  0.008654032 -0.504096936 -0.088001448  0.759222105
        途中省略
    [61]  0.023065117  0.186495890 -0.289730356  0.512184743 -0.466975924
    [66] -0.147371514  0.609753665           NA           NA           NA
    
    $figure
    [1] -0.7309683  0.5398884  1.1755496  2.2610667  0.8231408 -1.7139546 -2.3547226
    
    $type
    [1] "additive"
    
    attr(,"class")
    [1] "decomposed.ts"
    > plot(z)
    ts-plot.png
  • ありがとうございます。y =ts(x, start=c(2009,10,9),frequency=7)のようにStartの値を入れ無ければよいのですね。Startのパラメータは2つの整数しか入ることができず、年、月、日という3つのパラメータを入れたいと思ったわけです。そうすることで上のグラフでも横軸のパラメータがデータの番号ではなく、日付のデータで表すことが出来ると期待したのですが、欲張りでした。 -- 森の熊五郎? 2009-10-15 (木) 20:33:16
  • 「日々のデータでの入力がts関数では出来ず」というのが「Startのパラメータは2つの整数しか入ることができず、年、月、日という3つのパラメータを入れたいと思ったわけです」と同じとは,思えませんでしたので。 -- 屁の河童? 2009-10-15 (木) 22:12:57
  • 言葉不足ですみません。年、月、日という3つのパラメータを入れて処理するほかの関数はあるのでしょうか?それとも、無理なのでしょうか?失礼ながら重ねてご教示賜りたく。 -- 森の熊五郎? 2009-10-16 (金) 01:35:31
  • decompose の横軸に日付を目盛りたいというわけですか?通し番号を日付に換算して,目盛り位置に日付文字列を書けばよいのでしょう?日付を扱う関数は,apropos("date") などで調べるとよいでしょう。 -- へ?河童? 2009-10-16 (金) 07:25:08
  • plot.decomposed.ts が頑固者で,,, -- 屁の河童? 2009-10-16 (金) 17:53:25
    plot(z, xlab="")
    axis(1, at=1:70, labels=as.Date(1:70*7, origin="2009/04/15"), cex.axis=0.7, 
         line=7.5)
    ts-plot2.png
  • 毎度毎度、言葉が足りなく、すみません。ご指摘の通りです。decomposeの描かれたグラフをそのまま資料に貼り付けたいと思ったしだいです。例えば、上図のグラフにおいて、横軸が通し番号ではなく、4/1 4/10 4/20 などの月/日の形で表記出来れば、そのままコピー&ペーストが出来、一発でReportに貼りつけることが出来ると考えました。もちろん、OSに付録でついているソフト「アクセサリ」をつかって編集もできますが、楽な手段がないかと思い、お聞きしたしだいです。 -- 森の熊五郎? 2009-10-16 (金) 18:01:41

作図でx軸の線だけ描画する方法 or 複数のグラフの作成

aor? (2009-10-10 (土) 14:50:22)

いつもお世話になっております。

par(bty = "l")
plot(1:10, xaxt = "n")

上のようなグラフで、y軸の目盛を描画せず、x軸のラインだけを描画する方法はありますか?

par(bty = ...) 

での指定は2本以上描画されますし、また例えば

plot(1:10, axes = F)
axis(1, labels = F)

等であとからaxix関数を使用しても、x軸の左右の余白 (?) が切れてしまい、また目盛も描かれるようです。
以下は補足ですが、最終的には

par(mfrow = c(1, 2))
par(mar = c(4,2,4,0))
par(oma = c(4,4,4,4))
par(bty = "l")
plot(1:10, xlab = "condition1")
plot(1:10, xlab = "condition2")

というように複数のグラフをつなげて作成し、condition2のグラフにy軸を表示しないようにしたいと考えています。そのため試行錯誤しており、condition2のグラフでaxes = Fと指定して、後からaxisでx軸を書き足そうとしたのですが、プロット領域の両端までラインが描画されないため、まずプロットするときにx軸のラインのみを描画する方法を探しているところです。自分でも、何かすごく回り道をしている気がするのですが…
よい方法をご存知の方、いらっしゃいましたらよろしくお願いします。
環境はWindows Vista, R2.9.2です。

  • まあいろんなやり方があるでしょうが、
    X <- 1:10
    plot(X, axes = FALSE)
    axis(1, labels = FALSE, tck = 0, at = range(X))
    とすれば、Xの範囲に線が引かれます。 正確にはXの最小・最大点にtickを打つように指定しつつ、tick自体は長さを0にして描かれないようにしています。
    Xの範囲に依存せず線を引きたい範囲が決まっているなら、
    X <- 1:10
    LIM <- c(-10, 15)      # 線を引きたい範囲
    plot(X, axes = FALSE, xlim = LIM)
    axis(1, labels = FALSE, tck = 0, at = LIM)
    とすればOKでは。
    あんまりスマートではない気がしますけれど。 -- 2009-10-10 (土) 18:29:03
  • 蛇足というか,余計なお世話というかpar は複数の設定を一回でできますよ。 -- 河童の屁? 2009-10-10 (土) 18:57:56
    par(mfrow = c(1, 2), mar = c(4,2,4,0), oma = c(4,4,4,4), bty = "l")
  • ありがとうございます。 以下のようなコードで実現できました。
    par(mfrow = c(1, 2), mar = c(4,0,4,0), oma = c(4,4,4,4), bty = "l")
    LIM <- c(0.5, 10.5)
    plot(1:10, xlim = LIM, xlab = "Condition1")
    plot(1:10, axes = F, xlim = LIM, xlab = "Condition2")
    axis(1, labels = F, tck = 0, at = LIM) # まずラインを引いて、
    axis(1) # 目盛を描画
    ご指導感謝いたします。-- aor? 2009-10-10 (土) 22:42:27

信頼区間のプロットの方法について

gonzu? (2009-10-05 (月) 18:48:51)

いつもありがとうございます.

1000回同じ条件で繰り返しを行い、その95%の信頼区間を求めてグラフに表そうとしているのですが、上手くいかず悩んでいます.

mymonte <- function(n) {
  count <- 0
  for(i in 1:1000) {
    X <- runif(704)*50 
    Y <- runif(704)*50
    XY <- data.frame(X, Y)
    XY <- data.frame(XY, Dataset[, c(2, 12)])
    w <- owin(c(0, 50), c(0, 50))
    Rpp <- as.ppp(XY[, 1:2], w, fatal=FALSE)
    mark1 <- XY$DBH.02.
    mark2 <- XY$sort
    Rpp1 <- Rpp %mark% mark1
    Rpp2 <- Rpp1 %mark% mark2 
    KC <- Kmulti(Rpp2, (mark1 <= 5) & (mark1 >= 1) & (mark2 == "ヤブムラサキ"),
          (mark1 > 5) & (mark2 == "シラキ"), correction="isotropic")
    par(new=TRUE)
    count <- count+1
  }
  return(count/n)
}
plotmeans(sqrt(iso/pi)-r ~r, connect=F, data=KC)

上記のよう実行しますと、平均値だけがプロットされて信頼区間は表れない図になります。countの使い方がおかしいのかとも思いますが….
どなたかご教授お願いいたします。

使用環境は

R version 2.9.2 (2009-08-24) 
i386-pc-mingw32

です.よろしくお願いいたします.

  • 人に見てもらおうという場合には,プログラムの書き方にも注意したほうがよいです。誰もが納得する書法ではないかも知れないが,直しておきました。
    mymonte はどこで使うのですか?Dataset というのは何ですか?plotmeans の入っているライブラリは?その他,このプログラムを動かすには書かれているだけの情報ではとてもとても。
    そのままコピーして R コンソールにペーストしたら動く(好ましい結果であろうとなかろうと)という状態にしてください。 -- 河童の屁,クッサー? 2009-10-05 (月) 19:24:31
  • plotmeans は gplots にあることはわかりました。owin, as.ppp は spatstat にあることもわかりました。Dataset は,少なくとも "DBH.02." と "sort" という名前を持つ列があるデータファイルでそれを使うのですね。後者は少なくとも "ヤブムラサキ" と "シラキ" を要素として持つ。前者は数値データのようですね。plotmeans の formula を構成する iso(tropic), r を要素として持つデータフレーム KC は,mymonte 関数の中で(1000回も)定義するようですが,関数呼び出しが完了すると,KC オブジェクトは消滅しますよ。関数の外には存在しません。 -- 河童の屁? 2009-10-06 (火) 17:45:45
  • ご回答ありがとうございます。説明が足らず申し訳ありませんでした。Datasetというのは704個体の樹種と直径DBHのデータが入っているもので、そのデータをランダムに発生させた点に付与しています。現在、パッケージgplots,gdata,gtools,spatstatをインストールして行っています。mymonteは私が指定したのですが、この場合必要ないということでしょうか? mymonteを後付するまでは
    for(i in 1:1000){
    X<-runif(704)*50 
    Y<-runif(704)*50
    XY<-data.frame(X,Y)
    XY<-data.frame(XY,Dataset[,c(2,12)])
    w<-owin(c(0,50),c(0,50))
    Rpp<-as.ppp(XY[,1:2],w,fatal=FALSE)
    mark1<-XY$DBH.02.
    mark2<-XY$sort
    Rpp1<-Rpp %mark% mark1
    Rpp2<-Rpp1 %mark% mark2 
    KC<-Kmulti(Rpp2,(mark1<=5)&(mark1>=1)&(mark2=="ヤブムラサキ"),
    (mark1>5)& (mark2=="シラキ"),correction="isotropic")
    par(new=T)
    plot(KC, sqrt(iso/pi)-r ~ r,ylim=c(-5,5))	# L関数のグラフ
    }
    としていました。これを実行しますと、KCが回数を重ねるたびに更新されていくようなので、countにKCの結果を残して信頼区間を求めようとしています(うまくいってませんが…)。 -- gonzu? 2009-10-06 (火) 20:30:23
  • 「そのままコピーして R コンソールにペーストしたら動く(好ましい結果であろうとなかろうと)という状態にしてください」といっているでしょう?
    > mymonteは私が指定したのですが、この場合必要ないということでしょうか?
    ですから,それをどうやって使うのかと聞いているのです。mymonte(100) のようにして使うのでしょうけど,前のコメントで言ったように,その内部で KC を定義しても,関数から出ると,その定義は消失して,後で利用するということができないんですよ。関数にしないバージョンも呈示してもらっても,それを実際に動かしてみることができないので,適切なコメントが付けられないのです。場合によっては(かなりの確率で?)あなたのプログラムを大改造というか書き直さないといけないような気がするので,そのスタート地点として,現在どのようになっているかを確認しておく必要があると思うんですね。 -- 河童の屁? 2009-10-06 (火) 23:12:06

read.tableの文字列の読み込みについて

きりん? (2009-10-05 (月) 11:09:19)

下の方と同様な内容で恐縮ですが、質問させてください.
(私もいつも同じような問題で悩むものですから)

下の方と同様の例ですが、

# testdata.txt
"文字","英数","値1","値2"
"1","12345","a",10,1.4142
"2","00123","b",100,1.732
"3","02","0",1000,3.1415

(私の扱うフィルも列名に【”】が付いています.)
これを、

read.table(file="testdata.txt", sep=",", as.is=T)

で読み込むと、

   文字 英数 値1   値2
1 12345    a   10 1.4142
2   123    b  100 1.7320
3     2    0 1000 3.1415

のように、読み込んでしまうのですが、ヘルプを読むとデフォルトで「quote="\"'"」となっているので1列目と2列目は文字列として読み込むことを期待しています.が、そうなっていません.
(「as.is=T」をつけなければファクターに変換されますが.この場合は「as.is=T」を取ってもファクターになっていませんから、そもそも文字としては認識されていない???)
下の方の様に「quote=""」とすると、これはquotingを無効にすることのようで

    X.文字. X.英数. X.値1. X.値2.
"1" "12345"     "a"      10  1.4142
"2" "00123"     "b"     100  1.7320
"3"    "02"     "0"    1000  3.1415

のようになるのは、ある意味納得できます.列名に「X.」とかがつくのはそういう仕様なのかもしれません.
ちなみに

> tmp <- read.table(file="testdata.txt", sep=",", as.is=T, quote="")
> tmp$文字
[1] "\"12345\"" "\"00123\"" "\"02\""

となって、値自体に【”】が入っています.クオート文字として認識されませんから、文字列の一部として認識されています.(ま、これをgsubで削除すればいいのかもしれませんが・・・)

私も、列数が少ない場合や、デフォルトでnumericで読まれるような列を文字として読み込む場合は、【colClasses】引数を使用しています.
ですが、異なったファイル毎に、いちいちcolClassesを指定するのは面倒ですし(特に列数が500とか1000とかの場合)、ファイルを作成する場合に、【”】でクオートされた列は文字列として読まれることを期待してファイルを作成しています.

このように、【”】でくくられた列(値)を文字列として読み込まないのは、どういうことなのでしょうか?scanのヘルプも読みましたが、【”】でくくられた列(値)を文字列として読み込まないとは読めません.英語をうまく訳せていないのかもしれませんが・・・
どなたかご教示いただけると幸いです.

  • ?read.tableして、default.stringsAsFactors?を理解すれば、stringsAsFactors?=FALSEだと分かるはず。 -- akira? 2009-10-05 (月) 13:21:34
  • > いちいちcolClassesを指定するのは面倒ですし
    自分でプログラムを書いたらどうですか,といったのは,以下のようなものを書けば,ここで解答を待つより速いでしょうということ。面倒でも何でもない。 -- 河童の屁,真っ黄色? 2009-10-05 (月) 12:30:10
    > x <- readLines("testdata.txt", n=2)
    > l1 <- unlist(strsplit(x[1], ","))
    > l2 <- unlist(strsplit(x[2], ","))
    > (Quotes <- grep('\".*\"', l2))
    [1] 1 2 3
    > colClasses <- rep("numeric",  length(l2)) # 基本的には数値として読む
    > colClasses[Quotes] <- "character" # ダブルクオートが2つある列は,文字列として読む
    > colClasses # 実際どんなふうになるか
    [1] "character" "character" "character" "numeric"   "numeric"  
    > (d <- read.table("testdata.txt", header=TRUE, colClasses=colClasses, sep=","))
       文字 英数 値1   値2
    1 12345    a   10 1.4142
    2 00123    b  100 1.7320
    3    02    0 1000 3.1415
    > sapply(d, class) # 期待したものになっていることの確認
           文字        英数        値1        値2 
    "character" "character"   "numeric"   "numeric"
  • file=connectionなので、"で囲んだ部分はデフォルトで文字列になる仕様だとかえって制御できないものも出てきます。河童さんのように自前で関数作ったほうが○。 -- 2009-10-05 (月) 14:58:12
  • akiraさん、返信ありがとうございます.ヘルプでは「stringsAsFactors? = default.stringsAsFactors?()」となっています.で私の環境では
    > default.stringsAsFactors()
    [1] TRUE
    となります.で「as.is = !stringsAsFactors?」ですから、options()?でdefault.stringsAsFactors?()を替えていなければ、「as.is=F」 がデフォルトではないでしょうか?で「Note that this is overridden by as.is and colClasses」ですから、今回「as.is=T」を指定していますので、文字列として認識された列はそのまま、文字列になるのではないのでしょうか?かつ、今回の例では「as.is=F」と指定しても
    > read.table(file="testdata.txt", sep=",", as.is=F)[,1]
    [1] 12345   123     2
    となって、ファクターとしても認識してくれません.こういうことをakiraさんはおっしゃっているのではなくて? 今頃で申し訳ないのですが
    > sessionInfo()
    R version 2.8.1 (2008-12-22) 
    i386-pc-mingw32 
    です. -- きりん 2009-10-05 (月) 14:59:18
  • 「file=connectionなので」を書いていただいた方ありがとうございます.「"で囲んだ部分はデフォルトで文字列になる仕様だと」とコメントを頂きましたが、私が問題にしているのはread.tableの仕様です.read.tableでは「quote = "\"'"」となっていますから、【”】あるいは【’】でくくった列は、文字列として入力される>>>仕様<<<ではないのでしょうか?(「as.is=F」ならファクターに変換されますが.)もちろん「quote = "M"」と書けば「M」がクオート文字とされるのでしょうが.あるいは、これは私の誤解で、read.tableの仕様として、各列のclassを明示的に指定しないと期待したclassにはなりませんよということなのでしょうか・・・ -- きりん 2009-10-05 (月) 15:15:43
  • read.table のプログラムを読んでみたところ,文字列として入力したものをそのほかのものとして読むことを決めるところで,使われているのが type.convert という関数。この関数は,type.convert("123") は123という整数と解釈されるが,type.convert("00123") も同じく整数 123 として解釈される。そりゃね,"00123" を文字列データとして読んで欲しい人もいるとは思うけど,123 という zero-fill integer として読んで欲しい人の方が多いのだろう。このあたりの制御は as.is でも,quote でも解決できない。自分で仕様を書いて,つまり自分でプログラムを書いて対処するしかないのだろう。 -- 河童の屁? 2009-10-05 (月) 15:28:15
    > class(type.convert("00123", as.is=T)) # as.is に関わらず integer
    [1] "integer"
    > class(type.convert("00123", as.is=F))
    [1] "integer"
    > class(type.convert("A", as.is=F)) # 数値ではないものは,as.is により変わる
    [1] "factor"
    > class(type.convert("A", as.is=T))
    [1] "character"
    > class(type.convert("TRUE", as.is=T)) # 文字列でも,TRUE/FALSE は別
    [1] "logical"
    > class(type.convert("TRUE", as.is=F)) # as.is に関わらず,どっちも logical
    [1] "logical"
  • ↑河童さんが解説してくれていますが、現在のread.tableの仕様では残念ながらきりんさんの考える仕様にはならないのです。気に入らなければread.tableのソースのtype.convertの部分を改良して新しくread.table2を作ればいいのです。そして、read.table2をread.tableの作者にメールすればもしかしたら登録されるかもしれませんよ。気に入らなければ標準関数すらも変えられる自由度がRの醍醐味だと思います。 -- file=connection? 2009-10-05 (月) 17:15:47
  • いやいや「file=connection」さんのおっしゃるとおりで、まさに今作ってたことでした(笑).長くなりますので、変更したところだけ書いてみますね.名前まで一緒なのでドキッとしましたが.もっと良い変更があれば教えてくださると幸いです.貴重な意見を頂いた皆様、ありがとうございました.
    read.table2 <-
    function (file, header = FALSE, sep = "", quote1 = "\"'",
              quote = "\"'", dec = ".", #「quote1」引数を追加
        row.names, col.names, as.is = !stringsAsFactors, na.strings = "NA", 
        colClasses = NA, nrows = -1, skip = 0, check.names = TRUE, 
        fill = !blank.lines.skip, strip.white = FALSE, blank.lines.skip = TRUE, 
        comment.char = "#", allowEscapes = FALSE, flush = FALSE, 
        stringsAsFactors = default.stringsAsFactors(), encoding = "unknown") 
    ・・・
            first <- scan(file, what = "", sep = sep,
                          quote = quote1, #「quote1」引数に変更
                nlines = 1, quiet = TRUE, skip = 0, strip.white = TRUE, 
                blank.lines.skip = blank.lines.skip, comment.char = comment.char, 
                allowEscapes = allowEscapes, encoding = encoding)
    ・・・
        for (i in (1:cols)[do]) {
            data[[i]] <- if (is.na(colClasses[i]) & as.is[i] &
                            (length(grep("^\".*\"$", data[[i]][1])) == 1) )
                gsub("\"$", "", gsub("^\"", "", data[[i]]))
            else if (is.na(colClasses[i])) 
                type.convert(data[[i]], as.is = as.is[i], dec = dec, 
                    na.strings = character(0))
    
    > read.table2(file="testdata.txt", sep=",", as.is=T, quote="")
        string eisu val1   val2
    "1"  12345    a   10 1.4142
    "2"  00123    b  100 1.7320
    "3"     02    0 1000 3.1415
  • 行名がいまひとつですが、とりあえずこんなところでしょうか -- きりん? 2009-10-05 (月) 17:53:05
  • quoatedAsString?みたいなbooleanの引数を作って(defaultはFALSE)、TRUEならquoteで囲まれたものは文字列で読み込む、とした方が直感的だと思いますよ。 -- 2009-10-05 (月) 18:08:08
  • まったくおっしゃるとおりです.ありがとうございます. -- きりん? 2009-10-05 (月) 18:17:18

データの取り込みについて

冷蔵庫? (2009-10-02 (金) 16:22:13)

いつもお世話になっています。R初心者です。

read.tableのquoteの挙動、データの取り込みについて教えていただきたいのですが、

例えば、以下のデータがtestdata.txtとしてあった場合、
(1行目が列名、1列目が行名です。列名、行名にそれぞれ「””」が含まれています。)

#testdata.txt

"文字","英数","値1","値2"
"1","12345","a",10,1.4142
"2","00123","b",100,1.732
"3","02","0",1000,3.1415


データの文字と数値を区別して取得したく、

testresult <- read.table(file="testdata.txt", sep = "," , as.is = T, quote= "")


で取り込むと、読み込んだデータの列名が「X.列名.」になってしまい、
行名も「"行名"」になってしまいます。

    X.文字. X.英数. X.値1. X.値2.
"1" "12345"     "a"      10  1.4142
"2" "00123"     "b"     100  1.7320
"3"    "02"     "0"    1000  3.1415


この列名の「X. - .」、行名の「" - "」が付かないように読み込みたいのですが、
ここで、quote=""を除くと、「00123」(文字)が「123」(数字)として認識されてしまいます。

   文字 英数 値1   値2
1 12345    a   10 1.4142
2   123    b  100 1.7320
3     2    0 1000 3.1415


列名に「X. - .」、行名に「" - "」を付けず、
データ内容を元のとおりに取得する方法は何かありますでしょうか?

Rは、
R version 2.9.1
i386-pc-mingw32
で、windowsXPを使用しております。

どうぞよろしくお願い致します。

  • いつもおしいなあ。オンラインヘルプを読めばそこに答えがあるのに。
    colClasses 引数の説明を良く読もう。 -- 河童の屁も雨で湿気りがち? 2009-10-02 (金) 17:46:07
    > (x <- read.table(file="testdata.txt", sep = "," , header=TRUE,
    + colClasses=c("character", "character", "character", "integer", "numeric")))
       文字 英数 値1   値2
    1 12345    a   10 1.4142
    2 00123    b  100 1.7320
    3    02    0 1000 3.1415
    > sapply(x, class)
           文字        英数        値1        値2 
    "character" "character"   "integer"   "numeric"
  • 早速の回答ありがとうございます!colClasses引数だったのですか。。ヘルプの読みがぜんぜん甘かったです。すみません。もっと精進いたします。。。 -- 冷蔵庫? 2009-10-02 (金) 18:08:17
  • 引き続きすみません。この場合、全ての列についてclass指定しないといけないと思うのですが、列数が非常に多く(10000列とか)全てのclassが分からない場合に、元データのclassを、データを読み込む際にそのまま再現する方法はあるのでしょうか? -- 冷蔵庫? 2009-10-02 (金) 18:33:32
  • > 全てのclassが分からない場合
    そんなことは,あるはずないし,あってはならないこと(どんなものを読むのかわからないということが,ないとは言わないけど)
    複数の連続は rep(ほげほげ, 繰り返し回数)。「ほげほげ」も「繰り返し回数」も,然るべき記載法がある。? rep を良く読む。
    どのようなものを読むことになるかもわからないということなら,自分で制御プログラムを書く必要があるでしょうね。プログラムを書く方針としては,取りあえず全部文字列として読んで(まあね,全部読む必要はないかも知れず,数行,数十行読めば十分なこともあろうけど。ようするに,そのような特殊な状況に対応するような,親切なパッケージはないかもしれないということ),各列ごとに,その列に現れたものが全部数値として解釈できるものならば numeric,数値でないものがあるなら character というように,colClass に与えるべき情報を自分で作成して,そのあと改めて colClass を指定して入力する。そんなふうかな。 -- 河童の屁にも限度はある? 2009-10-02 (金) 21:03:52
  • ご回答ありがとうございました。多くの列がある場合、人の作業ではミスが起こりうると思ったのでプログラムで回避できるいい方法が無いかを考えていました。 私の方は、上の方の質問への回答で、解決いたしました。本当にありがとうございました。 -- 冷蔵庫? 2009-10-05 (月) 12:42:26

非線形回帰分析で決定係数を算出する方法をご教示下さい.

初心者S? (2009-09-30 (水) 16:52:45)

R2.4.1を使っている初心者Sです.

以下のようなデータに対して,非線形回帰をおこないました.データに対するモデル式の当てはまりのよさを決定係数で評価したいと考えておりますが,summary()では,算出されないようです.もし,決定係数の具体的な算出方法がおわかりでしたら,ご教示頂けないでしょうか?よろしくお願い申し上げます.

# データ
Delay<-c(3,6,12,24,36)
Value<-c(85,75,50,40,30)
# nlsでの非線形回帰
fm <- nls(Value ~ 100 /(1 + k * Delay), start=list(k=0))
summary(fm)
  • 非線形回帰に決定係数はありません。対数尤度かAICで評価しましょう。
    自分の自由になるコンピュータなら,R を最新版に更新した方がよいと思いますよ(OS が不明ですけどね)。 -- 河童の屁? 2009-09-30 (水) 17:35:24
    > logLik(fm)
    'log Lik.' -12.80497 (df=2)
    > AIC(fm)
    [1] 29.60994
  • 「河童の屁」先生,初心者Sです.行動科学系の学術論文では,単回帰ではなく,上記のような非線形回帰のモデルの場合でも,決定係数(R2)を算出するのが,通常のようでしたので質問させて頂きました.早速に,参考となる貴重なご意見と解決方法をご教示頂き,大変有難うございました.感謝申し上げます. -- 初心者S? 2009-09-30 (水) 17:52:00
  • > 行動科学系の学術論文では,… 非線形回帰のモデルの場合でも,決定係数(R2)を算出する
    ドンダケいい加減な領域であることやら。Excel の「近似曲線の追加」でも,決定係数を計算していますけど,間違いですからね。
    単に,線形回帰分析のときの類推で,1-残差平方和/全平方和 で計算しているだけでしょう。
    Nagelkerke の R^2 というのもあるけどめんどくさい。 -- 河童の屁? 2009-09-30 (水) 17:54:32

for-loopのどこでwarningが出たか知りたい

akira? (2009-09-29 (火) 10:35:07)

いつもありがとうございます.
for-loopで処理を回すと、ときどきエラーが出ます.エラー発生時にif処理を加えたいのですが、エラーを検出する方法が分かりません.
具体的にはLDAでcolinearにならなければpredict、colinearならNAを返したいです.
できればLDAに特化しない方法にしたいので、warnings()の返り値をとろうと思ったのですが、うまく行きません.
LDAで良い例をかけないので、代替コードを書きます.

>  x <- NULL
>  for(i in c(1,-4,5,-6,3)) x <- c(x,log(i))
Warning messages:
1: In log(i) :  計算結果が NaN になりました 
2: In log(i) :  計算結果が NaN になりました 
> x
[1] 0.000000      NaN 1.609438      NaN 1.098612

NaNになる場合に

> x
[1] 0.000000      -100 1.609438      -100 1.098612

になるようにするイメージです.

  • 本当にwarningを捕まえたいのですか? errorならtry()で処理できるのですが. -- surg? 2009-09-29 (火) 12:41:47
  • 簡単な処理なら
    try('処理A','エラー処理')
    でいいと思うのですが、'エラー処理'が少し長いスクリプトで、かと言って関数やsourceで呼び出す程でもないものだったりして、
    if('処理A'==OK){
      '処理B'
      '処理C'
    }else{
      'エラー処理A'
      'エラー処理B'
    }
    みたいにしたいな、と。
    もしかして、
    try('処理A';'処理B';'処理C','エラー処理A';'エラー処理B')
    みたいな方法もあるのでしょうか? -- akira? 2009-09-29 (火) 13:19:47
  • もっと洒落た方法があると思うけど・・・ifは使えてません。-- 2009-09-29 (火) 13:29:57
    x <- NULL
    dat<-c(1,-4,5,-6,3)
    len<-length(dat)
    for(i in 1:len){
     cmd<-paste("x <- c(x,log(dat[",i,"]))",sep="")
     eval(parse(text=cmd))
    }
    dat2<-NULL
    len2<-length(warnings())
    for(j in 1:len2){
     cmd2<-paste("dat2[",j,"]<-as.character(warnings()[[",j,"]][[2]])[[3]]",sep="")
     eval(parse(text=cmd2))
    }
    dat2<-as.numeric(dat2)
    x[dat2]<-"-100"
    x
  • 警告をエラーにして, tryCatchすれば良いだけです. -- 2009-09-29 (火) 13:57:21
    options(warn=2) # 警告をエラーに設定するのがミソ
    x<-NULL
    for(i in c(1,-4,5,-6,3)) x <- c(x,tryCatch(log(i),error=function(x)-100))
  • こんな方法があったのね。option近辺をうろうろしてたんだが、warn=2が探せなかった・・・。P.S よーく読んだら書いてありました。英語は難しい〜! -- 洒落てない人? 2009-09-29 (火) 16:01:05
  • ありがとうございます.tryCatch()に自作関数をつないで事なきを得ました.options()は普段いじらないので、非常に勉強になりました. -- akira? 2009-09-29 (火) 17:04:13

mtext()内にitalicを用いた際の改行

R初学者? (2009-09-28 (月) 14:38:06)

以前にも同じような質問をさせていただきましたが、再度質問させて頂きます。

plot()やhist()関数でグラフを作った後に、x軸の下にmtext()を用いて図の説明等を加えたいと思っています。
その際、説明の中にイタリックが一部混ざります。
そのイタリックを表示するために、expression(italic())を用いているのですが、改行を行った際に、イタリックに指定した部分だけがずれてしまいます。
どのようにすれば正しく改行されるのでしょうか?

以下に例を貼っておきます。

> par(mar=c(7, 5.3, 2.5, 1))
> hist(rnorm(1000), main="例", ylab="頻度")
> mtext(expression(paste("x軸ラベルの下に左揃えで表示するのですが、\nこのように文の途中にイタリック体を入れて",
+ italic("italic"),"改行すると\nうまく改行ができません")),
+ side=1, line=5,font=2,adj=0)

よろしくお願いいたします。

  • これはplotmathが想定した動作です. expression 内が式を表すために特化している事に着目してください. -- 2009-09-28 (月) 21:07:09
    par(mar=c(8, 5.3, 2.5, 1))
    hist(rnorm(1000), main="例", ylab="頻度")
    texts<-list(expression("x軸ラベルの下に左揃えで表示するのですが、"),
                expression(paste("このように文の途中にイタリック体を入れて",
                                 italic("italic"),
                                 "改行すると")),
                expression("うまく改行ができません"))
    lapply(seq(length(texts)),function(i)mtext(texts[[i]],side=1,line=i+3,font=2,adj=0))
  • ありがとうございます。もしよろしければ、list()やlapply()について、もう少し解説していただけないでしょうか?図々しくて申し訳ないです。 -- R初学者? 2009-09-28 (月) 21:45:36
  • > もしよろしければ、list()やlapply()について、もう少し解説していただけないでしょうか?
    そこまで望むのは,さすがにどうかなあと思いますね。list にしろ,lapply にしろ,基礎的なもので,ちょっと調べればわかること。? list, ? lapply しましたか?詳しく一部始終ここで教えてくれというのはねえ,甘えなどというレベルを超えていますね。それとも,その中のどこか一部がわからないというのでしょうか?だったら,それをちゃんと書くべきでしょうね。 -- 河童の屁? 2009-09-28 (月) 23:21:39
  • おやおや,お返事がないですか。びびりました?「初心者には親切丁寧に」と言うことのようですから,補足しておきます。list と lapply を使った解は,以下のようなことを巧妙に(?)書いたに過ぎないのです。 -- 河童の屁は,スカスカ。? 2009-09-29 (火) 23:16:59
    par(mar=c(8, 5.3, 2.5, 1))
    hist(rnorm(1000), main="例", ylab="頻度")
    mtext(expression("x軸ラベルの下に左揃えで表示するのですが、"),side=1,line=4,font=2,adj=0)
    mtext(expression(paste("このように文の途中にイタリック体を入れて",
                           italic("italic"),
                           "改行すると")),side=1,line=5,font=2,adj=0)
    mtext(expression("うまく改行ができません"), side=1,line=6,font=2,adj=0)

Rコマンダーを使用し、クラスター分析を行ってます

(2009-09-26 (土) 16:12:33)

Rコマンダーを使用し、クラスター分析を行ってますが、デンドログラムでのラベル表示順に、テキストとして、ラベルを出力したいのですが、どのようにすると良いのでしょうか。どなたか教えていただけると助かります。cutreeを使用し、出力しても、左から準でなく、デンドログラムと一致させることが困難です。 -- クラスタ検討中の初心者? 2009-09-26 (土) 11:10:59

  • R コマンダーなんか使うからいけないのですよ。hclust の返すオブジェクトの order という要素がその順序情報をもっていますよ。dataFrame[object$order, labelPosition] とか,object$labels[object$order] とでもすればよい。 -- 屁の河童? 2009-09-26 (土) 12:44:23
  • ご回答頂き、本当にありがとうございます。試してみます。質問も場所もわからず、重ねてすみませんでした -- クラスタ検討中の初心者? 2009-09-26 (土) 15:18:12
  • 先ほどは、質問場所を間違え「トップ」に記述したにも関わらず、アドバイスを頂き、ありがとうございました。 R 基本統計関数マニュアル(著:間瀬先生)読んでみたり、ネットでいろいろ調べながら行いましたが、解りませんでした。実力的に、Rコマンダーで実行し、式を少しづつ修正し、使用しておりますので、データのセットは、datasetで、テキストデータに表示させたい項目名は、Countryです。orderの前後とどのように対応すると宜しいのか、教えていただけますでしょうか? よろしくお願いいたします。 -- クラスタ検討中の初心者? 2009-09-26 (土) 16:34:51
  • 先のコメントに書いたことに尽きますが。hclust の返すオブジェクトを obj <- hclust(ホゲホゲ)とすれば,dataset$Country[obj$order] でしょ。関数が返すオブジェクトがどのようなもので,どのように利用できるかわかっていますか? -- 河童の屁に火をつける? 2009-09-26 (土) 17:47:59
    > set.seed(3141592)
    > (dataset <- data.frame(x=rnorm(10), y=rnorm(10),
    + Country=paste("国", letters[1:10], sep="-")))
                 x          y Country
    1   0.19317799  1.3714874    国-a
    2  -0.04847455 -0.5333877    国-b
    3  -0.21257424  0.6863163    国-c
    4   0.93021111 -0.7932223    国-d
    5  -0.65881763 -0.7391611    国-e
    6  -1.08777535  0.7393223    国-f
    7   1.33396058  0.3414277    国-g
    8  -0.52538553 -0.2207230    国-h
    9   0.45192105 -0.6031778    国-i
    10 -0.20926002  1.2376127    国-j
    > obj <- hclust(dist(dataset[1:2]))
    > str(obj) # これをやって,どんなものが返されるか確認しましょ!
    List of 7
     $ merge      : int [1:9, 1:2] -1 -2 -5 -3 -4 -6 3 -7 6 -10 ...
     $ height     : num [1:9] 0.424 0.505 0.535 0.796 1.013 ...
     $ order      : int [1:10] 6 3 1 10 7 5 8 4 2 9
     $ labels     : NULL
     $ method     : chr "complete"
     $ call       : language hclust(d = dist(dataset[1:2]))
     $ dist.method: chr "euclidean"
     - attr(*, "class")= chr "hclust"
    > plot(obj, hang=-1, label=dataset$Country)
    > as.character(dataset$Country[obj$order])   # 結局,こうやればいいのですよ
     [1] "国-f" "国-c" "国-a" "国-j" "国-g" "国-e" "国-h" "国-d" "国-b"
    [10] "国-i"
    cluster-name.png
  • 基本中の基本が解ってない事を理解しているところです。 -- クラスタ検討中の初心者? 2009-09-26 (土) 18:05:05
  • 大変有難く思います。少しずつ、解って来た様な気がしております。事例をもとに、再度頑張って見ます。また、ご報告させて頂きます。 -- クラスタ検討中の初心者? 2009-09-26 (土) 18:12:33
  • 「河童の屁に火をつける」先生のご指導の賜物で、目的のテキストを得ることが出来ました。深謝の極みです。蛇足的な質問となりますが、いろいろ本(4冊ほど)を買ってみたのですが、データのやり取りなど基本が、出来ていないことが解りました。Rの「いろは」を勉強するには、どのようにしたら良いでしょか?  来月、多変量解析の講習会に参加することになってますので、頑張って勉強してきます。 重ね重ねありがとうございます。 -- クラスタ検討中の初心者? 2009-09-26 (土) 18:30:35
  • 4冊も買えば十分。それぞれを良く読む。書かれている通りをやるのじゃなく,組み合わすとどうなるかとかやってみる。つまり,今回のだと hclust が返すオブジェクトに order というのがあるのがわかれば,それがどうなっているのかを実際のデータでやってみる。それが左から順に配置されているデータの順序だとわかったら,その順序に従ってデータフレームの特定の列の値(それがそのデータの識別名)を書き出すことができることがわかる。そう言うことができるようになることがすなわち「応用力が付いた」ということ。 -- 河童の屁,秋の風に吹かれて,拡散中? 2009-09-26 (土) 19:00:46

欲張りなテーブル表示をしたいのですが・・・

sakura? (2009-09-23 (水) 21:34:26)

> tapply(<file_name>$age, list(sex=<file_name>$<cate_valiable>, <cate_valiable>=<file_name>$sex),
+    mean, na.rm=TRUE)
<cate_variable>
sex          male   female
  AvAw   53.58940 56.82658
  V_over 60.60800 63.74648
  W_over 52.92593 58.81119
  Zoo     56.63345 62.18116

上記のスクリプトを変更して、meanの横に、sd やパーセンタイル値を表示させるにはどうしたらいいのでしょうか?
例えば、

<cate_variable>~
sex           male                          female~
       mean     sd       mean	  sd~
  AvAw    53.58940  10.34567  56.82658 10.98765
  V_over  60.60800  12.45678  63.74648 10.98765
  W_over  52.92593  11.56789  58.81119 10.98765
  Zoo     56.63345  13.78901  62.18116 10.98765

のように出力させるには???

  • どうも,質問の呈示が尋常じゃないので,何が聞きたいのかよくわからにゃい。データフレームの複数のfactorの組み合わせごとにある変数の平均値とか標準偏差とかその他の統計量を計算して表示したいと言うことなのか?だったら,以下のようにしたらどうかな?要因の組み合わせごとに求める統計量の数によってmatrix関数を適用しないといけないというのがちょっと,汚いけどなあ。 -- 河童の屁は,ヘリウムより重い?? 2009-09-23 (水) 22:53:32
    > set.seed(7460) # 試してみるときのために
    > n <- 200
    > d <- data.frame(
    + age=sample(factor(1:5), n, replace=TRUE),
    + sex=sample(factor(1:2), n, replace=TRUE),
    + x=rnorm(n))
    > a <- tapply(d$x, list(d$sex, d$age),   # sex, age の組み合わせごとに,
    #              データ数b,平均値,標準偏差を求める(その他,どんなことでも)
    +   function(z) {
    +   	return(c(sum(!is.na(z)), mean(z), sd(z)))
    +   })
    > t(matrix(unlist(a), 3)) # 各行が,factor のどのような組み合わせか,表示すべし
          [,1]         [,2]      [,3] # 各列は,データ数,平均値,標準偏差の順
     [1,]   23 -0.244357375 1.0565744
     [2,]   25  0.005392937 1.0587101
     [3,]   30 -0.173957371 1.0238300
     [4,]   28  0.127966034 0.9435006
     [5,]   20  0.075841321 1.1881929
     [6,]   13  0.253818609 0.9067395
     [7,]   17  0.106300283 0.9716491
     [8,]   17  0.115522521 1.0345919
     [9,]   13 -0.025486074 0.6829240
    [10,]   14  0.042842295 1.0857778
    
    > array(unlist(a), dim=c(3,5,2)) # array 関数で表示するも宜しかろう
    , , 1       # sex = 1
    
               [,1]         [,2]       [,3]       [,4]        [,5] # age = 1 - 5
    [1,] 23.0000000 25.000000000 30.0000000 28.0000000 20.00000000 # データ数
    [2,] -0.2443574  0.005392937 -0.1739574  0.1279660  0.07584132 # 平均値
    [3,]  1.0565744  1.058710098  1.0238300  0.9435006  1.18819286 # 標準偏差
    
    , , 2       # sex = 2
    
               [,1]       [,2]       [,3]        [,4]        [,5]
    [1,] 13.0000000 17.0000000 17.0000000 13.00000000 14.00000000
    [2,]  0.2538186  0.1063003  0.1155225 -0.02548607  0.04284230
    [3,]  0.9067395  0.9716491  1.0345919  0.68292405  1.08577777 

x軸のラベルを二段にするには

R初学者? (2009-09-16 (水) 19:36:26)

グラフ(今回は棒グラフ)をつくる際に、x軸のラベルを以下の例のように、
二段構成にしたいと思っていますが、どうすればよいのかわかりません。

male female

 species name


色々と調べてはみたのですが、はっきりとした答えがなかったもので・・・。
よろしくお願いいたします。

  • 単に xlab を表す文字列中,1行目の後に \n を入れればよいだけでしょ。 -- 河童の屁? 2009-09-16 (水) 19:53:45
    > hist(rnorm(10000),
    +   xlab="一行目の後にバックスラッシュとnを置けば,\n改行されるので,その後は二行目になる")
    2lines-xlab.png
    mtext を使うという方法もある。いろいろ工夫すべし。
    old <- par(mar=c(5, 5.3, 2.5, 1))
    hist(rnorm(1000),
      main="main においても,\n同じテクニックが使えるよ", 
      ylab="頻度\nmarの設定が必要になることもある",
      xlab="一行目と二行目の")
    mtext("文字サイズやフォントを変えるときなどはこんなやり方も",
      side=1, line=3.8, cex=0.7, font=2)
    2lines-labels.png
  • 非常に単純ですね・・・。回答ありがとうございました。 -- R初学者? 2009-09-16 (水) 20:14:34
  • そうなんですよ。非常に単純。 -- 河童の屁? 2009-09-23 (水) 23:17:05

近似曲線の求め方

おじさんの悩み? (2009-09-15 (火) 01:24:36)

現在、あるサービスにおいてWEBにてQ&A集を作ることを検討しています。
Q&Aを作るにあたり、特定の期間モニターに質問をして頂き、その内容を分析しました。その結果、質問の上位20位までの累積質問率が下記の通りになりました。このような分布をもとに、全質問に対し、7割ないし8割の回答を目標にするには何件のQ&Aを用意すればよいかの検討をしています。
指数近似や多くの関数を元に最小ニ乗法を使って合わせこみをしましたが、うまくいきません。Rを使って、この問題を解くのに有用なモジュールないし手法はありますでしょうか?
0 0
1 5.9
2 11.1
3 15.7
4 19
5 21.9
6 24.5
7 26.9
8 29.2
9 31.5
10 33.3
11 34.9
12 36.5
13 38.1
14 39.7
15 41.2
16 42.6
17 44
18 45.4
19 46.7
20 48

  • 累積質問率って何ですか?Rより先に統計学を勉強した方がいいかもしれません。 -- 2009-09-15 (火) 04:20:43
  • 要するに,横軸が0:20,縦軸が0〜48の点列に,何らかの曲線を当てはめて,飽和値が幾つくらいになるかを知りたいと言うことなんでしょう。nls を使えばいかがかと。当てはめる曲線は,漸近指数曲線などが候補かと。
    それにしても,「最小二乗法」の漢字の「二」がカタカナの「ニ」になっているのが笑える。 -- 河童の屁,水に流れて,プ〜カプカ? 2009-09-15 (火) 06:10:19
    > x <- 0:20
    > y <- c(0, 5.9, 11.1, 15.7, 19, 21.9, 24.5, 26.9, 
    +   29.2, 31.5, 33.3, 34.9, 36.5, 38.1, 39.7, 41.2, 
    +   42.6, 44, 45.4, 46.7, 48)
    > d <- data.frame(x=x, y=y)
    > res <- nls(y~SSasymp(x, a, b, c), data=d)
    > summary(res)
    
    Formula: y ~ SSasymp(x, a, b, c)
    
    Parameters:
      Estimate Std. Error t value Pr(>|t|)    
    a 55.76073    1.44109  38.694   <2e-16 ***
    b  1.55679    0.55181   2.821   0.0113 *  
    c -2.40868    0.05779 -41.678   <2e-16 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
    
    Residual standard error: 0.7988 on 18 degrees of freedom
    
    Number of iterations to convergence: 0 
    Achieved convergence tolerance: 1.721e-06 
    
    > plot(d$x, d$y, xlim=c(0, 70), ylim=c(0, 60),
    +   pch=19, cex=0.5)
    > abline(h=res$m$getPars()[1], lty=3, col="blue")
    > x2 <- seq(0, 70, by=0.1)
    > d2 <- data.frame(x=x2)
    > y2 <- predict(res, newdata=d2)
    > lines(x2, y2, col="red")
    fit-nls.png
  • 言葉の定義が不十分ですみません。質問の多い順番にTOP20までをピックアップし、それぞれの順位の件数の全質問件数に対する割合を累積で足したものになります。したがって、収束値は100になります。全質問件数は12,000件になります。実は色々な質問において、このような質問に対する分析をしていると、TOP20までの軌跡がほぼ同じであることを知り、この分布を知りたいと思ったしだいです。 -- おじさんの悩み? 2009-09-15 (火) 10:28:48
  • ああ,そう。そのような場合は,べき乗則ですね。横軸に順位の対数,縦軸に頻度の対数をとってプロットすると直線に近似できる様な分布。傾きが-1のときは,かの有名なジップの法則。直線に近似できるが傾きが-1以外の場合が広義のジップの法則。横軸に順位,縦軸に累積頻度をとってプロットしてできるのが,これも有名なパレート曲線。この曲線(累積度数曲線)について,有名なのがパレートの法則。20%の社員が80%の売り上げを生み出すというような80対20の法則。横軸に順位,縦軸に頻度をとってプロットした図の右の方に長々と連なるのが,これも有名なロングテール。 -- 河童の屁は臭いか? 2009-09-15 (火) 10:52:21
    > y <- c(0, 5.9, 11.1, 15.7, 19, 21.9, 24.5, 26.9, 
    +   29.2, 31.5, 33.3, 34.9, 36.5, 38.1, 39.7, 41.2, 
    +   42.6, 44, 45.4, 46.7, 48)
    > y2 <- log(diff(y))
    > x2 <- log(1:20)
    > plot(y2 ~ x2, pch=19, cex=0.5, main="べき乗則(広義のジップの法則)--両対数グラフ",
    +   xlab="順位の対数", ylab="頻度の対数")
    > ans <- lm(y2 ~ x2)
    > abline(ans, col="red")
    > ans
    
    Call:
    lm(formula = y2 ~ x2)
    
    Coefficients:
    (Intercept)           x2  
         1.9725      -0.5749  # 傾きが -0.579 なので,広義のジップの法則に従っているといえる
    jips-law.png
    上に続けて,
    > x2 <- log(1:100)
    > y2 <- ans$coefficients[1]+ans$coefficients[2]*x2
    > plot(exp(y2), pch=19, cex=0.5,
    + main="1〜20までの頻度から予測した結果--ロングテール",
    + xlab="順位", ylab="頻度")
    > points(diff(y), col="red", pch=19, cex=0.5)
    > legend("topright", legend=c("実測値", "予測値"), pch=c(19, 19),
        col=c("red", "black"))
    long-tail.png
  • 図表のフォントが綺麗なのですが、MACだからですか? -- 2009-09-15 (火) 23:16:37
  • 大変お世話になりました。お礼を申し上げるのが、遅れてすみません。今しがた会社から帰宅しました。午前中に一度コメントを入力し、それ以来仕事に没頭しておりすみません。物理学科を卒業して20年が経ちました。40を過ぎてから、色々なことを勉強したくなり、Rも6月より仕事のツールとして活用し始めました。今は学生のころと比べ、お金には不自由しなくなりましたが、時間がなくて、皆様に甘えて助けて頂きました。感謝申し上げます。 -- おじさんの悩み? 2009-09-15 (火) 23:39:44

Rcomanderのクラスタリング図で名称が表示されない

R初心者くん? (2009-09-13 (日) 03:40:01)

お世話になっています。Rcomanderについて質問させてください。

3列のデータがあったとします。その最も左の列にサンプルの名称が、残り2列はそのサンプルのデータとします。
そのサンプル名をRcomanderを利用してつくったクラスタリングの図に載せたいのですができません。ただ、数値ならば可能です。

ご存知の方がいらっしゃたらご教授願えないでしょうか
お願いします。

  • 過去にも同じような質問があったはずで。print.hclust の labels 引数はご存じですか?Rcommander でどうやって指示するかは私は知りませんけど。
    ちょっと見てみましたけど,オプショナルな引数を直接的に指定することができないのかなあ。取りあえずデフォルトで実行して,その後スクリプトウィンドウに表示されるスクリプトの中の,plot 関数の引数(の最後に),', labels=描きたい名前の列の指定' のようにして,plot 関数の記述を選択して,「実行」ボタンをクリックすると,名前が描かれるようですよ。(面倒ですね。こんなことをするくらいなら,Rcommander など使わずに直接 R コンソールにスクリプトを入力したほうがましなような) -- 河童の屁? 2009-09-13 (日) 12:56:29
    HClust.1 <- hclust(dist(model.matrix(~-1 + 
      Petal.Length+Petal.Width+Sepal.Length+Sepal.Width, iris)) , method= "ward")
    plot(HClust.1, main= "Cluster Dendrogram for Solution HClust.1", xlab= 
     "Observation Number in Data Set iris", sub="Method=ward; 
     Distance=euclidian", labels=iris$Species)
    plot.hclust.png
  • ご丁寧な解説ありがとうございました!参考にさせていただきます -- R初心者くん? 2009-09-13 (日) 22:22:08

列を増やし通し番号を振る

yuri? (2009-09-09 (水) 10:56:26)

10万行ほどのファイルを読み込んで作業をしますが、新しく一列増やし(場所はどこでも良い)、列名をindexとして通し番号を付けたいのです。その際、あらかじめ自分で行数を確認して付けるのではなく、自動で行数を認識させて、自動的に必要な分だけの通し番号を付けるような関数はありますでしょうか。

  • データフレームを d とすれば,d$index <- 1:nrow(d)。それだけ。 -- 河童の屁? 2009-09-09 (水) 11:55:28
  • 初歩的なことですみませんでした!大変助かりました。どうもありがとうございました!! -- yuri? 2009-09-09 (水) 12:06:59

相関関係を表すグラフ

にぽぽ?(2009-09-08 (火) 20:21:00)

初級者にすら到達していない者です。
統計解析をRで行いなさい、と突然上の者から指示され、こちらのサイト等を見せていただいて相当あれこれやってみたのですが、もうどうしようもなくて、こちらに書かせていただきました。
R2.9.0です。

下の表のような表があります。
縦軸が商品、横軸が年齢層です。
縦軸横軸ともに10項目以上あります

  A B C D E F・・・
イ 0 1 0 0 0 0
ロ 1 0 0 0 0 0
ハ 0 0 1 1 1 0
・
・
・

縦軸の相関関係を表わそうとigraphでやってみたのですが、どうにもうまくいきません。

shouhin<-matorix(c(0,1,0,1,0,0,0,0,1,0,0,1,0,0,1,0,0,0・・・),nrow=13,ncol=7)

と書いて

library(igraph)

として、行き詰ってしまいました。

そもそも、相関関係という言葉が正しいのかもわからないのですがやりたいことは、例えば縦軸の商品イとハは、横軸の50歳代に人気だから近しい商品である、とグラフでわかるようにしたいのです。

どの関数を使ったら、目的のグラフを描画することができるでしょうか。
お力をお貸しいただければ嬉しいです。

  • MASS ライブラリにある corresp 関数(コレスポンデンス・アナリシス;対応分析)を使うというのも手でしょう。与えられた,3行6列(但し,F列が全部0になっているのでちょっと変えましたが)のデータを分析すると以下のようになります。それぞれの図で,近くにプロットされているものが近いという解釈になります。詳しくは,コレスポンデンス・アナリシスを勉強してください。 -- 河童の屁? 2009-09-08 (火) 21:18:21
    > (d <- structure(list(A = c(0L, 1L, 0L), B = c(1L, 0L, 0L), C = c(0L, 
    + 0L, 1L), D = c(0L, 0L, 1L), E = c(0L, 0L, 1L), F = c(1L, 0L, 
    + 0L)), .Names = c("A", "B", "C", "D", "E", "F"), class = "data.frame",
    + row.names = c("イ", "ロ", "ハ")))
       A B C D E F
    イ 0 1 0 0 0 1
    ロ 1 0 0 0 0 0
    ハ 0 0 1 1 1 0
    > library(MASS)
    > library(maptools)
    > (ans <- corresp(d, nf=2))
    First canonical correlation(s): 1 1 
    
     Row scores:
                [,1]       [,2]
    イ -8.732638e-17 -1.4142136
    ロ -2.121320e+00  0.7071068
    ハ  7.071068e-01  0.7071068
    
     Column scores:
               [,1]       [,2]
    A -2.121320e+00  0.7071068
    B -2.019203e-16 -1.4142136
    C  7.071068e-01  0.7071068
    D  7.071068e-01  0.7071068
    E  7.071068e-01  0.7071068
    F -9.637845e-17 -1.4142136
    > layout(matrix(1:2, 1))
    > plot(ans$cscore)
    > pointLabel(ans$cscore[,1], ans$cscore[,2], rownames(ans$cscore), offset=1)
    > plot(ans$rscore)
    > pointLabel(ans$rscore[,1], ans$rscore[,2], rownames(ans$rscore), offset=1)
    > layout(1)
    corresp.png
  • 河童の屁様、さっそくにありがとうございます。コレスポンデンス・アナリシスというのを使うのですね。教えていただいた通りに打ち込んでみたところ、何列か行がすべて0になっているところがあるデータだと、emptyとなったのですが、0は分析対象にならないのでしょうか。どうも上司は0でも解析してくれるのがRらしいと聞き及んでいたようなんです・・。 -- にぽぽ? 2009-09-09 (水) 14:22:28
  • 「上司は0でも解析してくれるのがRらしいと聞き及んでいた」そのような要素は情報を持たないわけで,そのようなデータは含む意味がないどころか,含めると分析ができないわけで。 -- 河童の屁? 2009-09-09 (水) 15:41:37
  • ご丁寧な回答、ありがとう存じます。冷静になって考えるとその通りですね・・。ところで、すべての列に0以外の値の入っている7×10の表でお教えいただいたとおりに打ち込んでみたのですが、corresp.matrix(as.matorix(x), ...):empty row or column in table とエラーになりました。本当に申し訳ないのですが、自分なりに調べてももうどうしようもなく、もう少しお力をお貸しいただけましたら、と図々しく考えております、よろしくお願いいたします。 -- にぽぽ? 2009-09-09 (水) 23:50:43
  • 'empty row or column in table' の empty とは,ある行(または列)が全て0になっているところがあるということです。あなたは,2009-09-09 14:22:28 に「何列か行がすべて0になっているところがあるデータだと、emptyとなったのですが」と書いてましたよね。7×10行列なら,目で見ても分かるとは思いますけど,d を行列(データフレーム)として,colSums(d) と rowSums(d) の2つをやってみれば,どこが問題なのか(列和か行和が0になるのか)わかりますよね。もし,そのような行や列があったら,そのような行や列を取り除いて分析してください。 -- 河童の屁? 2009-09-10 (木) 00:07:51

行の値を区切り文字で2分割したい場合のNAの処理

ぼう? (2009-09-08 (火) 09:07:07)

お世話になります。
たとえば下記のようなグループ名をもつ行列dfがありまして(reshapeパッケージで2つのカテゴリーを行名にcastしたものです)これをアルファベットと数字に分割して別々に列の値に入れたいと思っています。

欠損が無ければstrsplit(rownames(df),"-")とunlistを組み合わせて簡単にできそうですが、ところどころ値のないカテゴリーがありうまく処理できずにいます。
アドバイスいただければ幸いです。
これを

df <- data.frame(1:6)
rownames(df)<-c(
"A-I",
"A-II",
"A-",#←こんな風に欠損がところどころある。
"B-I",
"B-II",
"-III"
)

こうしたい

|c1|c2 |value|
|A |I  |1|
|A |II |2|
|A |NA |3|
|B |I  |4|
|B |II |5|
|NA|III|6|


  • R はプログラムできるのだから,やりたいことができるようにプログラムを書けばよい。使い捨てプログラムなのだから,うまいプログラムである必要はない。効率とか考えるより,書いて,すぐ動いて,すぐ答えが出ればよい。 -- 河童の屁? 2009-09-08 (火) 12:03:26
    ans <- sapply(rownames(df), function(str) {
    	a <- unlist(strsplit(str, "-"))
    	len.a <- length(a)
    	if (len.a == 1) {        # "-" の後がない
    		return(c(a, NA))
    	} else if (a[1] == "") { # "-" の前がない
    		return(c(NA, a[2]))
    	} else {                 # 完全
    		return(a)
    	}	
    })
    (df2 <- data.frame(c1=ans[1,], c2=ans[2,], value=df[,1]))
  • ありがとうございます。そのとおりではあるのですが、applyの中にそのまま関数を書いて入れられるのは初めて知り勉強になりました。for文で個別に書くものかと思っていましたが(こういう汚いデータがいくつかあるのです・・・)、これでだいぶすっきりしますし、効率もよくなりそうです。 -- ぼう? 2009-09-08 (火) 12:32:21

中身を変えて同じ関数を何度も繰り返し実行したい

tefu? (2009-09-07 (月) 21:17:18)

初歩的な質問で申し訳ありません。

ある関数function(x)のxに、毎回違う数字を入れて何度も繰り返したい場合、どのような方法があるでしょうか?

挿入する数字に規則性はなく、数百回単位で繰り返したいのですが、効率的な方法はありますか?

  • その数値をベクトルに入れておいて,x <- c(1,3,2,5); sapply(x, function(x) x*2+3) みたいにすれば?
    場合によっては,例に挙げたような場合なら,関数なんか使わなくても,ベクトル演算やればよいだけ,みたいなこともありますね。x <- c(3,5,4,7,6); answer <- x*2+3 -- 河童の屁? 2009-09-07 (月) 22:02:09
  • 普通のFor文で書いてはダメでしょうか? このあたりを見ては?http://takenaka-akio.cool.ne.jp/doc/r_auto/chapter_07.html -- 2009-09-08 (火) 10:09:22
  • Rならベクトル演算が定石でしょうね。「毎回違う数字」の出現するタイミングにもよるけど。 -- 2009-09-08 (火) 15:51:27
  • For文でできました。ありがとうございました。 -- tefu? 2009-09-08 (火) 19:50:55

aov関数で求められる平方和

aor? (2009-09-06 (日) 19:11:53)

以前はfactor関数についてお世話になりました。
aov関数で求められる平方和について教えていただきたく、投稿いたします。
Jonathan Baronによる解説 を読んで疑問が出てきました。
上記の解説、Unbalanced (Nonorthogonal) Designsのセクションによると
SPSSで平方和のタイプを2と設定すれば、aov関数の結果と一致する、とあります。

aovで求められる平方和はタイプ2、ということなのでしょうか。
現在、SPSS、SASを使用できる環境ではなく、検証できておりません。
aovでの平方和についてご存知の方、あるいは検証方法についてのヒントでも
いただけたら幸いです。よろしくお願いいたします。
環境はR2.9.2、windows vistaです。

なお、平方和について不勉強で、色々検索し、中澤先生の解説, 岸本先生の解説 などを参考にしました。
anova関数ではタイプ1、という記述は色々なところで散見されるのですが、 aov関数でどのように行っているかは (自分としては) 不明です。
また、筑波大学の井関先生の作成された分散分析関数 により、
平方和をタイプ2に指定して検証してみましたが、aov関数の結果と一致するようです。
以下はJonathan Baronの解説で記載されていた混合計画の分散分析のコードです。

##Jonathan Baronの解説でのaov関数を使うコード (少し修正を加えました) 
#データ生成
data1<-c(49,47,46,47,48,47,41,46,43,47,46,45,48,46,47,45,49,44,44,45,42,45,
45,40,49,46,47,45,49,45,41,43,44,46,45,40,45,43,44,45,48,46,40,45,40,45,47,40)
### 交互作用ありにしたいときのデータ (これは私が加えたものです) 
####data1<-c(49,10,46,47,48,47,41,46,43,5,46,5,48,46,47,45,100,44,44,45,42,45,
####45,40,49,46,47,45,49,45,41,43,44,46,100,40,45,43,44,45,48,46,40,45,10,45,10,40)
####data1<-c(49,10,46,47,48,47,41,46,43,5,46,5,48,46,47,45,100,44,44,45,42,45,
####45,40,49,46,47,45,49,45,41,43,44,46,100,40,49,10,46,47,48,47,41,46,43,5,46,5)
## 行列化 (データ確認のため) 
matrix(data1, ncol= 4, dimnames = list(paste("subj", 1:12),
c("Shape1.Color1", "Shape2.Color1" ,"Shape1.Color2", "Shape2.Color2"))) 
# aov用のデータフレーム作成
Hays.df <- data.frame(rt = data1, subj = factor(rep(paste("subj", 1:12, sep=""), 4)), 
shape = factor(rep(rep(c("shape1", "shape2"), c(12, 12)), 2)),
color = factor(rep(c("color1", "color2"), c(24, 24))))
# 非釣合型のデータにするため、grp変数を付け加える
Hays.df$grp <- factor(rep(c(1,1,1,1,1,1,1,1,2,2,2,2), 4))
# aovで分析
aovres <- aov(rt ~ grp*color*shape + Error(subj/(color+shape)), data=Hays.df)
summary(aovres)

## anovakun (井関先生の分散分析関数) でも検証するためにデータフレームに
## 分散分析関数を読み込めるようにしないと動作しません。
datkun <- data.frame(matrix(data1, ncol= 4, dimnames = list(paste("subj", 1:12),
c("Shape1.Color1", "Shape2.Color1" ,"Shape1.Color2", "Shape2.Color2"))))
grp <- c(1,1,1,1,1,1,1,1,2,2,2,2)
datkun <- data.frame(cbind(grp, datkun))
# anovakunで分析
anovakun(datkun, "AsBC", 2, 2, 2, type2=T)

以上の分析で、結果が一致したため、aov関数の平方和について疑問を抱いたしだいです。
どうぞよろしくお願いいたします。

  • aovはタイプ1だと思います。aovではデータによっては変数の投入順序で結果が変わることがあります。タイプ2やタイプ3の平方和ではこのようなことは起こらないはずです。ちなみに,非釣り合い型のデータであれば必ず投入順序によって結果が変わるわけでなく,結果が変わらないことも結構あるようです。ちょっと話が違うかもしれませんが,ここで例に使っているデータもたまたまタイプ1とタイプ2の結果が一致する例なのでは。 -- 2009-09-08 (火) 19:07:28
  • ご回答ありがとうございます。他のサイトでのお話によると、ご指摘のとおり、タイプ1とタイプ2が一致する例のようです。お手数おかけしました。 -- aor? 2009-09-10 (木) 22:57:55

Rで何が出来るのですか?

maru? (2009-09-05 (土) 10:40:39)

過去の売り上げから今後の売り上げ予測とか
このような時系列の予測が出来るのでしょうか?

  • できます -- 河童の屁? 2009-09-05 (土) 11:20:49
  • >できます  それは、単体のものでも可能なのでしょうか? -- maru? 2009-09-05 (土) 11:35:06
  • 例えば、えんぴつ単体の売り上げだけでも予測出来るのでしょうか? 例えば、えんぴつ単体の売り上げだけでも予測出来るのでしょうか? それとも、えんぴつ単体では予測出来なくて ノートの売り上げ、消しゴムの売り上げ、 これらの複数のデータと見合わせないとえんぴつの売り上げは、 予測出来ない。 そういうことは、ありませんか?-- maru? 2009-09-05 (土) 11:40:52
  • 月ごとの鉛筆の売り上げのデータが何年分かあればできるでしょう。 -- 河童の屁? 2009-09-05 (土) 11:51:43
  • ↑ どのような時系列モデルを使用するとよさそうでしょうか? -- maru? 2009-09-05 (土) 14:24:11
  • それは,いろいろな予測方式がありますけど。取りあえず ? AirPasseners? とやってみたり -- 河童の屁? 2009-09-05 (土) 14:45:22
  • Rで全てのことができます。
  • AirPasseners? ? 具体的にやる方法を教えて頂けると助かります -- maru? 2009-09-05 (土) 15:39:52
  • R のオンラインヘルプを見る方法です。クエスチョンマークの次に知りたいもの(念のため,AirPassensers? の最後に?が付いているのは,Wiki のせいです。最後の?は付けてはいけません。AirPassengers? のオンラインヘルプの中に,example の項がある。そこに arima 関数を使う説明がある。殆ど何もご存じなさそうなので,何か教科書を読む方がよさそうですね。 -- 河童の屁? 2009-09-05 (土) 15:44:42

tapplyで、複数の引数を使う関数(corなど)を扱うには

INA? (2009-09-04 (金) 23:58:36)

みなさま、どうぞよろしくお願いいたします。

2つ以上の引数を用いる関数(corなど)を、tapplyで扱えずに苦心しております。

ある産業分類(200種類くらい)に含まれる個店データ約20万件があり、以下のような構造です。

DataSet?
個店ID,産業分類,従業者数,販売額,設立年
000001,01_パン小売業,10,10000,11
000002,09_豆腐小売業,4,1200,2
000003,14_金物小売業,20,25000,4
: : : : :

これらを「産業分類別に」分類,集計しようと考えています。
その際、tapply関数を用いて、各産業ごとの集計を簡単にしようと考えました。

例えば産業別の販売額合計については、

> tapply(DataSet$販売額,DataSet$産業分類,sum)

で、産業分類別に問題なく集計できました。

しかし「販売額と従業者数の相関関係」を見ようとした場合、

>cor(DataSet$従業者数,DataSet$販売額)


のように、複数の引数を指定する必要があります。
これをtapplyを用いて、産業分類別に処理しようとしたところ、うまくいかないのです。
たとえば

> tapply(DataSet,DataSet$産業分類,cor(DataSet$従業者数,DataSet$販売額))
以下にエラー match.fun(FUN) : 
 'cor(DataSet$従業者数,DataSet$販売額)' は関数、文字、またはシンボルではありません

> tapply(list(DataSet$従業者数,DataSet$販売額),list(DataSet$産業分類),cor)
以下にエラー tapply(list(UDataSet$従業者数,DataSet$販売額),  : 
引数は同じ長さでなければなりません

のようになります。
産業分類が多種類であることや、データが頻繁に追加・削除されることから、相関係数等を求める操作をなるべく簡単にしておきたいのです。
version 2.9.2、WinXP SP3上で動作中です。
なにぶんにも未熟でございまして、よい方法をご存知の方、お手数とは存じますが、どうぞよろしくお願いいたします。

  • こんなんでどうでしょう -- 2009-09-05 (土) 00:11:29
    sapply(split(DataSet, DataSet$産業分類), function(x) cor(x$従業者数, x$販売額))
  • フレディー? 2009-09-05 (土) 00:34:03
    sapply(split(DataSet[,3:4],DataSet[,2]), function(x) cor(x)[1,2])
  • 無駄が多いコードではあるが,以下のようなものも。 -- 河童の屁? 2009-09-05 (土) 11:45:17
    sapply(levels(iris$Species), function(x) {
    	y <- iris$Species==x
    	cor(iris$Petal.Width[y], iris$Petal.Length[y])
    	})
  • お礼が遅くなりまして失礼致しました。sapplyを用いて、無事解決できました。有難うございました。 -- INA? 2009-09-14 (月) 23:31:32

死を入力するとエラーになる

akira? (2009-09-01 (火) 19:30:02)

いつもありがとうございます。
ベクトルで「死」を指定するとエラーになるのですが、対処法はありますでしょうか?

WinXP R-2.9.1 Patchedの場合
Rgui.exeならOK
>c("死") #OK
R.exeだとエラー
>c("死") #NG
c(invalid multibyte character in mbcs_get_next
+)
+
Ubuntu9.04 R-2.9.1 の場合
>c("死") #OK

となります。
R.exeだけで生じます。エンコードとか関係するのでしょうか?
とりあえず、Ubuntuで対応できますが、少し気持ち悪いです。

  • エンコードでしょうね。最新バージョンとか言う人??ですね。 -- hoki? 2009-09-02 (水) 19:35:44

データフレームの範囲を指定して因子変数にする方法

aor? (2009-08-31 (月) 21:33:00)

初めて投稿させていただきます。
200行30列からなるデータフレーム (dat) の第4列から第24列までを因子変数にしたいと考えています。
以下のようなコードではうまくいきませんでした。

factor(dat[4:24])
factor(dat[,4:24])
for (i in 4:24){
datf[i] <- factor(dat[i])
}

上3つのコードは以下のような警告がでます。

以下にエラー sort.list(unique.default(x), na.last = TRUE) : 
'x' は 'sort.list' に対してはアトミックでなければなりません。 
'sort' をリストに対して呼び出しましたか?
sapply(dat[,4:24], factor)
sapply(dat[4:24], factor)

上2つは警告は出ませんが、classがcharacterになります。
現在は以下のように、個々の変数にfactorを適用しています。

dat[,4] <- factor(dat[,4])
dat[,5] <- factor(dat[,5]
....
dat[,24] <- factor(dat[,24]

これを範囲指定してまとめて行いたいのですが、よい方法をご存知の方、よろしくお願いいたします。
なお、R2.9.1, WindowsVista?環境です。

  • カンマの有無に注意 -- 河童の屁? 2009-08-31 (月) 22:12:04
    set.seed(123) # 再現性のあるデータを作るため
    dat <- data.frame(matrix(sample(4, 6000, replace=TRUE), 200)) # テスト用のデータフレーム
    datf <- dat # 変換後のデータフレーム
    for (i in 4:24) {
    	datf[,i] <- factor(dat[,i]) # カンマの有無に注意
    }
    sapply(datf[,4:24], class)
    これも基本です。データフレーム x において,x[1] と x[,1] には違いがあり,x[1:2] と x[1:2] には違いがない。x[1] でないと駄目な場合,x[,1] でないと駄目な場合,どちらでもよい場合という3つの場合があるので注意。たとえば,上の datf[,i] は datf[i] でもよいなど。sapply などを使う場合も同じように,どの記述法でなければならないかに注意。
  • ご回答ありがとうございます。お教えいただいたコードで実現できました。また、カンマについてのご指摘、ありがとうございました。勉強しなおします。 -- aor? 2009-08-31 (月) 22:24:52
  • sapply ではなく,lapply を使えばよい。(これは,私も初めてのコーディング例だった) -- 河童の屁? 2009-08-31 (月) 22:34:31
    set.seed(123) # 再現性のあるデータを作るため
    dat <- data.frame(matrix(sample(4, 6000, replace=TRUE), 200)) # テスト用のデータフレーム
    datf <- dat # 変換後のデータフレーム
    datf[4:24] <- lapply(dat[4:24], factor)
    sapply(datf[4:24], class)
  • lapplyを教えてくださった方、ありがとうございます。sapplyとlapplyは結果の返し方のみが異なると思っておりました。勉強になりました。 -- aor? 2009-08-31 (月) 23:16:50

Metaforのグラフィックについて

なんび? (2009-08-31 (月) 17:33:24)

Metaforを使って、メタアナリシスを行い、フォレストプロットを描くのに、

forest(xxxx) というコマンドではデータが下からプロットされ、
自動的に「study1」「study2」と試験名がふられますが、
データを上からプロットさせる方法はありますか。
「study1」ではなく、自分のデータ(SOC)を描きいれる方法がありますか。
以下のようなプログラムを作っています。

library(metafor)
dat<-scan("./zom.prn",
list(SOC="",ai=0,n1i=0,ci=0,n2i=0),
skip=0,nlines=30,sep="")
zompeto<-rma.peto(ai,n1i,ci,n2i, slab=NULL, subset=NULL, data=dat,

        add=c(1/2,0), to=c("only0","none"), level=95, digits=4)

forest(zompeto)

  • 追試できません -- 河童の屁? 2009-08-31 (月) 18:08:14
    > dat<-scan("./zom.prn",
    + list(SOC="",ai=0,n1i=0,ci=0,n2i=0),
    + skip=0,nlines=30,sep="")
     以下にエラー file(file, "r") :  コネクションを開くことができません 
     追加情報:  Warning message:
    In file(file, "r") :
       ファイル './zom.prn' を開くことができません: No such file or directory 
    + zompeto<-rma.peto(ai,n1i,ci,n2i, slab=NULL, subset=NULL, data=dat,
    + 
    +         add=c(1/2,0), to=c("only0","none"), level=95, digits=4)
     以下にエラー eval(expr, envir, enclos) :  オブジェクト 'ai' がありません 
    + 
    > forest(zompeto)
     以下にエラー forest(zompeto) :  オブジェクト 'zompeto' がありません 
    例えば,forest.default の example についていえば,データを逆順に並べ直せば,下から描かれるとちょうどあなたの希望通りになるでしょう。また,ラベルも,自分で定義すればその通り描かれると思いますよ。 forest.default の example の実行結果と,以下のコードの実行結果を比べてみましょう。ね。
    dat.bcg2 <- dat.bcg[rev(dat.bcg[,1]),] # 大元のデータを逆順に並べる
    dat <- escalc(measure="RR", ai=tpos, bi=tneg, ci=cpos, di=cneg, data=dat.bcg2)
    slab <- paste(dat.bcg2$author, dat.bcg2$year)
    slab[13] <- "Foo Bar 2009" # ラベルの書き換えというか,データに自分のものを加えればよいだけでは?
    forest(dat$yi, dat$vi, slab=slab, 
           atransf=exp, xlab="Risk Rates (log scale)")
  • zomのデータです。 -- なんび? 2009-08-31 (月) 18:29:00
  • zom ってなに。どこにあるの? -- 2009-08-31 (月) 18:31:12
  • zomは上のプログラムで読み込ませてるデータの名前です。データの中身をのせようとしてのですが、うまくできませんでした。 -- なんび? 2009-08-31 (月) 18:32:54
  • すみません、そのforest.defaultというのは、どうすれば見れるのでしょうか。 -- なんび? 2009-08-31 (月) 18:35:45
  • ? forest.default してみそ -- 河童の屁? 2009-08-31 (月) 18:42:46
  • rma.peto なら,? forest.rma もしてみそ -- 2009-08-31 (月) 18:46:52
  • [forest.default]、[forest.rma]もみることができました。study1,2・・・については解決しました。 あと一点伺いたいのですが、大元のデータを逆順にならべるのができません。その方法を教えていただけないでしょうか。    -- なんび? 2009-08-31 (月) 19:22:09
  • 上にも書いたけど。一般に,データフレーム x があれば, -- 河童の屁? 2009-08-31 (月) 19:23:02
    x <- data.frame(a=c(5,2,3,2,1), b=c(4,3,2,1,5))
    y <- x[nrow(x):1,] # とすればよい
    実際にやって調べて見るなり。データの扱い方の基本あるよ。
    それと,重複した発言は消去するなりして,きれいに後始末しておくよろし。
  • >dat.bcg2 <- dat.bcg[rev(dat.bcg[,1]),]  とおなじようにしたのですが、>dat2 <- dat[rev(dat[,1]),] 「次元数が正しくありません」とメッセージがでます。  -- 2009-08-31 (月) 19:31:43
  • dat2 <- dat[rev(dat[,1])]とかしてませんか? -- 2009-08-31 (月) 20:19:31
  • してます・・・  -- なんび? 2009-08-31 (月) 20:48:39
  • 「してます・・・」って,原因がわかったということ?わからないということ?「してました」って書いてあれば,原因はわかったということがわかるんですけどね。日本語というのは,難しいもの。
    要するに,プログラムというのは,肝心なところは一文字でも間違えると駄目だ(エラーになりますよ)ということですよ。書かれていることの意味を考えずに,単にまねしようとするから,完全にまねできないとエラーになるんですね。データフレームで,x[1:2,] などというのが何を表すか,再確認するのが先決ですね。
    また,最初に挙げた例よりは,後で挙げた例の方が一般的ですよ。まずは,そのままコピーして動かしてちょんまげ。 -- 河童の屁? 2009-08-31 (月) 21:14:23
  • ありがとうございます。 もう少し戻って考え直してみたいと思います。 が、「後で挙げた例」というのは、「y <- x[nrow(x):1,] 」のことですよね? 参考にさせていただきます。 -- なんび? 2009-09-01 (火) 18:03:14

repeated-measure data & random effect

taipapa? (2009-08-23 (日) 21:45:22)

お世話になります.
次のようなデータを分析してます.コントロール28人,疾患群25人で,各人は脳画像の4ヶ所(A,B,C,D)からXというデータを取ります.知りたいのは,コントロールと疾患群でXの値が違うかどうか,違うならA,B,C,Dのうちどこの場所でちがっているのか,ということです.治療の有無はC or Pで,場所はlocationで表し,各個人はsubjectIDを振ってます.また,Xは0から1の間の値を取ります.

> madata
       CorP      X    location    subjectID
1   control   0.708       A         1
2   control   0.648       A         2
3   patient   0.638       C         3
4   control   0.547       D         4
5   patient   0.632       B         5
6   control   0.723       C         6
......

というかんじです.

各A,B,C,Dは同一人物の場所なので,subjectIDでrandom effectとし(こういう表現で良いか分かりませんが),以下のような線形混合モデルを2つ作成しました.

model1 <- lme(X ~ CorP*location, random= ~ 1| subjectID, data)
model2 <- lme(X ~ CorP*location, random= ~ location| subjectID, data)

基本的なことですが,書式がよく分からず,私の想定したモデル(同一人物からのXの値はlocationが異なってもfixed effectではなくrandom effectとする)を正しく表しているのはどちらなのでしょうか? model2だとおもっているのですが...
また,defaultでは,restricted log-likelihoodの最大化を行うようになっていますが,私が見た資料ではlog-likelihoodの最大化を指定していました.この使い分けはどうすれば良いのでしょうか?
根本的に間違っているところもあるかもしれませんが,ご教示いただければ有り難いです.

  • 判別分析でないの? -- 2009-08-23 (日) 23:12:48
  • 私の目的は,疾患の有無の判別を行うことではなくて,疾患群に於いてどの部位でXの値が正常人と比べて低下あるいは上昇しているかを調べることですので,lmeを用いてみました.判別分析でこのようなことができるのでしょうか? -- taipapa? 2009-08-23 (日) 23:37:08
  • データを下記のように考えると判別分析のような気がするんだけど・・・。locationに何らかの意味があるのか・・・。 -- 2009-08-24 (月) 08:28:45
    ID CorP    A.X   B.X   C.X   D.X
    1  control 0.708 0.648 0.648 0.547 
    2  control 0.648 0.632 0.632 0.723 
    3  patient 0.638 0.708 0.708 0.632 
    4  ***
  • アドバイスありがとうございます.ご指摘の通りのデータです.locationに意味はあるのです.どこでも良い場所ではなく,疾患の性質上それぞれ意味のある場所なのです.具体的に言えばCでコントロールと疾患群で差があると考えており,データも疾患群の方が低く出ています.それでこのように質問しております. -- taipapa? 2009-08-24 (月) 09:19:55
  • いやいや、locationに意味はあるのかというのは、ABCDが単にXというデータを取った場所の分類にすぎないのであって、ABCD自体をlocationという因子として扱っていいものかということ。あなたのモデルではそのように扱っているので・・・。 -- 2009-08-24 (月) 11:41:53
  • 何度もありがとうございます.因子という概念を私がきちんと理解していないのかもしれません.within-subject factorとしてlocationがあり,そのレベルがA,B,C,Dであると考えてます.これを表すモデルはmodel1, model2,あるいは別の何かなのでしょうか?「ABCD自体をlocationという因子として扱って」と言われているところが良く理解できていません.within-subject factorとどう違うのでしょうか?-- taipapa? 2009-08-24 (月) 12:45:54
  • 私も素人ですが、、、。RとS-plusによる多変量解析という本p188によるとMLは分散を過小評価する傾向にあるのでREMLが推奨されるとあります。JMP(SAS社)もREMLでMLはありませんでした。あとモデルについてもその前後のページで記述されているランダム切片モデルとランダム切片・傾きモデルに相当すると思いますので、当てはまりの良さを比較して検討するのがよいかと思います。 -- こさく? 2009-09-08 (火) 21:36:46

順序ロジスティック回帰と変量効果

dodoria? (2009-08-20 (木) 02:34:47)

順序ロジスティック回帰や多項ロジスティック回帰で、変量効果は指定できるのでしょうか??

パッケージ"gdata"のロードの不具合

Hiro? (2009-08-16 (日) 02:02:40)

パッケージ"gdata"をロードしたいのですが、
パッケージインストーラーでインストールして、
パッケージマネージャでロード済みをチェックしても、
以下の出力が表示されてロードすることができません。

library(gdata)
Error in loadNamespace(i1L?, c(lib.loc, .libPaths())) :

  'gtools' という名前のパッケージはありません 
エラー:  'gdata' に対するパッケージもしくは名前空間のロードが失敗しました 


これはどういった不具合なのでしょうか。
ご回答いただければと幸いです。

  • gtools をロードしたら -- 2009-08-16 (日) 02:40:13
  • ご回答ありがとうございます。問題解決しました。 -- 2009-08-16 (日) 13:44:47
  • パッケージの依存関係を解決にチェックを入れてインストールしよう! -- 2009-08-17 (月) 17:58:21

Rエディタでタブの桁数は設定できるのでしょうか?

beerdog? (2009-08-14 (金) 23:16:42)

はじめまして。Windows版のR2.9.1を現在は使っています。
内蔵のエディタで、タブのコントロールはできるのでしょうか?
デフォルトで変な(?)桁数のようなので変更したいのですが。
教えていただけますでしょうか?

  • ?edit -- 2009-08-15 (土) 20:42:44
  • ご回答ありがとうございます。外部エディタを使ったら?というアドバイスと受け取りました。いろいろ試してみます。 -- beerdog? 2009-08-15 (土) 23:33:08

wireframe関数を用いた描画について

Gyo? (2009-08-14 (金) 21:02:56)

いつもお世話になっております。
Rの超初心者なのですが、グラフィックの方法について、
質問させていただけますでしょうか。

以前のnekoさんのご質問内容に似ているのですが、、
latticeパッケージにあるwireframe関数で画像を描画した後、
その底面に同じ座標軸で図を描写したいのですが、
なにか方法はありますでしょうか?

lattice本のスクリプト集、以前のnekoさんへの回答内容を参考にさせていただいたのですが、
wireframe関数の場合、どのようにしたらいいか分かりませんでした。
ご教授いただければ幸いです。よろしくお願いいたします。

wireframe(volcano, drape=T, col.regions=rgb(1, 0, 0, 0.1), col=rgb (1,1,1,0),
     panel = function(x, y, ..., subscripts){
       panel = panel.wireframe(x, y, ..., subscripts)
       panel.points(20,20,col=2,cex=2) #多分ここに何かが入ると思うのですが。。
     })

Rは、
R version 2.9.1
i386-pc-mingw32
で、windowsXPを使用しております。

どうぞよろしくお願い致します。

  • 以下はSarkar著 Lattice Multivariate Data Visualization with R 第13章掲載のコードです. -- ishida 2009-08-15 (土) 08:59:47
    > panel.3d.contour <- 
         function(x, y, z, rot.mat, distance, 
                  nlevels = 20, zlim.scaled, ...)
     {
         add.line <- trellis.par.get("add.line")
         panel.3dwire(x, y, z, rot.mat, distance, 
                      zlim.scaled = zlim.scaled, ...)
         clines <- 
             contourLines(x, y, matrix(z, nrow = length(x), byrow = TRUE),
                          nlevels = nlevels)
         for (ll in clines) {
             m <- ltransform3dto3d(rbind(ll$x, ll$y, zlim.scaled[2]), 
                                   rot.mat, distance)
             panel.lines(m[1,], m[2,], col = add.line$col,
                         lty = add.line$lty, lwd = add.line$lwd)
         }
     }
    > wireframe(volcano, zlim = c(90, 250), nlevels = 10, 
               aspect = c(61/87, .3), panel.aspect = 0.6,
               panel.3d.wireframe = "panel.3d.contour", shade = TRUE,
               screen = list(z = 20, x = -60))
    詳細は省きますが,この ltransform3dto3d()関数でzlim.scaled[1]と変更して作成されたグラフを参考にしてください.後はltransform3dto3d()関数のヘルプを丁寧に読んで,自力で解決してください.ちなみにSarkarの原書は,『Rによる多変量グラフィックス入門』などと言う題名で,近くシュプリンガー社より翻訳が出版されます(正確な時期はまだ分かりません).
  • 「ヘルプを丁寧に読んで,自力で解決してください」とは,すばらしいコメントです。 -- 2009-08-15 (土) 21:19:33
  • ご回答、ご指導ありがとうございます。 後は、ヘルプを参考にしながら解決したいと思います。 -- Gyo? 2009-08-18 (火) 09:33:36

Cox回帰

EPS? (2009-08-11 (火) 21:36:13)

Cox比例ハザードモデルで幾つかの独立変数(20程度)について単変量解析を行う予定です。

dataframe

      A      B   C      D     F     G   duration    status

1 88 50  43 143 72 14 12 0
2 130 86  40 98 64 8 16 1
3 138 100  28 122 72 11 18 1

     

一つ一つのパラメータについてresult.A<-coxph(Surv(duration,statsu)~A, dataframe)と言ったように解析を繰り返しているのですが、それぞれの独立変数の単変量の結果を一括して出力する方法はないのでしょうか?
for文やsapply関数を用いれば可能なのでしょうか?
ご教授いただければ幸いです。よろしくお願いいたします。

  • そういう,単変量解析を繰り返すやり方はあまり好ましくありませんね. -- 2009-08-12 (水) 14:59:06
  • Nが小さいので単変量で有意となった独立変数(P<0.1)を用いて多変量を行う予定なのですが、、。まずいでしょうか? -- EPS? 2009-08-14 (金) 14:00:06
  • まずいです. -- 2009-08-14 (金) 14:12:21
  • 理由を教えていただけませんでしょうか?同様の手法を用いている論文も散見されますが、、、。教科書的には先行研究で交絡が明らかな独立変数に加えて、単変量で有意となった独立変数も加えて多変量解析を行うという記載があります(医学的研究のための多変量解析、Mitchell H. Katz)。 -- EPS? 2009-08-14 (金) 23:25:27
  • http://aoki2.si.gunma-u.ac.jp/taygeta/statistics.cgi?page=660 No.7328 -- 2009-08-17 (月) 12:10:10

ネットワーク上の他のコンピュータに結果を書き出したい

EDI? (2009-08-08 (土) 01:58:58)

いつも、setwd()をつかって、使っているコンピュータ上に作業ディレクトリーを作り、その中にあるプログラムファイルを動かし、同じディレクトリーに結果を保存しています。
しかし、頻繁に別のコンピュータで作業したりしているので、これに不便を感じています。
そこで、ネットワーク上の別のコンピュータに保存されているプログラムを使ったり、結果を書き出したり、する方法が分かれば大変助かると思っています。

質問としては、作業ディレクトリーとして同じネットワーク上の別のコンピュータのディレクトリーを指定する方法のやり方を教えていただけないでしょうか。

  • OSを明記してください。(OSによって回答がちがうでしょうから) -- 2009-08-08 (土) 09:47:00
  • かぶりましたね。OS依存ではないでしょうか?OSは何を使っていますか?私は読み書き程度ならhomeにmount(Linuxのとき)か、絶対パスを指定(WinXPのとき)しています。ネットワーク上のプログラムを使う場合、私はサーバのプログラムを使うことが多いので、sshで入ってからサーバからlocalのPCをマウントしてlocalのデータを呼び出すことが多いですね。 -- akira? 2009-08-08 (土) 09:50:48
  • 確かにそうです。全てのコンピューターはOSはMac OSXです。よろしくお願いします。 -- EDI? 2009-08-08 (土) 21:47:10
  • Macのシステム環境設定でファイル共有(afp)とWeb共有(WebDAV:http)が起動していることを確認して、Finderの[移動][サーバーへ接続]で他のMacにafpかhttpで接続する。(詳細はヘルプで調べるかググってください)接続されるとデスクトップにマウントされるので、そのファイルパスを使えばいいと思います。(これはRの質問ではないですよ・・・) -- 2009-08-08 (土) 23:23:11
  • 確かに、まずそれを私も試しました。しかし、それだと、初期設定であるusersが作業ディレクトリーとして使われてしまっていました。なのでRの操作内でサーバーにアクセスする方法があるかと思いまして質問しました。 -- EDI? 2009-08-09 (日) 00:37:21
  • 解決しました。 -- EDI? 2009-08-09 (日) 00:50:29
  • 解決しました。ありがとうございます。 -- EDI? 2009-08-09 (日) 00:50:58
  • 解決しました。ありがとうございます。 -- EDI? 2009-08-09 (日) 00:51:05
  • macの場合、マウントしたサーバのディレクトリをFinderからRコンソールにドラッグドロップしてあげれば、フルパスが表示されますよ。そこにsetwdすればいいかと。 -- 2009-08-09 (日) 00:51:16
  • Macでは公開するフォルダの[情報を見る]で共有フォルダのチェックとアクセス権の設定が出来ていないとパブリックだけしか公開されません。共有フォルダの機能はOSの仕事なので、OSがMac,Linux,winでも考え方は同じです。 -- 2009-08-09 (日) 10:16:32
  • なるほど。ありがとうございます。一応メニューバーよりchange working Directry...で共有設定している他のコンピュータを選べることで来ました。しかし、コマンド操作(setwd("他のコンピュータのディレクトリー”))ではErrorが出てしまいます。これは、結局正確なフルパスがつかめていないのでしょうか? -- EDI? 2009-08-11 (火) 01:47:43
  • そうでしょう。getwd()で取り出せませんか? -- 2009-08-11 (火) 08:32:23

offset()は何にでも放り込めるわけではない?

Saito? (2009-08-04 (火) 16:11:47)

いつもお世話になっております。
ヘルプドキュメント、RSiteSearch?()、ネット検索しましたが、見当たらないので質問させてください。環境はWindowsXP、R-2.9.1です。

回帰をするときのオフセット項について質問です。普通、オフセットは係数が推定されない項であるので、Rの例えばglm()だと

glm(y ~ 1, offset=foo)
glm(y ~ 1 + offset(foo))

などとすると思います。しかし、使っている関数によっては引数でoffsetがついていないときがあります。例えば、私は今library(spBayes)のspGLM()という関数を使って解析をしていたのですが、引数にoffsetが見当たりません。そこで、offset()を使って(上記の二つ目のコードのように)オフセットを考慮しようとしたのですが、全く考慮されないようです。以下にサンプルコードをしめします。

library(spBayes)
library(MASS)
##Generate binary data
n <- 50

coords <- cbind(runif(n,1,100),runif(n,1,100))

phi <- 3/50
sigma.sq <- 1 


R <- sigma.sq*exp(-phi*as.matrix(dist(coords)))
w <- mvrnorm(1, rep(0,n), R)

x <- as.matrix(rep(1,n))
beta <- 0.1
p <- 1/(1+exp(-(x%*%beta+w)))
y <- rbinom(n, 1, prob=p)

##Collect samples
beta.starting <- coefficients(glm(y~x-1, family="binomial"))
beta.tuning <- t(chol(vcov(glm(y~x-1, family="binomial"))))
           
n.samples <- 50000

set.seed(1)
#オフセットなしの場合
m.1 <- spGLM(y~1, family="binomial", coords=coords, 
            starting=
            list("beta"=beta.starting, "phi"=0.06,"sigma.sq"=1, "w"=0),
            tuning=
            list("beta"=beta.tuning, "phi"=0.1, "sigma.sq"=0.1, "w"=0.01),
            priors=
            list("beta.Normal"=list(0,10), "phi.Unif"=c(0.03, 0.3),
                 "sigma.sq.IG"=c(2, 1)),
            cov.model="exponential",
            n.samples=n.samples, sub.samples=c(25000,n.samples,10),
            verbose=TRUE, n.report=500)

> print(summary(mcmc(m.1$p.samples)))

Iterations = 1:2501
Thinning interval = 1 
Number of chains = 1 
Sample size per chain = 2501 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

              Mean      SD Naive SE Time-series SE
(Intercept) -0.571  0.4431 0.008861        0.04042
sigma.sq     1.138  0.6225 0.012448        0.07147
phi         24.928 18.0839 0.361605        2.17077

2. Quantiles for each variable:

               2.5%     25%     50%     75%   97.5%
(Intercept) -1.3557 -0.8788 -0.6007 -0.2938  0.3712
sigma.sq     0.1825  0.6351  1.1654  1.5494  2.3773
phi         10.0896 11.9748 17.1254 32.0178 77.8743


#オフセットを考慮した場合
 m.1 <- spGLM(y~1 + offset(rep(1, length(y))), family="binomial", coords=coords, 
            starting=
            list("beta"=beta.starting, "phi"=0.06,"sigma.sq"=1, "w"=0),
            tuning=
            list("beta"=beta.tuning, "phi"=0.1, "sigma.sq"=0.1, "w"=0.01),
            priors=
            list("beta.Normal"=list(0,10), "phi.Unif"=c(0.03, 0.3),
                 "sigma.sq.IG"=c(2, 1)),
            cov.model="exponential",
            n.samples=n.samples, sub.samples=c(25000,n.samples,10),
            verbose=TRUE, n.report=500)

> print(summary(mcmc(m.1$p.samples)))

Iterations = 1:2501
Thinning interval = 1 
Number of chains = 1 
Sample size per chain = 2501 

1. Empirical mean and standard deviation for each variable,
   plus standard error of the mean:

              Mean      SD Naive SE Time-series SE
(Intercept) -0.571  0.4431 0.008861        0.04042
sigma.sq     1.138  0.6225 0.012448        0.07147
phi         24.928 18.0839 0.361605        2.17077

2. Quantiles for each variable:

               2.5%     25%     50%     75%   97.5%
(Intercept) -1.3557 -0.8788 -0.6007 -0.2938  0.3712
sigma.sq     0.1825  0.6351  1.1654  1.5494  2.3773
phi         10.0896 11.9748 17.1254 32.0178 77.8743

となり、offset()を入れても入れなくても、結果が同じになってしまうようです。このような個々のパッケージについて質問してしまって申し訳ありません。もし、どなたか、解決方法をご存知でしたら、こ教示願えれば幸いです。
どうぞよろしくお願い致します。

  • すみません。やはり問題が特化しすぎていたようですね。まだ問題は解決していませんが、自分でプログラムを組むところからやってみます。ありがとうございました。 -- Saito? 2009-08-06 (木) 11:12:46

長さが異なる列を結合する方法

(2009-08-03 (月) 17:55:38)

data.frameは長さが同じものを結合するときにしか使えません。
長さが違う場合はどうすればよいですか

  • 長さが同じになるようにNAでも付け加える(そのようなことが必要になった事情をもう少し詳しく書いた方が適切なコメントが付くでしょう) -- 河童の屁? 2009-08-03 (月) 18:57:08
  • ご指導ありがとうございます。現在、仕事で装置の総修理台数予測を行っています。まずは型式(発売年月が違う)毎の年月別の過去修理台数をもとに季節調整法を使って、トレンド・季節要因と分解しています。ここで求めたトレンドを纏め、csv形式に出力してExcelでグラフ出力しようとしているのですが、当然昔に出した装置ほどデータの数は長くなり、過去から現在までの装置を纏めるとデータ長が異なり、データの統合が出来ずにいます。いまはモデルごとにcsvをつくり、Excelでコピー&ペーストをしているのですが、もっと便利な方法を知りたいと思い質問しました。 -- 2009-08-03 (月) 19:38:07
  • そもそもそう言うデータは、データフレームで取り扱うものではないでしょう。データフレームは、統計学でいえば、データ行列に対応すべきものです。あなたのデータは、データ行列ではないので、データフレームで表現できなくて当たり前なのです。
    不親切だと思われるのは心外なので、典型的なデータ行列がどのようなものかを述べておきましょう。データ行列は、行は観察単位、例えば小学校の1学級の個人。列は、その個人に対する様々な観察値。例えば、身長、体重、国語のテストの成績、算数のテストの成績、その生徒の性別など。こんなデータは行数は、クラスの人数、列数は、記録されたデータの種類。このような場合、欠損値はあるかも知れないが、データ行列としては、n×m行列になる。列ごとにデータ数が異なるようなことはない(データ数が異なることがあるかも知れないが、それは、ある生徒の測定値がない NA 欠損値ということに過ぎない)わかりやすくいえば、エクセルの表を作るとき、行数と列数を決めて(行に何を置いて、列に何を置いて)表を作れなければ、データフレームにはなれないということです(形式的にできても、意味的にちゃんとできなければ意味ない)
    あなたのデータが、発売後の月数が行、品名が列なら、まだ観察できていないセルをNAとすれば、データフレームの形式に表すことはできるでしょう。しかし、そのデータ行列をどのような文政手法で扱えるかは別の問題。
    経過月数   品名a  品名b  ---  品名Z
        1      0         1    ---      2
           2      1         3    ---      5
           :      :         :    ---      :
           N      2         NA   ---      NA
           N+1    0         NA   ---      NA
    まあ、こんな風。-- 河童の屁? 2009-08-03 (月) 22:56:11
  • 単に一つにまとめてすむのなら、リストにすれば。リストはどんなものでも放り込める便利なデータ構造です。 -- 2009-08-03 (月) 23:54:12
  • NAを利用すると解決することを確認しました。大変にご親切にありがとうございます。当方、理学部物理を卒業し、約20年会社勤務をしております。Rを使い始めて約1ヶ月。「Rによる時系列分析入門」を手に格闘しております。更にRを使って時系列分析を進めるにお勧めの本がありましたらご教示願います。 -- 2009-08-04 (火) 00:06:52

matplotによる図の重ね合わせ方

gonzu? (2009-07-28 (火) 17:06:17)

パッケージspatstatのK関数を何回か繰り返して求めて、その結果をまとめてグラフに表そうとしています。試に5000cm×5000cmのプロット上に、乱数を発生させて円を作り、5回計算を繰り返すようにしました。
しかし、

for(i in 1:5)
{
w<-disc(1000,c(runif(1)*5000,runif(1)*5000),mask=FALSE)
plot(w)
xy<-tennenrin.csv
pp<-as.ppp(xy,w,fatal=FALSE)
K<-Kest(pp,correction="isotropic")
}
matplot(K,type="l")

このようにすると、5本ではなく1本のラインしかグラフに表れず、困っています。何か方法がありましたら、ご教授お願いします。
使用環境は

> sessionInfo()
R version 2.7.2 (2008-08-25) 
i386-pc-mingw32 

です。よろしくお願いします。

  • まずバージョンアップ。質問はそれから。 -- 2009-07-28 (火) 17:30:14
  • 回答ありがとうございます。バージョンアップしました。その後par(new=T)を加えることで、plot()でもグラフを重ね書きできました。
    mymonte<-for(i in 1:10){
    X<-runif(704)*50 
    Y<-runif(704)*50
    XY<-data.frame(X,Y)
    XY<-data.frame(XY,Dataset[,c(2,12)])
    w<-owin(c(0,50),c(0,50))
    Rpp<-as.ppp(XY[,1:2],w,fatal=FALSE)
    mark1<-XY$DBH.02.
    mark2<-XY$sort
    Rpp1<-Rpp %mark% mark1
    Rpp2<-Rpp1 %mark% mark2 
    KC<-Kmulti(Rpp2,(mark1<=5)&(mark1>=1)&(mark2=="ヤブムラサキ"),(mark1>5)&  (mark2=="シラキ"),
        correction="isotropic")
    par(new=T)
    plot(KC, sqrt(iso/pi)-r ~ r,ylim=c(-5,5))	# L関数のグラフ
    }

txtファイルの1行目のタイトルを読み込む方法について(質問)

森林? (2009-07-28 (火) 11:47:09)

テキストファイルの1行目にあるタイトルを読み込み、図などに表示したいのですが、 データは、dat <- read.table(fname, header=T,skip=1)とすればよいけれど、タイトルのみを読むために、
title<-read.table(fname,nrows=1)
とすれば、
title

             V1

1 1号試験地
となります。そこで、
text(x,y,title)
とすると、"1"のみが表示され、"1号試験地"が表示されません。
もっと適切な命令があると思いますが、R-tipsには記載されていないので、おたずねします。よろしくお願いします。

  • names(dat) -- 2009-07-28 (火) 12:05:30
  • 自己レスです。 tit<-title$V1 とすれば解決しました。title$V1 のVを誤って小文字で試したためでした。 -- 森林? 2009-07-28 (火) 12:12:04

複数の連続量同士の相関

taipapa? (2009-07-26 (日) 18:47:05)

初めて投稿します.説明変数を脳の画像上のある値(x1,x2,x3,x4と一人から複数箇所)とし,応答変数を高次脳機能検査(WAISRなど複数,仮にy1,y2,y3,y4)としてその関係を調べようとしています.すべて連続量です.応答変数がひとつなら重回帰で良いかと思うのですが,応答変数も複数の場合はどのような手法が最善なのでしょうか?現在は,それぞれの高次脳機能検査の結果をひとつずつ応答変数として,複数の画像上の値を説明変数としてlmで重回帰をやり,stepAICやwleで,最小のAICを求めて最善モデルを出してます.アドバイスいただければ幸いです.

  • すみません,自己フォローです.正準相関分析を使えば良いのでしょうが,結果の解釈があまりに複雑怪奇でよく分からない為にもっとシンプルな方法はないかなと言うことなのですが,記述のように,応答変数ごとに重回帰をやるのはやはり駄目なのでしょうか? -- taipapa? 2009-07-26 (日) 20:01:03
  • 応答変数(高次脳機能検査)の検査値間の関連を相関などでみた後に、何らかの手法でグループ化してモデルを単純化するとか。 -- 2009-07-27 (月) 08:58:57
  • 応答変数ごとに回帰して意味のある結果が得られれば何も問題は無いでしょう。問題なのは応答変数自体に何らかの関連が疑われる場合でしょうか。正準相関分析は使ったことがありませんが、確か応答変数の線形結合を、説明変数の線形結合でもっともよく説明しようとする、という手法では無かったでしょうか(?)。結果の解釈が難しいという話をきいたことがあります。(もしそうだとして)趣旨としては似たような考え方として、応答変数をまず因子分析し、得られた第一、二因子を二次的な応答変数として、説明変数で回帰することでしょうか。これでも、やはり因子の意味づけが難しいでしょうね。 -- 2009-07-27 (月) 15:20:17
  • うーん。複雑な解析を(安易に)いっぺんにやろうとしてるような気がしますね。もっと目的を細かく分けて、それぞれの目的にあった手法を選んだほうがいいのではないですか。 先行研究でも同じような解析をされているものはありますか?-- 2009-07-27 (月) 18:13:28
  • 複雑と言われればその通りなのでしょうが,過去の実績からあらかじめ予想していた部位の値と高次脳機能検査の結果が相関している結果が単純な1:1の回帰分析で得られたので,次に重回帰分析をを行い,これまた,望ましい結果が得られたのです.そこで,どうせ応答関数は複数あるので,いっぺんに解析してやれと言う「安易な」考えで正準相関分析をやってみて,何がなんだか分からなくなったと言うところです.すなおに,素朴な解析結果をもとに,もう少し考えてみます.自分の勉強の足りなさを痛感しました.色々とアドバイスを有り難うございました. -- taipapa? 2009-07-27 (月) 23:13:27
  • パス解析とかSEMとかは? -- 2009-07-28 (火) 00:07:36
  • ↑先行研究のモデルを参考にするか、納得のいく因子モデル(高次脳機能モデル?)を自分で考えるしかないですね。(この辺りになると手法だけ知っててもどうにもならないです。) -- 2009-07-28 (火) 06:56:08
  • 皆様,たくさんのアドバイスありがとうございます.個人的には,パイロットスタディとしては重回帰分析で有意な関係を見つけられたところで満足しておりましたが,皆様の御陰で,この件に関しては,サンプル数を増やして最善のモデル構築へ向かう気になってきました.サンプル増やすのは非常に大変で道は遠いのですが,その時はまた再び質問させて頂くかもしれません.重ねてありがとうございました. -- taipapa? 2009-07-28 (火) 18:23:27

円グラフについて

tatsu? (2009-07-25 (土) 23:35:19)

 いつもありがとうございます。本当に初心の初心者の質問ですが。ご存知のとおり、円グラフを描くにはpie(x)というコードを使いますが、グラフ上に実際の割合値を載せることは出来ますか。(ラベルなら表示出来ますようですが)よろしくお願いします。

  • できません -- 2009-07-26 (日) 01:10:29
  • lables 引数に適当な文字列を合成して与えてやれば一応それらしいものができます。例えば(こういうことではない?) -- 2009-07-26 (日) 01:48:45
    > x <- 1:5
    > y <- letters[1:5]
    > z <- paste(paste(y,round(100*x/sum(x),1),sep=" "),"%",sep="")
    > z
    [1] "a 6.7%"  "b 13.3%" "c 20%"   "d 26.7%" "e 33.3%"
    > pie(x,labels=z)
  • ラベルを作るには,sprintf を使った方が見通しがよいと思います。 -- 2009-07-26 (日) 14:16:30
    x <- 1:5
    z <- sprintf("%.1f", 100*x/sum(x))
    pie(x,labels=z)
  • どうもありがとうございます。これで十分です。いい勉強になりました。 -- tatsu? 2009-07-26 (日) 21:51:08
  • 勉強ついでに「円グラフは好ましくない」も学んでおいたら? -- 2009-07-27 (月) 23:12:10

複数の変数を使った積分について

Saito? (2009-07-23 (木) 22:09:38)

いつもお世話になっています。似た質問や説明ページがないか捜したのですが見当たらなかったので質問させてください。

例えば、f(x, y)=exp(0.2*x + 0.3*y + sin(2*x) + cos(y) + 1)といった形の関数をxは0〜20まで、yは0〜10まで積分して、その体積を求めようと思ったらどのようにすればよいのでしょうか。以下のようなコードでは動きません。

>  library(adapt)
>  f <- function(x, y){
> +    exp(0.2*x + 0.3*y + sin(2*x) + cos(y) + 1)
> +  } 
> adapt(2, lo=c(0, 0), up=c(10, 20), functn=f)
 以下にエラー function (x, y)  : 
   要素 2 は空です; 
 '*' の引数リストの評価されていた部分は: 
 (0.3, y) 


integrateやlibrary(adapt)、library(MASS)に含まれるadaptやareaは勉強したのですが、いまひとつ使いこなせません。もしどなたかこのような二重積分の方法がわかる方がいましたら、ご教授していただけないでしょうか。

なお、環境はR-2.9.1、WindowsXPです。
どうぞよろしくお願い致します。

  • ネット探す前に、ヘルプドキュメントを熟読するのが先決です。help(adapt) とすれば答えが書いてありますよ。各引数の仕様を良くチェック。 -- 2009-07-23 (木) 23:15:29
  • 回答ありがとうございます。一応、ヘルプは読んでいたのですが、言われたとおり見落としがあるのか調べてみました。その結果どうも複数の変数があると駄目なようなことが書かれていたので、x,yの区別なく書いてみました。
    f <- function(x){
        exp(0.2*x + 0.3*x + sin(2*x) + cos(x) + 1)
      } 
    adapt(4, lo=c(0, 0, 0, 0), up=c(10, 20, 10, 20), functn=f)
    これでも答えは出ますが、間違っている気がします。値がものすごく大きいです…。 えーっと…、まだ読み落としている引数があるのでしょうか…。読み落としている箇所だけでも教えていただけないでしょうか…。-- Saito? 2009-07-24 (金) 11:34:52
  • x はベクトル変数です。その成分は(4次元なら)関数本体中では順に x[1],x[2],x[3],x[4] と参照します。例外として、例えば sin(sum(x)) とすれば x の成分の総和と解釈されます(4次元積分を指定すれば sin(x[1]+x[2]+x[3]+x[4]) と解釈されます)。PS. 第二の例では関数は単一の値を返しません(4次元ベクトルを返す)。奇妙に答えは出るようですが x は x[1] とされているようです。 -- 2009-07-24 (金) 13:51:42
  • 回答ありがとうございました。えーっと、そのように参照されるということは…。最初からこちらで順番に振り分ければ良い…のでしょうか?こんな感じでしょうか。
    f <- function(X){
    x <- X[1]
    y <- X[2]
        exp(0.2*x + 0.3*y + sin(2*x) + cos(y) + 1)
      } 
    adapt(2, lo=c(0, 0), up=c(10, 20), functn=f)
    むむ、合っているのか不安です…。二次元以上になると正解例を作るのもスキル不足で巧くいきません…。検算ができていないので、どなたか分かる方がいましたらこれで合っているのかご教授していただけると幸いです。-- Saito? 2009-07-24 (金) 15:53:12
  • 合っているんではないのでしょうか。値が大きいのは指数関数を使っているから。検証なら例えば -- 2009-07-24 (金) 17:43:17
    > f1 <- function(x) x      
    > (x1 <- integrate(f1,0,1))
    0.5 with absolute error < 5.6e-15
    > f2 <- function(x) x[1]*x[2]
    > (x2 <- adapt(2,c(0,0),c(1,1),funct=f2))
          value      relerr      minpts      lenwrk       ifail 
           0.25 7.38275e-08         165          73           0
  • なるほど、ご助言ありがとうございます。確かに0.25になりますね。これで目的を達成できました。どうもありがとうございました。 -- Saito? 2009-07-24 (金) 19:11:05

spatstatでのwindowのランダム抽出に関する質問

gonzu? (2009-07-22 (水) 15:56:20)

はじめまして。
パッケージspatstatでのK関数の繰り返しについて質問させていただきます。
使用環境はR version 2.7.2 (2008-08-25) i386-pc-mingw32です。
データセットに5000cm×5000cmプロット内の樹木の位置情報(x,y)を持つtennenrin.csvを入れて

w<-owin(c(0,1000),c(0,1000))
plot(w)
xy<-tennenrin.csv
pp<-as.ppp(xy,w,fatal=FALSE)
K<-Kest(pp)
plot(pp)
plot(K)

このようにするとプロット内の左下1000cm×1000cm内でのK関数が算出されるのですが、このwindowをランダムに発生させる方法がわかりません。
試しに同じ面積のwindowを作ろうとして、Excelで乱数を999組発生させてRにデータとして取り込み、そこからwindowの(x,y)の抽出を繰り返そうとしてみましたが

measurement<-read.delim("clipboard")
measurement
> n<-999; m<-1
> x<-1:n
> sample(x,m,replace=TRUE)
[1] 469

となりうまく(x,y)で抽出することができません。どなたかご教授お願いします。

  • 実際に試していませんが、例を見ていると次のようにすればいいのかなと… -- 2009-07-22 (水) 22:15:44
    P <- sample(0:4000, 2, rep=TRUE)
    w <- owin(P[1]+c(0,1000),P[2]+c(0,1000))
  • ご回答ありがとうございます。データを読み込むことができました。こうすれば面積も変わらないのですね。ありがとうございました。

heatmapの列と行ごとのグループ分割について

mito? (2009-07-22 (水) 15:11:08)

いつも丁寧に教えてくださりありがとうございます。
heatmapである物質とある物質の反応値を書いていてrecallとprecisionを
出したいのでheatmapの中の行と列ごとの木を必要なグループ数、もしくは分割の高さを与えて、幾つかのグループに分割したいと思っています。

hclustの場合はcutree()で出来たのですが、ヒートマップだと中でこのhclustが使われていることは分かったのですが、ここからどう取り出せば良いのか分かりません。hclust()内にheatmapの
時と同じ変数を入れても並び順が異なっているので困っています。(ヘルプをみるとheatmapは平均値を利用していることと、行と列とでクラスタリングをしているからだと思うのですが・・・)
ちなみに、ヒートマップは

mixmix <- read.table("mixmix.txt",header=TRUE,sep="\t",row.names=1)
mixmix_numeric <- apply(mixmix,c(1:2),as.numeric)
mixmix_matrix <- matrix(mixmix_numeric,nrow=377,ncol=291,
   dimnames=list(rownames(mixmix_numeric),
   colnames(mixmix_numeric)))
mixmix_scale <- scale(mixmix_matrix)
mixmix_scale_numeric <- apply(mixmix_scale,c(1:2),as.numeric)
mixmix_scale_euclid <- dist(mixmix_scale_numeric,method="euclid")
pdf("hyoujunka_honto.pdf",paper="special",width=37,height=35,pointsize=5)
heatmap(mixmix_scale_numeric,hclustfun=(function(mixmix_scale_euclid)   
   hclust(mixmix_scale_euclid,method="ward")),
   col=c("#000000","#a31782","#2353a9","#00a765","#5ac493","#bbdd22","#fff300",
         "#ff8d00","#fb4000","#fc7574"))
dev.off()

で書いています。
また

> sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-apple-darwin8.11.1 

です。よろしくお願いします。

  • 試してみようと思ったのですが、mixmix.txt がどんなものかわからないのでやめました。状況が再現できるように,カットアンドペーストで実行できるようにしていただくとよいのですが。 -- 2009-07-23 (木) 10:51:15
  • 添付ファイルをつけてみたのですが、これで実行していただけますでしょうか。 お手数おかけします。

filemixmix.txt

  • おお。完璧に再現できました。誰かがコメントしてくれることでしょう。 -- 2009-07-23 (木) 21:45:22
  • 再現ありがとうございます。しばらく待たせていただきます。 -- mito? 2009-07-24 (金) 15:47:51

インストール時の警告

桃太郎? (2009-07-17 (金) 16:38:54)

はじめまして。
超初心者の質問ですみません。
パッケージインストールがうまくいかず困っています。
環境は

> sessionInfo()
R version 2.7.0 (2008-04-22)
i386-pc-mingw32

です。パッケージ"gstat"を使用したくインストールし読み込んだところ

>library(gstat)~
エラー:  パッケージ 'sp' が 'gstat' によって要求されましたが、見つけられませんでした ~
追加情報:  Warning message:
パッケージ 'gstat' はバージョン 2.7.2 の R の下で造られました

と返ってきてしまいました。
パッケージ'sp'がインストールされていないようでしたので「パッケージのインストール」からサイトミラーを選択しspのインストールを行うと

>local({pkg <- select.list(sort(.packages(all.available = TRUE)))
+ if(nchar(pkg)) library(pkg, character.only=TRUE)})
> utils:::menuInstallPkgs()
URL 'ftp://ftp.ecc.u-tokyo.ac.jp/CRAN/bin/windows/contrib /2.7/sp_0.9-28.zip' を試しています
ftp data connection made, file length 844848 bytes
開かれた URL
downloaded 825 Kb
パッケージ 'sp' は無事に開封され、MD5 サムもチェックされました 
警告:  パッケージ 'sp' の前のインストールを取り除くことが出来ませんでした

ダウンロードされたパッケージは、以下にあります 

と警告が返ってきてしまい、うまくインストールが出来ません。
何が原因なのでしょうか?
また"sp"がインストールされれば"gstat"は読み込めるのでしょうか?
どなたかご教授よろしくお願いいたします。

  • 2.7.0の本体で,2.7.2 で作られたライブラリをインストールしようとしているという,本末転倒?バージョンのコンフリクトでは?なぜ,今時 2.7.0 で作業しようとしているのか疑問ですが。 -- 河童の屁? 2009-07-17 (金) 16:57:21
  • ありがとうございます。これを機に2.9.1にアップデートしましたところ、問題なく読み込めました。すみませんでした。。。 -- 桃太郎? 2009-07-17 (金) 17:10:10
  • このページ冒頭の注意事項の最後に該当しますね。 -- 2009-07-19 (日) 07:23:21

barplotの棒の原点

mona? (2009-07-15 (水) 18:47:18)

はじめまして。
Rの棒グラフの書き方について質問させてください。

正の数値をbarplotで水平方向に表示させると、
x軸の0から棒が伸びていきますが、
この伸びていく原点を変更したいのです。

たとえば10をその原点にとり水平方向に棒グラフを書くと、
データが5の場合は左方向に、15の場合は右方向に
10から棒が伸びていくように描きたいと思っています。

どなたかご教授よろしくお願いします。

shift <- 10 ; barplot(c(0,5,10,15,20)-shift, horiz=T, offset=shift)
  • こさるでござる? 2009-07-16 (木) 14:40:19
  • できました!本当にありがとうございました。 -- mona? 2009-07-16 (木) 22:05:37

levelplot描画に関する質問

neko? (2009-07-14 (火) 19:18:50)

はじめまして。
Rの超初心者なのですが、描画の方法について、質問させてください。
levelplot関数で画像を描画した後に、更に重ねて描画したいのですが、どのような方法があるのでしょうか?
どなたか教えていただけますでしょうか。
使用環境は、

sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-pc-mingw32

です。どうぞよろしくお願い致します。

  • levelplot 関数とは何ですか?基本パッケージに無い関数は出所を書かないと。それと重ねて何を描きたいですか。par(new=TRUE) 指定では駄目なんですか? -- 2009-07-14 (火) 23:08:03
  • 返信遅くなりまして申し訳ありません。レスありがとうございました。 latticeパッケージ内にあるlevelplot関数を使用しています。 今回levelplot関数で描画された画像の上に、別のデータの位置(x,y)を同じ座標上でポイントで示したいと思っています。 par(new=TRUE)指定ですと、座標がずれて表示されてしまうので、別の方法を探しておりました。 どうぞよろしくお願いいたします。 -- neko? 2009-07-15 (水) 17:40:42
  • そろそろ訳本が出版される Lattice 本のスクリプト集は参考になりませんか? -- 駅前旅館? 2009-07-16 (木) 23:55:57
  • 以下は一つの方法です.後は自力でがんばってください. -- ishida 2009-07-17 (金) 08:00:03
    > library(lattice)
    > levelplot(volcano, panel = function(x,y,...,  subscripts)
             {
               panel = panel.levelplot(x, y, ...,  subscripts)
               panel.points(20,20,col=2,cex=2 )
               })
    Latticeの訳本,図版のレイアウトの関係でちょっと手間取っているようです.とにかく図版の数が多いので.> 駅前旅館さん
  • レスありがとうございます。 できました! latticeの訳本も今後参考にさせていただきたいと思います。本当にありがとうございました。 -- neko? 2009-07-17 (金) 10:35:56
  • 石田先生ありがとうございます。石田先生がドイツ語から直接訳された R 本は本国以上に日本では売られているそうですが、昨年発行さえた同じ Springer の"Applied Spatial Data Analysis with R"は翻訳されるのでしょうか? -- 駅前旅館? 2009-07-18 (土) 13:32:20
  • 需要はあるはずなので,きっと翻訳が出るだろう,と私も期待しているところです.> 駅前旅館さん -- ishida 2009-07-18 (土) 17:38:01

maptoolsに関する質問2

ichigo? (2009-07-14 (火) 18:37:07)

追加で質問させていただきます
東京・埼玉のシェープファイルをダウンロードし、ワーキングディレクトリに配置します.

library(maptools)
tokyohx <- readShapeSpatial("tokyohk.shp")
plot(tokyohx)
saitamax <- readShapeSpatial("saitamak.shp")
plot(saitamax, add=T)

隣り合う複数の県(東京、埼玉、神奈川など)を考え,任意の点を与えた時に,その内部の地点かどうかを判断したいと思っています.
下の「in.polygon」関数では、頂点や境界上の点はFALSEを返すので、東京と埼玉の境界上にある点は、東京でも埼玉でもないと判断されてしまいます.
このような場合、東京と埼玉をあわせた外枠?を取得すれば上記のような現象は発生しないと思うのですが、
二つのシェイプデータからそのようなデータを作成することは可能でしょうか?

また、日本全土のデータ(japank.shp)を用いれば、複数の県をまとめて扱う事ができるかとも考えたのですが、
日本全土のデータから、任意の点をを東京・埼玉の内部かどうかを判断する事は可能なのでしょうか?

どうぞよろしくお願いいたします.

  • 下のpoint.in.polygon関数はどうですか?外枠(エクステント?JISではどういう用語だっけ?)だけでは不十分です。ライン上の点の判定の関数どこかになかったけ? -- 2009-07-14 (火) 21:07:09
  • レスありがとうございます. point.in.polygonで解決しました. 素晴らしい関数ですね(戻り値で内部か境界上か外部かがわかるようです).感動いたしました. -- ichigo 2009-07-15 (水) 08:58:01

maptoolsに関する質問

ichigo? (2009-07-14 (火) 12:32:07)

ShapeFileライブラリの「ShapeFileデータ(地域境界・地域メッシュ)」を ありがたく使わせていただいております.
いろいろ調べていたところ、「R Book」に解説が載っているRmapライブラリは
Version2.0以上には対応していないようなので、maptoolsを使ってごにょごにょやろうとおもっております.

上記ページから東京の島無しのシェープファイルをダウンロードしてワーキングディレクトリに配置します.

library(maptools)
tokyohx <- readShapeSpatial("tokyohk.shp")
plot(tokyohx)

これで東京の外枠が描画できます.
さて、質問なのですが、ある任意の地点の緯度経度を与えてその地点が東京都内部の地点なのか
どうかを判定することがこのデータを使ってできますでしょうか?
できるとすればどのような処理内容になるでしょうか? もしよければご回答くださると助かります.
例えば以下のような緯度・経度です.

> chiten_x <- c(35.677822, 139.771458)
> chiten_x
[1]  35.67782 139.77146

> sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-pc-mingw32 

locale:
LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;
LC_MONETARY=Japanese_Japan.932;LC_NUMERIC=C;LC_TIME=Japanese_Japan.932

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] maptools_0.7-25 sp_0.9-36       foreign_0.8-29 

loaded via a namespace (and not attached):
[1] grid_2.8.1      lattice_0.17-17

よろしくお願いします.

  • 外枠の緯度・経度は↓で取り出せると思うので、後は自由に加工してみてください。 -- 2009-07-14 (火) 14:25:37
    tokyohx@polygons[[1]]@Polygons[[1]]@coords
  • レスありがとうございます.昨日からmaptoolsをさわりはじめたばかりで、ご回答いただいたようにして、外枠の座標が取り出せるとはまったく知りませんでした.ありがとうございます.ただし外枠の座標を得ても、以下の図の赤い点のような場所(ちょっと極端ですが)が外なのか中なのか、判断できないように思いますがいかがでしょうか?つまりこれはこのようなデータを使っては、内部か否かの判定はできないということでしょうか?(引き続き調査はしておりますが) -- ichigo 2009-07-14 (火) 14:36:59
    tokyo01.png
  • sgeostatパッケージにin.polygon関数があるので、使えるかも。 -- 2009-07-14 (火) 14:51:24
  • ありがとうございます.できたようです.まずはご報告まで. -- ichigo 2009-07-14 (火) 15:12:00
    tmp <- data.frame(tokyohx@polygons[[1]]@Polygons[[1]]@coords)
    library(sgeostat)
    in.polygon(139.771458, 35.677822, tmp$X1, tmp$X2)
    [1] TRUE
    in.polygon(139.771458, 40.677822, tmp$X1, tmp$X2)
    [1] FALSE
  • ポイント・イン・ポリゴンは、わざわざ、sgeostat を使わなくても。maptools と一緒にロードされている、point.in.polygon 関数を使えば(in.polygon は使っている?ソース見てね)同じことができますよ。 -- 金のないメルクリンファン? 2009-07-14 (火) 20:56:40
    point.in.polygon(139.771458, 35.677822, tmp$X1, tmp$X2)
  • ありがとうございます.上の「maptoolsに関する質問2」で使わせていただきました. -- ichigo 2009-07-15 (水) 09:28:34
  • 注:point.in.polygon関数はspパッケージの中にある関数です。 -- 2009-07-18 (土) 11:03:00
  • いまさらですが版権?表示.「上記画像の作成に当たっては、ESRIジャパン株式会社の全国市区町村界データを使用しました。本データの著作権はESRIジャパン株式会社に帰属します。」 -- ichigo 2009-07-22 (水) 16:24:55

動画の読み込み

nosyan? (2009-07-13 (月) 16:12:45)

Rでavi,wmvなどの動画ファイルを読み込む方法はありますでしょうか?
パッケージを探してみましたが、該当するものが見つからなかったので、ここで質問しました。

  • readBinでやるしかないのかな。 -- 2009-07-13 (月) 16:52:35

test.tableが見つからない

(2009-07-13 (月) 10:17:34)

こんにちは。
とても基本的なことで質問させてください。
使っているものはR version 2.6.2 (2008-02-08) です。

test.tableを使おうとすると

(a<-test.table(*****))

エラー:  関数 "test.table" を見つけることができませんでした 


とでてきます。
パッケージなどをインストールしなおしたりしたのですが、
どうしても見つからないとエラーがでてしまいます。

対処法をご存知の方がいらっしゃいましたらよろしくお願いします。

  • 何かのパッケージの関数なのか、自作関数なのか、単に自作関数を読み込んでないのか、パッケージのlibrary宣言をしていないのか判断がつかない・・・。 -- 2009-07-13 (月) 10:53:58
  • なんとか動きました!本当にありがとうございます。 -- 2009-07-13 (月) 11:07:51
  • 何が悪かったのかレスよろしく -- 2009-07-13 (月) 11:36:03
  • 注意:バージョンを上げること。せめてハンドル名ぐらい名乗ること。 -- 2009-07-13 (月) 12:25:13

各ベクトル要素の差の2乗を求めたい

名無しさん? (2009-07-13 (月) 03:59:00)

いつもお世話になっております。
昔使っていたC言語のくせがとれず、"Rらしい"書き方がまだできないでいる初心者です。
以下のようなプログラムを"Rらしく"書くにはどのようにしたらよいでしょうか?
例えば、

[1,] 1 2 4

という長さ3のベクトルvecがあったときに

     [,1] [,2] [,3]
[1,]    0    1    9
[2,]    1    0    4
[3,]    9    4    0

各ベクトル要素の差の2乗を求めた(添え字が対応している)3*3のマトリックスmatを求めるとすると、

for(i in 1:3){~
   for(j in 1:3){
     mat[i,j] <- ( vec[i] -vec[j] ) ^ 2
   }
}

とすると求まりますが、とてもC言語的です。
Rらしい書き方の例を教えてください。
お願いします。

  • Rらしいかどうかはわからないけど、線形代数的に x <- c(1,2,4); (x %*% t(rep(1,length(x))) - rep(1,length(x)) %*% t(x))^2 -- 2009-07-13 (月) 07:12:52
  • outer() 関数が便利です。ベクトルだけでなく行列、配列でもOK。 -- 2009-07-13 (月) 08:03:52
    > outer(vec,vec,FUN="-")
         [,1] [,2] [,3]
    [1,]    0   -1   -3
    [2,]    1    0   -2
    [3,]    3    2    0
    > outer(vec,vec,FUN="-")^2
         [,1] [,2] [,3]
    [1,]    0    1    9
    [2,]    1    0    4
    [3,]    9    4    0
    # いっぺんで済ませたかったら
    > ds = function(x,y) (x-y)^2
    > outer(vec,vec,FUN=ds)    # outer(vec,vec,FUN=function(x,y) (x-y)^2) でも可
         [,1] [,2] [,3]
    [1,]    0    1    9
    [2,]    1    0    4
    [3,]    9    4    0
  • 解答ありがとうございます。 -- 名無しさん? 2009-07-13 (月) 15:37:56
  • outer関数はRらしくて好きです。これから使っていきたいと思います。もうひとつの方は式が長いですが、処理時間はこちらの方が速かったため、大量データに向いていると思います。 -- 名無しさん? 2009-07-13 (月) 15:42:23
  • ちなみにPentiumD 2.8GHz メモリ1.5Gで(x %*% t(rep(1,length(x))) - rep(1,length(x)) %*% t(x))^2を50000回繰り返すと3.31秒、outer(vec,vec,FUN="-")^2だと4.74秒、outer(vec,vec,FUN=ds)だと3.87秒かかりました。参考までに。 -- 名無しさん? 2009-07-13 (月) 15:45:27

Macで、sourceをすると、不正なマルチバイト文字列がある

onen? (2009-07-09 (木) 16:34:26)

はじめまして。R超初心者です。調べてみてもわからなかったので書き込ませていただきます。
まず背景状況は以下の通りです。
OS→Mac OS X 10.5.7

sessionInfo()
R version 2.9.0 (2009-04-17)
i386-apple-darwin8.11.1

locale:
ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8

attached base packages:
[1] stats graphics grDevices utils datasets methods
[7] base
以上。

 source('myfunc/myfunc.R')をやってみたのですが、


「構文解析中に不正なマルチバイト文字列がありました (1行) 」
と表示されてしまいます。

どなたか解決策ご教授お願いいたします。

  • encoding 引数を調べること -- 2009-07-09 (木) 17:19:31
  • source('myfunc/myfunc.R',encoding="utf-8") ?? -- 2009-07-09 (木) 17:24:13
  • ↑ デフォルトのエンコーディングが UTF-8 なのに、ファイルのエンコーディングが UTF-8 でないから、エラーが出るんだから、encoding="utf-8" にしても、変わらないと思いますけど。要するに、ファイルが作成されているエンコーディングを調べないとどうしようもないでしょう。 -- 2009-07-09 (木) 17:28:15
  • 可能性としては何か変な制御文字が紛れ込んでいるのでは。エディターで開いてみるとはっきりするのでは。 -- 2009-07-10 (金) 10:19:32
  • ↑ その可能性は低いでしょう。エンコーディングを確かめるのが先決。いずれにせよ、原質問者の対応待ち。 -- 2009-07-10 (金) 10:23:53
  • 私もMacintosh使いですが,経験的にはencoding="CP932"で読めることが多いですね.違ってたらごめんなさい. --  ? 2009-07-10 (金) 14:03:25
  • インターネットからダウンロードしたものなら、encoding="euc-jp" になっているものもある -- 2009-07-10 (金) 14:23:18

クラスターから主要な語句を検索

レイン? (2009-07-09 (木) 13:06:52)

はじめまして。R初心者でして調べてみてもわからなかったので書き込ませていただきます。
デンドログラムを作成して、クラスターを分類したのですが、各クラスターの中を占める語句を検索する方法はありますでしょうか?それぞれのクラスターがどのような語句を重要視してみたのかがわからないのです。
よろしくお願いします。

  • 各クラスターを特徴づけている重要項をしらべたいのです。 -- レイン? 2009-07-09 (木) 14:02:42
  • 具体的にデータを示さないと、何を教えていいのかもわからない。 -- 2009-07-09 (木) 15:32:34
  • すみません。扱っているデータはアーティストの特徴を表している文書でして、それから語句‐文書行列を作成してそれをクラスタリングしてデンドログラムを作成しました。それからcutree関数でクラスタを分類したのですが、各クラスターがどのような特徴を持っていて、どういった語句を含んでいて度の語句を重要視しているのかを調べたいのです。そういった情報を各クラスターから調べる関数があるのかと思いまして。語句‐文書行列には”ロック”や”メロディ”といった語句が含まれています。 -- レイン? 2009-07-09 (木) 16:29:02
  • ↑これは、説明であって「具体的なデータ」じゃない。どんなデータを投入したのかをこちらは知りたい。他の質問者のようにRコンソール画面を貼ってくれ。 -- 2009-07-09 (木) 16:50:10
  • あなたのやりたいことは、デンドログラムに要素の名前を描かせたい(デフォルトでは番号だからね)ということかな?だとすれば、plot.hclust の labels 引数を調べればよい。クラスター分析は、クラスターの中のどれが重要な要素であるかと言うことはわからない手法なんですよね。 -- 2009-07-09 (木) 17:19:11
  • そうなんですか。どの要素が重要かわからないのですね。ご丁寧にありがとうございます。 -- レイン? 2009-07-09 (木) 17:24:56
  • そうなんですか。どの要素が重要かわからないのですね。ご丁寧にありがとうございます。 -- レイン? 2009-07-09 (木) 17:26:37
  • そうなんですか。ご丁寧にありがとうございます! -- レイン? 2009-07-09 (木) 17:27:21
  • 「語句‐文書行列」なら、コレスポンデンス・アナリシス(対応分析)とか双対尺度法をやれば、語句とアーティストの関連、重要度というのがわかるんじゃないかなあと思いますけどね。 -- 2009-07-09 (木) 17:50:28

metaforの実行

なんび? (2009-07-08 (水) 17:26:29)

metaforをつかってメタアナリシスを行いたく、
丹後俊郎先生著「メタアナリシス入門」のデータを使ってシミュレーションしたところ、
オッズ比がマイナスの値となってでてきました。
どこがおかしいのかどうしてもわからないので教えてください。
structure(list(ai = c(3, 7, 5, 102), bi = c(35, 107, 64, 1431
), ci = c(3, 14, 11, 127), di = c(36, 102, 82, 1303)), .Names = c("ai",
"bi", "ci", "di"))

library(metafor)
dat<-scan("./blocker_abcd.txt",
list(ai=0,bi=0,ci=0,di=0),
skip=0,nlines=4,sep="")
blpeto<-rma.peto(ai,bi,ci,di, slab=NULL, subset=NULL, data=dat,

        add=c(1/2,0), to=c("only0","none"), level=95, digits=4)

forest(blpeto)

  • 出てくるのは log odds ですよ。help 読みましょう。 -- 2009-07-08 (水) 18:00:34
  • help読みました。 確かにlog oddsratioでした。ありがとうございました。 -- なんび? 2009-07-09 (木) 15:47:53

パイプを使った R の実行

パンチドランカー? (2009-07-08 (水) 01:04:28)

Windows で、PHPの shell_exec 関数を利用して、Rを実行しているのですが、以下のように、大なり小なり記号があると、うまく実行できません。

echo a=rnorm;b=a[a>=0.5]| rterm --slave

代入"<="は"="に置き換えましたが、上の対策方法が分かりません。
どなたか、この解決法、ご教授していただけませんか?

  • echo 'a=rnorm(10);b=a[a>=0.5]; print(b)' | rterm --slave とでもやってごらんなさい -- 2009-07-08 (水) 15:24:20
  • レスありがとうございます。全然だめです、な〜んにもでません。 -- パンチドランカー? 2009-07-08 (水) 20:16:46
  • UNIX マシンで、rterm ではなく R をつかって、以下のようにやると動くけど。Windows なんか捨てればいいのかも(^_^;)。 -- 2009-07-09 (木) 17:21:58
    % > echo 'a=rnorm(10);b=a[a>=0.5]; print(b)' | R --slave
    [1] 1.0513718 0.7390706 0.9937101
  • ありがとうございます。でも、Windows ではだめですね、なにも表示されません。
     私は諦めの悪いほうで、Windows は捨てられません。そこで、RScript があるのを思い出して、
    rscript -e "a<-rnorm(10);b<-a[a>=0.5]; print(b)"
    を実行したところ、OKでした。シングルクォテーションは駄目でした。 -- パンチドランカー? 2009-07-09 (木) 21:05:23

並列処理における乱数生成法について

Saito? (2009-07-06 (月) 17:12:34)

いつもお世話になっております。
並列処理をしようと思うのですが、どうやら同一の乱数から結果を返すらしく、同じ数字が二度づつ出てきてしまいます。以下にサンプルコードを示します。

library(snow)
f <- function(n){
  a <- rnorm(1, n, 1)  
  return(a)
}
cl <- makeSOCKcluster(c("localhost", "localhost"))
clusterExport(cl, "f")
system.time(ff <- parSapply(cl, 1:10, function(x){f(1)}))
>ff
[1] -0.2169740  0.9034649  0.7919217  1.9640380  0.9430635 -0.2169740
[7]  0.9034649  0.7919217  1.9640380  0.9430635

Rで並列計算を読み、rsprngというものが必要ということはわかりました。そこで上記サイトのリンク先からrsprngのzipファイルをダウンロードして、Rから読み込ませたのですが、

HTML パッケージ記述を更新
library(rsprng)
以下にエラー library(rsprng) : 
  'rsprng' は有効なインストール済みパッケージではありません

と出るだけで、rsprngが使えるようになった気配がありません。パッチを当てろと書いてあったので、パッチを探しましたが、zipファイルにどう当てるのか、当て方がわかりません。それにこれはMacのパッチのような気がします。どなたか、解決策をご存知の方がおりましたら、ご教授していただけないでしょうか。
なお、環境はWindowsXP、R-2.9.1、Core 2 Duoです。
どうぞよろしくお願い致します。

  • SPRNGは分布が良くないので, 現在は人気がありません. rlecuyerパッケージはCRANのミラーにWindowsのバイナリもあるので, rsprngではなく, rlecuyerなら手間無しです. help(package="snow")など, 地道にhelpを辿ればSPRNG以外の存在を見つける事は可能です. 不要かもしれませんがSPRNG2.0aに対するパッチは, ソースからビルドするときの話です. ソースですから, いろんなプラットフォームについての記述はあってしかるべきです.
    > library(snow)
    > cl<-makeCluster(rep("localhost",2))
    > clusterSetupRNG (cl,seed=123)
    Loading required package: rlecuyer
    [1] "RNGstream"
    >  clusterCall(cl,runif,2)
    [[1]]
    [1] 0.4340643 0.3185276
    
    [[2]]
    [1] 0.5240271 0.0738508
    snowとrlecuyerを普通にインストールすれば上記は動作するでしょう.-- 2009-07-07 (火) 00:15:13
  • rlecuyerをインストールすれば動作しました。ご教授ありがとうございました。ただ、その後出力された値の扱いで困ってしまっています。申し訳ありませんが、returnで返された値に関して追加で質問させてください。私のコードの中では、実際には、returnの結果をlistで返すようにしてあり、その結果を要約する際に、上手くlist型を扱えません。以下にサンプルコードを示します。
    f <- function(n){
      a <- rnorm(1, n, 1)  
      b <- rnorm(1, n, 2)
      return(list(a=a, b=b))
    }
    cl <- makeSOCKcluster(c("localhost", "localhost"))
    clusterExport(cl, "f")
    system.time(ff <- parSapply(cl, 1:10, function(x){f(1)}))
    > t(ff)
         a           b         
    [1,] 0.8602452   -0.9136815
    [2,] 1.220000    1.192357  
    [3,] 0.5558699   2.945972  
    [4,] -0.07316578 -0.5083378
    [5,] 0.9687442   -1.506602 
    [6,] 0.8602452   -0.9136815
    [7,] 1.220000    1.192357  
    [8,] 0.5558699   2.945972  
    [9,] -0.07316578 -0.5083378
    [10,] 0.9687442   -1.506602 
    この結果をa列b列についてそれぞれ、例えば平均値を求めたいとします。これがデータフレームであれば、
    apply(t(ff), 2, mean)
    とでもすれば出来るのですが、list型では一発ではできません。一応次のようにすればできますが、すごく手間がかかってしまいます。
    > mean(c(t(ff)[[1]], t(ff)[[2]]))#これを全てデータで打ち込めば、平均値は出ますが…。
    [1] 1.040123
    >  mode(as.data.frame(t(ff)))#データフレームにも直らないようです。
    [1] "list"
    もし、どなたか、このようなlist型のデータでの要約の仕方をご存知でしたら、ご教授していただけないでしょうか。どうぞよろしくお願い致します。 -- Saito? 2009-07-07 (火) 16:59:29
  • colMeans(matrix(unlist(t(ff)), nrow(t(ff)))) -- 2009-07-07 (火) 17:35:23
  • lapply(ff, mean) -- 2009-07-07 (火) 19:07:25
  • ↑ lapply はだめでないかい?例だと、20個の要素の1個ずつの、20個の平均(データそのまま)を求めることになってるでしょうが。実際にやってみれば不適切なことはわかるはず。実際に確かめずに回答するとこうなるという見本。t(ff) の列方向の mean が欲しいっていってんじゃないの?
    そもそも、なんで list で結果を返さないといけないのかなあ。return(c(a=a, b=b)) で結果を返せば sapply の結果は2次元配列になって、apply で処理できるのに。あえて、面倒な方法を採っているのは、ここに示されていない理由があるのかとは思うが。結果の返し方というのも、後の処理を考えないと、ねえ。ああ、また、むだなコメントをつけてしまった。 -- 2009-07-07 (火) 22:51:19
  • 返す値がlistなのにSapplyで受け取るのは筋が良く無いです. clusterApplyを使って ff<-clusterApply(cl, 1:10, function(x){f(1)});do.call("rbind",lapply(ff,unlist)) としてmatrixで処理するかしたほうがよいでしょう. -- 2009-07-08 (水) 18:43:37
  • ご回答くださった方々、本当にありがとうございました。誠に恥ずかしいのですが、returnで返す値ををc()で囲む、ということを全く思いつかず、returnで複数の値を返すというところを見て、listでしか返せないのだと勘違いしていました。三番目の方の回答のように、元からapplyで処理できる形に返すことができれば、それで私の問題は解決です。本当に妙な誤解をしていました。申し訳ありませんでした。 -- Saito? 2009-07-08 (水) 20:33:57

heatmapの適用は階層型クラスタリング

mito? (2009-07-03 (金) 16:35:00)

また、初歩的な質問で申し訳ありません。
heatmapで使えるhclustは階層型クラスタリングだけなのでしょうか。
平均を利用して書く、ということで非階層型クラスタリングのk-meansは使えないと考えてよいでしょうか。

  • k-meansの手法を本などで調べてください。理由がわかります。 -- luchama? 2009-07-03 (金) 20:30:37

上下1,2%を切った状態での標準化

kouda? (2009-06-29 (月) 16:51:47)

いつも丁寧な返信をありがとうございます。
早速質問させていただきたいのですが、
列ごとに上下1,2パーセント切った状態で標準化を行うにはどうすればいいでしょうか。
標準化はscale関数に入れれば、列ごとに標準化は行っているのですよね?
外れていそうな値が多いので上下1,2パーセント切って標準化したいのですが、どのような操作を行えばいいのでしょうか。

足りない情報等ありましたら、教えていただければと思います。
よろしくお願いします。

使用環境は

sessionInfo()
R version 2.8.1 (2008-12-22)
i386-apple-darwin8.11.1

です。よろしくお願いします。

  • 除外される値は捨て去るのですか?もしそうなら元が行列(resp. データフレーム)でも、結果は行列(resp. データフレーム)で無くなりますが。それとも、そうした値はNA値に置き換える? -- 2009-06-29 (月) 17:31:49
    > set.seed(1234); A <- matrix(sample(1:10,30,rep=TRUE),10,3)
    > A
          [,1] [,2] [,3]
     [1,]    2    7    4
     [2,]    7    6    4
     [3,]    7    3    2
     [4,]    7   10    1
     [5,]    9    3    3
     [6,]    7    9    9
     [7,]    1    3    6
     [8,]    3    3   10
     [9,]    7    2    9
    [10,]    6    3    1
    # 列毎に上下10%をNA値に置き換え
    > B <- A; for(i in seq(ncol(A))) {
        x <- B[,i]
        y <- (x<= quantile(x,0.1) | x >=  quantile(x,0.9))
        B[y,i] <- NA} 
    > B
          [,1] [,2] [,3]
     [1,]    2    7    4
     [2,]    7    6    4
     [3,]    7    3    2
     [4,]    7   NA   NA
     [5,]   NA    3    3
     [6,]    7    9    9
     [7,]   NA    3    6
     [8,]    3    3   NA
     [9,]    7   NA    9
    [10,]    6    3   NA
    > scale(B)
                [,1]       [,2]       [,3]
     [1,] -1.8267086  0.9950898 -0.4572988
     [2,]  0.6089029  0.5761046 -0.4572988
     [3,]  0.6089029 -0.6808509 -1.1686525
     [4,]  0.6089029         NA         NA
     [5,]         NA -0.6808509 -0.8129757
     [6,]  0.6089029  1.8330602  1.3210855
     [7,]         NA -0.6808509  0.2540549
     [8,] -1.3395863 -0.6808509         NA
     [9,]  0.6089029         NA  1.3210855
    [10,]  0.1217806 -0.6808509         NA
    attr(,"scaled:center")
    [1] 5.750000 4.625000 5.285714
    attr(,"scaled:scale")
    [1] 2.052873 2.386719 2.811541
    > colMeans(scale(B), na.rm=TRUE)
    [1] 0.000000e+00 2.775558e-17 7.930164e-17
    > var(scale(B)[,1], na.rm=TRUE)
    [1] 1
    > var(scale(B)[,2], na.rm=TRUE)
    [1] 1
    > var(scale(B)[,3], na.rm=TRUE)
    [1] 1
  • ありがとうございます!!やりたいことが出来ました!!除外された値はNAで大丈夫です。 -- kouda? 2009-06-30 (火) 22:00:34

NAを含む行列のみを抽出するには?

ono? (2009-06-26 (金) 17:23:36)

単純な質問で恐縮です。(使用環境はmac OS 10.5.7, R version 2.9.0)
NAを含む行列を除くのは、na.omitやsubsetを使えば出来るのですが、NAを含む行のみを抽出する仕方を見つけることができないでいます。
以下に、パッケージに含まれているattenuのデータを使って示します。

DATA=attenu # The Joyner-Boore Attenuation Data(5列、182行のデータ)
names(DATA)

#stationの列にNAが入っている行を抽出したいが、以下は全て失敗例#

subset(DATA, station==NA)
subset(DATA, station=="NA")
subset(DATA, station=="")
subset(DATA, station=="<NA>")
subset(DATA, as.character(station)=="NA")

本当に単純な問題で申し訳ないですが、ご教授いただけると幸いです。

  • is.na()を使って DATA[is.na(DATA$station), ] が簡単でしょうか. -- ara? 2009-06-26 (金) 17:47:15
  • なるほど。そのようにやるのですね。迅速なアドバイスありがとうございます。 -- ono? 2009-06-26 (金) 17:58:42
  • subset() 関数を使いたければ -- 2009-06-27 (土) 12:49:29
    subset(DATA, subset=is.na(DATA$station))
    subset(DATA, subset=!complete.cases(DATA))

普遍クリギングを行い、独立変数のパラメータを得たい

Saito? (2009-06-25 (木) 16:24:31)

いつもお世話になっております。
研究で普遍クリギングを使う予定であります。私の手元にあるデータの説明変数となる値は場所が近いほど相関があり、かつ様々な要因から影響を受けているように見えます。そのため、要因と自己相関を考慮できるモデルを考えていたところ、普遍クリギングという単語に思い当たり、Rでどのようにやるのか試してみました。しかし、これで本当に普遍クリギングとなっているのか、調べてもわかりませんでした。以下にサンプルコードを示します。

library(fields)
r1 <- runif(20, 0, 1)
r2 <- runif(20, 0, 1)
r3 <- runif(20, 0, 1)
Lat <- r1
Long <- r2
val <- rep(c(1, 2, 3, 4), 5)
Val <- val + r3
Area <- rep(c(1, 2, 3, 4), each=5)
m <- matrix(0, 20, 4)
 for(j in 1 : 4) {
 for (i in 1 : length(Area)) { 
  if (j==Area[i]) { 
 m[i, j] <- 1
  } else {
 m[i, j] <- 0
}
}
}
colnames(m)=c("1", "2", "3", "4")
D <- data.frame(Lat, Long, Val, m)#これが解析で使うデータ
K <- Krig(x=data.frame(D$Lat, D$Long, D$X2, D$X3, D$X4), Y=D$Val)
coef(K)#推定された係数値

G <- glm(Val~Lat + Long + as.factor(Area))
coef(G)#GLMによって得られた係数値。Krigで得られたものと値が似ている。


Krig()とは別な方法として、library(gstat)にあるgstat()を使う方法もあったのですが、こちらだと、独立変数のパラメータが出力されません。一方、Krigだと本当に普遍クリギングになっているのか不安です。もちろんgoogleやヘルプで調べ、"Gaussian random spatial processes"というものが理解への鍵ということはわかったのですが、私にとっては少し理論が難しく、やはりKrigの正体がつかめません。この関数はクリギングの面推定を行うらしいのですが、それはつまり普遍クリギングを行ってくれているのでしょうか?どなたかご存知の方がおられましたら、ご教授・助言等いただけると幸いです。また、何か思い違いをしているのかもしれません。それもご指摘いただければ幸いに思います。

なお、Rは2.9.0、OSはWindowsXPです。どうぞよろしくお願い致します。

  • ネット検索だけですむことは少ないです。まずは 地球統計学 を読んで普遍クリギング法とは何か勉強されたら。 -- 2009-06-25 (木) 21:37:03
  • ご助言ありがとうございます。地球統計学の本は既に読んでいたのですが、改めて読んでみました。やはり、独立変数のパラメータは推定可能だと思うのですが…。そもそも、普遍クリギングというものについて何か思い違いをしているのでしょうか?? -- Saito? 2009-06-26 (金) 12:04:34
  • こうした個々のパッケージに関する質問への適切な回答が得られることは稀です。該当分野の基礎知識とヘルプドキュメント、そして試行錯誤が最良の方法でしょう。例示用のコードの実行結果をじっと見るのも参考になります。専門家もそうしているわけです。fields パッケージは使ったことがありませんが、help(Krig), example(Krig) をじっと見ていると次のような事かなと考えました。あなたが独立変数のパラメータと呼んでいるのは指定位置とそこでのデータ値に多変量多項式系からなる外生ドリフト(非確率的な平均値曲面)を当てはめた結果の係数の推定値の事だと思われます。それからこうした空間的従属性のある現象のデータは適当に作ってもピント外れになることが多いです。参考コードで使われている組込みデータでいろいろ試して見ることをお勧めします。 -- 2009-06-27 (土) 12:26:54
    # 恐らく(責任持ちません、自分でチェックして納得して下さい)
    > coef.Krig(Krig(ozone$x, ozone$y, theta=20, m=1))
             [,1]
    [1,] 39.78066
    # つまり当てはめ平均値曲面は定数 f(x,y)=39.78
    > coef.Krig(Krig(ozone$x, ozone$y, theta=20, m=2))
                 [,1]
    [1,] 4.022360e+01
    [2,] 2.552514e-04
    [3,] 1.338397e-02
    # つまり当てはめ平均値曲面は平面 f(x,y)=4.02e+1+2.55e-04*x+1.34e-02*y
    > coef.Krig(Krig(ozone$x, ozone$y, theta=20, m=3))
                 [,1]
    [1,] 36.972752325
    [2,]  0.033350055
    [3,]  0.063710522
    [4,]  0.011040245
    [5,]  0.009597520
    [6,]  0.004741821
    # つまり当てはめ平均値曲面は2次曲面 
    # f(x,y)=37.0+0.033*x+0.063*y+0.011*x^2+0.0096*xy+0.0047*y^2
  • 丁寧な返信ありがとうございます。早速自分でも試してみました。ですが、以下の二つのクリギング結果は一緒になると思ってやったのですが、かなり違うようです。K2には一つ一つ多項式の変数を指定してクリギングを行い、K3には指定せずにmの値を変えてクリギングを行いました。その後結果をplotして当てはまりを見ましたが、全く違います。係数は大体同じなのですが…。このような個々のパッケージについて質問してしまい申し訳ありません。しかし、もし分かる方がいましたら、何故二つの結果が異なるのかご教授頂ければ幸いに思います。どうぞよろしくお願い致します。-- Saito? 2009-06-29 (月) 17:09:48
    library(fields)
    K2 <- Krig(data.frame(x1=ozone$x[, 1], x2=ozone$x[, 2],x3=(ozone$x[, 1])^2,
      x4=ozone$x[, 1]*ozone$x[, 2], x5=(ozone$x[, 2])^2), ozone$y, m=2)
    K3 <- Krig(ozone$x, ozone$y, m=3)
    coef(K2)
    coef(K3)
    set.panel(2, 2)
    plot(K2, main="m=2")
    x11()
    set.panel(2, 2)
    plot(K3, main="m=3")
    x1=ozone$x[, 1]
    x2=ozone$x[, 2]
    x3=(ozone$x[, 1])^2
    x4=ozone$x[, 1]*ozone$x[, 2]
    x5=(ozone$x[, 2])^2
    y=ozone$y
    summary(lm(y ~ x1 + x2 +x3 + x4 + x5))#線形回帰でも一応確認。m=3のときのr^2の値と似ている
  • K2はいわば5次元空間でクリギングをやっていることになりませんか。クリギング法は本質的には重回帰ですが、説明変数が空間位置を表すというのが本質的仮定(平均曲面を差し引いた残差には空間モデルがフィットされる)です。さもなければ誤差が従属性を持つ単なる重回帰にすぎなくなります(残差部分にも5説明変数を用いて当てはめがされる)。plot(K2) の左上の予測結果を見れば当てはまりすぎなことが分かりますね。fields パッケージはどちらの場合も区別なく扱えるようで、逆に混乱が起きるようです。(この解説の真偽は保証しません) -- 2009-06-30 (火) 23:41:09
  • なるほど。普遍クリギングの説明変数が座標以外になると、誤差に従属性を持つ重回帰(説明変数でクリギングするので座標以外でやると解釈が難しい)になるという説明はわかりやすいです。実際私が調べた全ての参考書・参考URLで、説明変数(外生ドリフト)に座標以外を使っている例は見ませんでした。なるほど、すると私がしたい解析は普遍クリギングではないようですね。説明変数には座標以外を、しかし誤差には座標に起因する空間従属性を考慮させた解析となると…?geoRglmとかいうのがそれらしいのでしょうかね…???glsm.krige関数あたりでしょうか。それからWinBUGSを用いたベイジアンクリギングとかいうのもそれらしいですね。このあたりについて何らかの知見・意見をお持ちの方がおられましたら、ご教授頂けると幸いです。どうぞよろしくお願い致します。 -- Saito? 2009-07-01 (水) 17:08:39
  • 自己レスです。普遍クリギングの説明変数に座標以外を使っている例を見なかったと書きましたが、リサーチ不足でした。空間統計モデルを用いたつくばエクスプレス沿線の地価の分析とかでは説明変数に座標以外が入っていますね。つまり、私の解析を行うにあたっては普遍クリギングで良さそうですね。だとすると、Krigでは説明変数以外にどこで距離の関数を設定してあげればよいのか…。-- Saito? 2009-07-01 (水) 20:20:11
  • 好き勝手にまず空間トレンドを推定してそれを引き去った後にクリギング法を適用すれば良いのでは。そろそろお邪魔虫状態ですよ。 -- 2009-07-01 (水) 21:45:30
  • なるほど、ありがとうございます。お邪魔虫になっているとは気づきませんでした。確かにRの話から逸れてしまっています。以後気をつけます。もうしわけありませんでした。助言をいただいた方々、本当にありがとうございました。 -- Saito? 2009-07-01 (水) 22:54:10

大小関係の自前定義

七転八倒? (2009-06-25 (木) 00:47:34)

XPで2.7.1を使っています。

例えばトランプのようにA<2<3<...Q<Kのように自前で大小関係を定義したいのです。因子というものを使えばうまくいきそうなので試しているのですが、エラーがでてしまいます。

事前にA<2<3...<Kと順序つきで因子を指定したnum列を用い、

    suit num
 1     S   A
 2     S   2
 3     S   3
 ...
 52    C   K

このようなデータフレームを作りました。
これをランダムに並べ替えのち13枚取り出して、スートと番号にもとづいて並び替えようと

  xorder<-order(x$suit,pmax(x$suit,x$num))
  x[xorder,]

と入力したところ

以下にエラー mmm < each :  これらの型の比較は未実装です 
追加情報:  Warning message:
メソッド ("Ops.factor", "Ops.ordered") は "<" に対しては矛盾しています

というエラーがでました。
pmax以下がないとうまくいきました。
これはどういう状態なのでしょうか?ご教授お願いしますm(_ _)m

  • order(x$suit,x$num)でいいように思うんですが、pmaxはなんのために入れたのですか?エラーは、pmaxの使い方が間違っているためです。suitの値(例えば"S")とnumの値(例えば"3")のどちらが大きいか、を比べようとしています。 -- ? 2009-06-25 (木) 12:09:07
  • ただの因子には順序は定義されていません。順序付き因子の順序は「その場限りの順序」です。ですから因子集合が異なる二つの順序付き因子も大小比較できません。最初から関係するすべての因子とその順序を ordered() 関数の levels 引数で指定してやる必要があります(以下の例参照)。 -- 2009-06-25 (木) 16:26:57
    > Lev <- c("1","2","3","C","B","A","x","z","y")
    > (x <- ordered(c("A","2","2","C","y"), levels=Lev))
    [1] A 2 2 C y
    Levels: 1 < 2 < 3 < C < B < A < x < z < y
    > order(x)
    [1] 2 3 4 1 5
    > x[order(x)]
    [1] 2 2 C A y
    Levels: 1 < 2 < 3 < C < B < A < x < z < y
    > (y <- ordered(c("B","1","A","z","x"), levels=Lev))
    [1] B 1 A z x
    Levels: 1 < 2 < 3 < C < B < A < x < z < y
    > order(x,y)
    [1] 2 3 4 1 5
    > x[order(x,y)]
    [1] 2 2 C A y
    Levels: 1 < 2 < 3 < C < B < A < x < z < y
  • R-Tipsにそのように書いてあったので丸写ししていました>pmax -- 七転八倒? 2009-06-25 (木) 17:44:51
  • 想定される全てを網羅していればいいと言うことですね>level  ご教授の通りにやってみたらすんなりいけました。ありがとうございました。 -- 七転八倒? 2009-06-25 (木) 17:46:50

Rでのスクリーンキャプチャ

なつ? (2009-06-22 (月) 19:13:22)

WindowsXPでR-2.8.1を使用しています。
Rを使って、Google Earthからカラー画像をキャプチャ→保存したいと思い調べています。
なお、Google Earth COM APIではモノクロ画像しかキャプチャできないようです。

調べた中で可能性がある?と思った方法は以下の二つです。
・CかC++でスクリーンキャプチャする関数を書き、dllとしてRにロードして使用する方法
  CUIの関数はMinGWでビルドしてRでロードして使うことができたのですが、
  GUIのプログラムはVCで少し囓った程度なので、
  Win32API(w32api-3.13-mingw32-dev.tar)はDLしてきたのですが、
  スケルトンすらビルドできませんでした。
  そもそもMinGWでGUIプログラムをビルドしている例が見つけられなかったので
  本当にできるのか自体がわかっていません。

・COMを通す方法
  スクリーンキャプチャができるソフトウエアでCOMに対応したソフトウエアが見つけられませんでした。

上の方法にこだわってはいませんので
実現できそうな方法をご存知の方がいらっしゃいましたら、
大変お手数で恐縮なのですが、ヒントを頂けると助かります。
プログラム関連の用語の使い間違いや
根本的な思い違いがありましたら申し訳ありません。

  • Rのsystem()とpowershellやvbs(wsh)のsendkeyを組み合わせて使うとできるかも。GEに「イメージを保存」があるのでそれをsendkeyで操作する。 -- 2009-06-23 (火) 08:35:31
  • WinShot?というコマンドラインでスクリーンキャプチャできるソフトを見つけたので、system()と組み合わせてカラーでキャプチャできました! system()を知らなかったので本当に助かりました。ありがとうございました。 -- なつ? 2009-06-23 (火) 11:22:10

sink関数について

あきやま? (2009-06-20 (土) 14:07:03)

sinkを関数定義の中で使用するとうまくいきません。
RのバージョンはR-2.9.0,OSはWindowsXPです。
通常の使用方法

a <- matrix(c(100,200,300,400),ncol=2)
filename <- tempfile()
sink(filename)
chisq.test(a,correct=F)
sink()
file.show(filename)

うまくいかなかった例

original_output <- function(){
	a <- matrix(c(100,200,300,400),ncol=2)
	filename <- tempfile()
	sink(filename)
	chisq.test(a,correct=F)
	sink()
	file.show(filename)
}

うまくいった代わりの方法

original_output <- function(){
	a <- matrix(c(100,200,300,400),ncol=2)
	filename <- tempfile()
	writeLines(capture.output(chisq.test(a,correct=F)),filename)
	file.show(filename)
}

sink関数の仕様でしょうか?
それとも使い方が間違っているのでしょうか?
どなたか教えていただきたいと思います。よろしくお願いします。

  • sinkがstdout(標準出力)に出力してるから当然といえば当然。関数内では結果が標準出力に出力されないからファイルに結果が吐き出せてないだけ。print(chisq.test(a,correct=F))とすればよい。 -- 2009-06-20 (土) 17:48:22
  • 同じく.capture.output() 関数は出力ファイルを指定すれば,出力を文字列としてファイルに書き込むから関数内でも使えます. -- 2009-06-20 (土) 20:32:52
    original_output <- function(){
     a <- matrix(c(100,200,300,400),ncol=2)
     filename <- tempfile()
     capture.output(chisq.test(a,correct=F), file = filename)	
     file.show(filename)
    }
  • ありがとうございます。問題が解決し、非常にありがたく思います。 -- あきやま? 2009-06-20 (土) 21:43:18

貢献パッケージ内のクラス定義へのアクセス

? (2009-06-20 (土) 08:33:34)

貢献パッケージ内のクラスについて調べたいのですが、うまくいきません。
以下では、Hmiscのlabelledクラスにアクセスしようとしています。

> library(Hmisc)
> age <- c(21,65,43); label(age) <- "Age in Years"
> class(age)
[1] "labelled"
> (env <- environment(label))
<environment: namespace:Hmisc>
> getClass("labelled", where=env)
 以下にエラー getClass("labelled", where = env) : 
   "labelled" は定義されたクラスではありません 


ただ見るだけならばソースを読めばいいのですが、
最終的には継承して新しいクラスを作りたいと考えています。
しかしそれもうまくいきません。

> setClass("labelled2",contains="labelled")
 以下にエラー reconcilePropertiesAndPrototype(name, slots, prototype, superClasses,  : 
  スーパークラス "labelled" の定義が, クラス "labelled2" の設定中にありません  


クラス"labelled"の定義が見つけられていないのが原因というのは明らかなのですが、
どのように解決すればよいのでしょうか?
名前空間の問題だとは思うのですが…。where = envと指定までしているのになぜ見つからないのでしょうか?
なにか根本的な勘違いをしている気がします。よろしくお願いします。
環境は以下です。

> sessionInfo()
R version 2.9.0 (2009-04-17) 
i386-pc-mingw32
  • Hmisc パッケージの label() 関数は単に label クラス属性文字列を付け加えるだけの S3 方式ですから,S4 方式クラス用の getClass(), setClass() 関数は適用できません. -- 2009-06-20 (土) 08:54:49
    > str(age)
    Class 'labelled'  atomic [1:3] 21 65 43
      ..- attr(*, "label")= chr "Age in Years"
  • ありがとうございます。getClass()等はS3には使えないのですね。考えてみれば、そもそもS3には定義なんてないですね。ありがとうございました。 -- ? 2009-06-20 (土) 09:37:32
  • 継承はsetOldClass?("labelled")ののちにsetClass(...)でできました。 -- ? 2009-06-20 (土) 09:43:09

median survival timeの比較について

(2009-06-17 (水) 14:59:45)

現在、生存時間解析に関連して、median survival timeの比較を検討しております。
treatment 4例、control 26例の計30例で、全例打ち切りなしで最後まで観察しております。
このとき、例えば survfit() コマンドでmedian survival timeとその信頼区間を求めることができますが、二つの群で有意差があるか検定するためのコマンドをご存知の型が折られたら、ご教授いただければ幸いです。

方法論としては

Brookmeyer, R. and Crowley, J. J. (1982b). A k-sample median test for censored data. Journal of the American Statistical Association, 77, 433-440.

あたりが思いつきますが、implementしたRのパッケージなどが分からず困っております。よろしくお願いいたします。

  • survrec package の survdiffr() とかは? -- surg? 2009-06-17 (水) 15:43:20

階層の深さが違うリスト

東福寺? (2009-06-16 (火) 23:25:58)

R2.9.0 をウィンドウズで使用しております。
とあるプログラムを走らせている中途に、下記のようなリストが出来上がってしまいました。(実際の数字ではありません。でっちあげた例です)実際はもっと非常に巨大なリストです。

a <- list(matrix(1:4,2), list(matrix(3:6,2), matrix(4:7,2)), matrix(5:8,2))


これを、length が4でそれぞれの element が 2x2 のマトリックスであるようなリストに簡単に変換する方法はないかと模索しております。

unlist(a, recursive=F)


が普通に思いつく方法なのですが、これだと、a1? と a3? を必要以上に分解してしまいます。

できあがりが

list(matrix(1:4,2), matrix(3:6,2), matrix(4:7,2), matrix(5:8,2))


となる方法をご教授願います。

  • 副作用ありであんまりきれいじゃないんだけど・・・ b<-NULL;rapply(a,function(x)b<<-c(b,list(x)));b -- takahashi? 2009-06-17 (水) 03:24:29
  • 同じく今一ですが... relist(unlist(a), lapply(1:4, function(x) matrix(numeric(4), 2))) -- surg? 2009-06-17 (水) 10:50:06
  • 階層を合わせてunlist. unlist(lapply(a,function(x)if(is.list(x)){x}else{list(x)}),recursive=F) -- 2009-06-17 (水) 15:47:55
  • いろいろありますね。ありがとうございました。 -- 東福寺? 2009-06-17 (水) 22:36:31

マトリクスの添え字

FFFF? (2009-06-16 (火) 16:18:39)

あるデータを読み込むと、

EX1=

    WEIGHT HEIGHT
[1,] 50 150
[2,] 60 160

となっているのですが、これを通常の表記

EX2=

    [,1] [,2]
[1,] 50 150
[2,] 60 160


とするにはどのようすればよろしいでしょうか?
よろしくお願い致します。

  • これは添字ではなく列名ラベルです。-- 2009-06-16 (火) 21:52:31
    > EX1      
       WEIGHT HEIGHT 
    [1,]     50     60 
    [2,]    150    160 
    > colnames(EX1) <- NULL
    > EX1     
      [,1] [,2] 
    [1,]  50   60 
    [2,]  150  160 
    > colnames(EX1) <- c("WEIGHT","HEIGHT") 
    > EX1      
      WEIGHT HEIGHT 
    [1,]     50     60 
    [2,]    150    160 

行列*ベクトルの計算

もくず? (2009-06-16 (火) 15:59:54)

いつもお世話になっています。

A= [,1] [,2] [,3]

 [1,]   A    B    C
 [2,]   D    E    F


B= [,1] [,2] [,3]

 [1,]   G    H    I


の時、

C= [,1] [,2] [,3]

 [1,] A/G  B/H  C/I
 [2,] D/G  E/H  F/I


となるようにするにはどのような計算式すればよいでしょうか?

C <- A/B

とすると

C= [,1] [,2] [,3]

 [1,] A/G  B/I  C/H
 [2,] D/H  E/G  F/I


となってしまいます。

  • 例えば(他にも色々ありそうだが) -- 2009-06-16 (火) 21:59:27
    A/rbind(B,B)
    t(t(A)/B) 
    scale(A,0*B,B)
    sweep(A,2,B,FUN="/")

subset()で抽出したデータのレベルを削除する方法について

すろん? (2009-06-16 (火) 13:07:18)

いつもお世話になっております。
使用環境は

R version 2.9.0 (2009-04-17)
powerpc-apple-darwin8.11.1

です。
以下のようなデータフレーム

> a
  a          b        c  d
1 a 0.01905276 1.173279  3
2 b 0.80433105 1.154605  2
3 c 0.06782948 1.043263 NA
4 d 0.12807006 1.945755  1
5 e 0.35224305 1.224513 NA


から、subset()を用いて以下のように抽出して、新たなデータフレームを作ります。

> a2 <- subset(a, !is.na(d))
> a2
  a          b        c d
1 a 0.01905276 1.173279 3
2 b 0.80433105 1.154605 2
4 d 0.12807006 1.945755 1


この場合、データフレームa2の行数は3列で、length( a2$a )を実行すると返値は3になります。そして、さらなるデータフレーム

> b
  a        e
1 a 7.615926
2 b 2.504819
3 d 6.824558


と、上記のa2を結合しようとすることを考えます。この場合、merge()を使えば何の問題もなく二つのデータフレームを結合できます(以下の通り)。

> a <- merge(a2,b)
> a
  a          b        c d        e
1 a 0.01905276 1.173279 3 7.615926
2 b 0.80433105 1.154605 2 2.504819
3 d 0.12807006 1.945755 1 6.824558


しかし、

> levels(a$a)
[1] "a" "b" "c" "d" "e"


とするとおわかりのように、元々のデータのレベルが残っています。
また、subsetを用いずにデータを抽出した場合も、結果は同様でした。

a4 <- a[ !is.na(a$d),]
> a4
  a          b        c d
1 a 0.01905276 1.173279 3
2 b 0.80433105 1.154605 2
4 d 0.12807006 1.945755 1
> levels(a4$a)
[1] "a" "b" "c" "d" "e"

何とか、データフレームa2の列aのレベルを"a", "b", "d"にできないものかと思い、「レベルの消去」、「レベルの削除」、「subset, レベル」などでこちらのサイト内を検索いたしましたが、解決には至りませんでした。私の探したりないところもあるかもしれません。最初から各データフレームに、レベルを示す列を作っておくのが一番の得策かとは思います。しかし、どうにも気になります。もしsubset()等で得られたデータフレームの特定の列のレベルを、元データに依らない状態にする方法をご存じの方がいらっしゃいましたら、ご教示いただければと思います。
因みに、今はデータフレームを一度テキストファイル等に書き出してから再びRに読み込むという、実に場当たり的なことで対処しております。どうぞよろしくお願いいたします。

  • drop = T -- 2009-06-16 (火) 14:20:09
  • 早速のお返事、ありがとうございます。マニュアルをよく読んでいなかった私のミスですね。”passed on to [ indexing method"を別の意味に理解しておりました。R以前に英語の読解力の問題だったようで、お手数をおかけいたしました。ありがとうございます。 -- すろん? 2009-06-16 (火) 14:35:19
  • 昨日のご指摘を受け色々試したところ,以下のようなことがわかりました。~
    > df
      lb  x  y z
    1  a  1  2 5
    2  b  3 NA 3
    3  c  2  3 2
    4  d  1  2 3
    5  e NA  5 2
    6  f  4  4 1 
    > df2 <- subset( df, df["y"] == 2, drop = TRUE )
    > df2
      lb x y z
    1  a 1 2 5
    4  d 1 2 3 
    
    > levels(as.factor(df2$x))
    [1] "1"    # レベルは"1"のみに
    > levels( df2$lb )
    [1] "a" "b" "c" "d" "e" "f"   #削除した行のレベルも残っている
    上記のように,文字列の場合は最初のデータフレームのレベルを保持しているようです。気になったのでdf$xを最初からfactorにしてみたところ,以下のような結果になりました。
    > df$x <- as.factor( df$x )
    > df2 <- subset( df, df["y"] == 2, drop = TRUE )
    > levels(df2$x)
    [1] "1" "2" "3" "4"
    > levels(as.factor(df2$y))
    [1] "2"
    > levels(df2$lb)
    [1] "a" "b" "c" "d" "e" "f"
    factorの列のレベルも消去する方法を,もう少し考えてみます。-- すろん? 2009-06-17 (水) 14:07:12
  • df2$lb <- factor(df2$lb) 残るのが気持ちが悪いなら, dfsp<-function(x)data.frame(lapply(x,function(x){if(is.factor(x))return(factor(x));x})) とかしてdf2<-dfsp(df2) とか... 「factorがキモい!」と言うのであれば, options(stringsAsFactors?=F) した後に, read.tableとかdata.frameを作成する操作を行えばfactor化されません. -- 2009-06-17 (水) 16:15:28
  • ありがとうございました。教えていただいた関数dfsp()を実行してみたら,実にうまくいきました。今回例示した程度の大きさのデータフレームならばあまり問題はなかったのですが,数千行にものデータになりますと色々その後の操作に影響が出てきますので,解決できて本当に助かりました。また,options()のような使い方について自力では殆ど考えつかなかったと思います。また精進いたします。 -- すろん? 2009-06-18 (木) 09:39:05

legendの枠の大きさを変更したいのですが

aabc? (2009-06-14 (日) 22:30:00)

棒グラフの凡例から文字がはみ出てしまいます。
このHPとR Helpで隈なく調べてみたのですが、枠の大きさを変更する方法については見つからず、それで質問をさせて頂きました。
よろしければご教授下さい。
本体のversionはR-2.6.2です。
ご指摘を受けたので、具体的なコードを載せます(6/15(月)に追加編集)

>df
    V1  V2  V3
1    2  15  23
2   13  50 135
3   36 124 371
4  105 214 679
5  161 301 684
6  150 222 403
7  120 152 196
8   65  80  91
9   41  43  30
10  47  32  18
>colnames(df) <- birth.number <- c("0人","1人","2人") #出生児数
>rownames(df) <- marry.at.age <- c("15~18歳","19~20歳","21~22歳","23~24歳",
        "25~26歳","27~28歳","29~30歳","31~32歳","33~34歳","35歳以上")
>barplot(data.matrix(df),col=rainbow(10),horiz=TRUE,main="",
        xlab="標本数",ylab="出生児数")
>legend(x=1500,y=2.3,marry.at.age,fill=rainbow(10),
       title="妻の\n結婚年齢",cex=0.8)

枠そのものを変更できる方法はないでしょうか?

barplot_and_legend.png
  • コードを載せてください. -- よろしければ? 2009-06-15 (月) 03:02:11
  • legendの枠については、titleに与えている文字の表示は1列のみ(「妻の\n結婚年齢」ではなく「妻の結婚年齢」)で、その文字長で横枠の長さが決まってたように思います。横枠を広げるにはtitleに与える文字列の前後に空白を入れるとか(「  妻の結婚年齢  」)するといいのでは? -- 2009-06-15 (月) 14:30:20
  • legendの枠なんて本質的な問題ではないので、この場合は枠なし(bty="n")にすればよいのではないでしょうか。もし、legend()関数自体に興味があるなら、legendのソースを見ると幅(ここではw)の計算が分かります。 -- 2009-06-15 (月) 15:19:10
  • なるほど、確かにtitle引数によってlegendの枠の大きさを間接的に変更できるのですね。ただやっぱり、legendの枠そのものを制御できる引数があると便利だなぁと思います。それと、枠なしの方が見映えもよくなったりしているので、枠なしも多用していきたいと思います。ありがとうございました。 aabc 2009-06-15(月) 15:28
     > barplot(data.matrix(df),col=rainbow(10),horiz=TRUE,main="",
            xlab="標本数",ylab="出生児数")
     >legend(x=1500,y=2.3, marry.at.age, fill=rainbow(10),
          title=" 妻の結婚年齢 ", cex=0.8) #文字列の両端を1マス分空ける
     >legend(x=750,y=2.3,marry.at.age, fill=rainbow(10),
          title="              ", cex=0.8) #空白のスペース
    barplot_and_legend_001.png
  • いくつか表を並べた場合などは, legend(....., text.width=strwidth("WWW:000000000000") とかして合わせます. -- 2009-06-16 (火) 06:51:55
  • strwidth、使えますね!他のサイズ指定にも役立ちそうです。legendのhelpで見落としていました、申し訳ないです。ありがとうございました。 -- aabc? 2009-06-16 (火) 11:22:19

作業中のファイルの名前取得

ジェットラグ? (2009-06-11 (木) 19:14:46)

既存のファイル(例えば"hoge.RData")をRguiで開いて作業中に,getwd()のように,このファイル名"hoge.RData"を取得する関数や方法はあるのでしょうか?ご教示いただければ幸いです.

RのバージョンはR-2.9.0,OSはWindowsXPです.

  • えーっと, loadしたファイルの履歴をとると言う意味であれば
    attach(NULL, name = "JetFunEnv")
    assign("loadHistory",
    	commandArgs()[grep(".RData$",commandArgs(),ignore.case=T)],
    	pos="JetFunEnv")
    assign("load",
    	function(file, envir= parent.frame()) {
                assign("loadHistory",
    	           c(get("loadHistory",pos="JetFunEnv"),file),
    		   pos="JetFunEnv")    
    	    base:::load(file,envir)
    	},
    	pos="JetFunEnv")
    見たいなのを, .Rprofileに仕込んで, `loadHistory'とタイプすると言うのでどう? ダブルクリックはcommandArgsに渡るし, loadはbase環境だし, そんでいいかと思うけど用途に合わせて発展させてみて下さい. -- 2009-06-11 (木) 22:26:51
  • ありがとうございます.後から試して,結果を報告します. -- ジェットラグ? 2009-06-12 (金) 09:18:08
  • 一つのやり方はファイル中のオブジェクトに該当ファイル名をコメント属性で記録しておくことでしょうか.もちろんファイルに記録されたオブジェクトが単一でないと面倒になります.-- 2009-06-13 (土) 06:34:38
    #ファイル中のオブジェクトにファイル名をコメントする関数の例
    > Comment <- function(file.name) { 
       name <- load(file=file.name)   # ファイルからオブジェクトを読み込む
       A <- paste("comment(",name,")='from the file ",file.name,"'",sep="") 
       eval(parse(text=A))            # ファイル名をコメント属性に記録
       B <- paste("save(",name,",file='",file.name,"')",sep="")  
       eval(parse(text=B)) }          # 再びファイルに保存 
    > x <- 1:10
    > save(x,file="x.data")
    > rm(x)
    > Comment("x.data")
    > load("x.data")
    > comment(x)
    [1] "from the file x.data"
  • ありがとうございます.最初の方法と併せて,試行の結果をご報告します. -- ジェットラグ? 2009-06-15 (月) 10:20:16
  • 最初にご提示いただいた中にあるcommandArgs()という関数で目的は達成できました.hoge.RDataというファイルをダブルクリックして開いたとき,コンソールでcommandArgs()とすると
    > commandArgs()
    [1] "C:\\R\\bin\\RGui.exe"                   "C:\\temp\\hoge.RData"
    となるので,commandArgs()[2]で求めていたファイル名を取得できました.ただし,
    > load("c:/temp/hoge.RData")
    によってワークスペースをロードした場合には,commandArgs()ではファイル名を取得できないようです.この場合は,第二の方法のように,ファイル中のオブジェクトに該当ファイル名をコメント属性で記録しておくのが有効ですね.ご教示ありがとうございました. -- ジェットラグ? 2009-06-16 (火) 20:10:33
  • JetFunEnv?環境内のloadHistory変数にload関数を実行するたびにファイル名が追加されていくんですが解りにくかったでしょうか -- 2009-06-16 (火) 21:43:33
  • レスが遅くなり失礼しました.なるほど,そういうことだったんですね..Rprofileはあまりいじりたくなかったので,ついつい横着をしてしまいました. -- ジェットラグ? 2009-06-18 (木) 15:46:31

limmaインストール

sh? (2009-06-10 (水) 14:08:58)

'limma'パッケージがインストールできません。アドバイスをよろしくお願い致します。

> install.packages("limma",dep=T)
Warning message:
In getDependencies(pkgs, dependencies, available, lib) :
  package ‘limma’ is not available
> sessionInfo()
R version 2.9.0 (2009-04-17)
i386-apple-darwin8.11.1
  • CRANにはPackage ‘limma’ was removed from the CRAN repository. Formerly available versions can be obtained from the archive. とありますが。localに旧verを落としてもダメですか? -- akira? 2009-06-10 (水) 14:27:13
  • `source("http://bioconductor.org/biocLite.R") ; biocLite("limma")' bioconductorの方です -- 2009-06-10 (水) 17:26:42
  • source("http://bioconductor.org/biocLite.R") ; biocLite("limma")でインストールできました。ありがとうございました。 -- sh? 2009-06-10 (水) 21:53:45

非線形最小自乗法 nls( ) 関数でのエラーの理由

のの (2009-06-08 (月) 21:16:42)

次のデータyを,nls()関数で2次・3次多項式で近似し,それぞれ定数と係数を求めたいのですが,エラーメッセージが出て困っています(他のデータは,うまくいきます)。

y<-c(0.4404,0.2764,0.1124,-0.0516,-0.2156,-0.3796,-0.5436,-0.7076) # データ~
x<-c(1:8) # 変数~
res1=nls(y~a+b*x,start=c(a=1,b=1),trace=T) # 1次式~

これを実行すると,エラー「繰り返し数が最大値 50 を超えました」が出ます。

res2=nls(y~a+b*x+c*x^2,start=c(a=1,b=1,c=1),trace=T) # 2次多項式~
res3=nls(y~a+b*x+c*x^2+d*x^3,start=c(a=1,b=1,c=1,d=1),trace=T) # 3次多項式~

これら2次式,3次式を実行すると,エラー「勾配が特異です」が出ます。

データは見た感じほぼ直線ですが,上記3つの式で近似して当てはまりの良さをAIC比較したいのですが,結果が得られません。
どなたか原因と対策をお教えいただけないでしょうか。どうか宜しくお願い致します。

バージョンは,R2.5.0,WindowsXP を使用しています。

  • ?nls (「R基本統計関数マニュアル」の263頁)を見ましょう。データは正確に直線です。 -- 2009-06-09 (火) 01:51:21
    > diff(y)
    [1] -0.164 -0.164 -0.164 -0.164 -0.164 -0.164 -0.164
    > ye <- y+1e-3*rnorm(length(y)) #人工的な誤差を加えるのがコツ
    > res1=nls(ye~a+b*x,start=c(a=1,b=1),trace=T) # 1次式
    310.7787600001795 :  1 1 
    7.94637207633663e-06 :   0.6045071713694352 -0.1639666027143474 
    > res2=nls(ye~a+b*x+c*x^2,start=c(a=1,b=1,c=1),trace=T) # 2次多項式
    12261.1517016733 :  1 1 1 
    7.78438558419458e-06 :   6.040413965366944e-01 -1.636871378146956e-01  
    -3.105165551708922e-05 
    > res3=nls(ye~a+b*x+c*x^2+d*x^3,start=c(a=1,b=1,c=1,d=1),trace=T) # 3次多項式
    604223.0598427523 :  1 1 1 1 
    7.6193699392589e-06 :   6.048664356480176e-01 -1.645455118395975e-01
    1.939590111998957e-04 -1.666745679362869e-05
  • 単に誤差から式を見積もれないだけじゃないの?誤差がないのにnlsを使いたい理由が解りませんね. -- 2009-06-09 (火) 12:56:02
  • 最適化の手法を変えると解が求まりますよ。res1=nls(y~a+b*x,start=c(a=1,b=1),trace=T,algorithm="port") -- 2009-06-09 (火) 19:08:21
  • 皆様,ありがとうございます。解決しました! -- のの 2009-06-09 (火) 20:12:49
  • ?nlsすると*Do not use 'nls' on artificial "zero-residual" data.*とあり、The algorithm = "port" code appears unfinished, and does not even check that the starting value is within the bounds. Use with caution, especially where bounds are supplied. とあります。解は結果的に求まりますが、注意が必要ですね。 -- akira? 2009-06-10 (水) 17:14:46
  • ご指摘ありがとうございます。そうですね。。 -- のの 2009-06-13 (土) 18:31:16
  • AIC(lm(y~x+I(x^2)+I(x^3)))とかで良いのでは? なに故にnls? -- 2009-06-16 (火) 14:17:53

判別分析による予測について

yuuuu? (2009-06-05 (金) 02:55:35)

lda関数によって判別式の算出と算出に用いたデータ自体の判別は行えるのですが,その判別式を用いて別のデータの判別予測を行う方法がわかりません.
初歩的な質問かもしれませんが,どなたかお分かりの方いらっしゃいましたらよろしくお願いします.

  • ?ldaかexample(lda)すると、predict(z, Iris[-train, ])$classとちゃんと書いてあります。-- 2009-06-05 (金) 07:39:47
  • 英語苦手な人は R 基本統計関数マニュアル の183ページを見ましょう。 -- 2009-06-05 (金) 09:52:21

外れ値の棄却について

mito? (2009-06-03 (水) 17:29:59)

こんにちは。
すみません、初歩的な質問なのですが調べても分からなかったのでよろしくお願いします。
糖鎖とタンパク質(または血清やウィルスなど)の結合親和性を使ってヒートマップを
書いています。ヒートマップのクラスタがきれいに出ないので正規化しているのですが、実験の値(結合親和性)が明らかに外れているものがあり(実験ミスと思われる)、それらを棄却して正規化したいと思っています。
そこで列ごと(つまり一つのタンパク質に対する糖鎖の結合親和性)で実験の値が大きすぎるものと小さすぎるものをそれぞれ1〜2パーセント、または3個ずつくらい取り出して、それらを無視して正規化するということを列ごとに行いたいのですが、それが出来るような関数はあるでしょうか。もしあればその関数と利用方法、なければヒントを教えていただければと思います。
使用環境は

> sessionInfo()
R version 2.8.1 (2008-12-22)
i386-apple-darwin8.11.1

です。よろしくお願いします。

  • 分野特異的なタームが多いと返事が出にくいと思いますよ.要は列ごとに上下値を除外して処理をしたいんですよね?外れ値の決定方法の妥当性は置いといて、
    x <- matrix(sample(100,50),ncol=10)
    y <- t(apply(x,1,function(x) scale(x,center=mean(sort(x)[-c(1,length(x))]))))
              # 上下を1つずつ除いた場合
    という意味でしょうか? -- akira? 2009-06-03 (水) 19:35:10
  • 返信ありがとうございます。具体的に書いた方がより良いかしらと単純に考えてしまいました。 -- mito? 2009-06-03 (水) 20:00:52
  • 配慮が足りなくてすみません。そうです。上下値を1から2パーセント除外して処理したいのです。とりあえずは単純に除外して正規化したいと考えています。 -- mito? 2009-06-03 (水) 20:02:20
  • 単に±3SDの外側の値を捨てて、値がでなくなるまで繰り返すんじゃないの? -- 2009-06-03 (水) 22:54:35
  • すみません。意味がよくわからないのですが、列ごとに上下値を3つずつくらい除外して平均値と標準偏差をだし、それを使ってZ値を新しく作りたいのです。例えば
    > ex_matrix
      Answer1 Answer2 Answer3 Answer4
    A     101     120      70      35
    B     153     162      88      46
    C      89     135      78      24
    D      26      49      42      17
    E      36      70      30      16
    F     167     216     144      71
    G     125     143      89      65
    があったときに
    > apply(ex_matrix,2,sort)
         Answer1 Answer2 Answer3 Answer4
    [1,]      26      49      30      16
    [2,]      36      70      42      17
    [3,]      89     120      70      24
    [4,]     101     135      78      35
    [5,]     125     143      88      46
    [6,]     153     162      89      65
    [7,]     167     216     144      71
    を使ってこのソートした後の1行目と7行目の値を無視して正規化(Z値を各々出したい)したいのです。 1行目と7行目の値を列ごとに除外した平均と標準偏差が列ごとに出てほしいのです。-- mito? 2009-06-04 (木) 18:01:20
  • 例を出したので1行目と7行目と書いたのですが、本当はもっとデータが多いので1から3行目、最後の行から最後から3行目まで除外したいです。またもっとスマートな方法がありましたら教えていただければと思います。 -- mito? 2009-06-04 (木) 18:03:31
  • 私が書いたように妥当性の話だと思います。z変換が妥当なら、外れ値を信頼区間で決めるも良し、トリム平均やMADも一手だと思います。要はどの統計モデルを使うかで、スマートな方法もそこに依存すると思います。 -- akira? 2009-06-04 (木) 19:23:39
  • 「列ごとに上下値を3つずつくらい除外して」というのは「恣意的に」除外するということでしょうか? -- 2009-06-05 (金) 10:38:30
  • 恣意的です。Z値を求めるときは除外したものを入力値として残しておくのは問題ないです。 -- mito? 2009-06-05 (金) 15:40:57

重み付きロジスティック回帰分析のプログラミング方法

初心者? (2009-06-01 (月) 13:16:17)

はじめまして。
目的変数が1のデータが141個、0のデータが34個のデータセットもとに解析手法としてロジスティック回帰分析を用い、検証方法としてleave-one-outを行っています。
ですが、目的変数が1と0のデータの数に差があるため、glmパッケージの中のプログラミングを変更して、重みをつけようと考えています。どの部分に重みをつければいいのでしょうか?どなたかご存じの方はいらっしゃらないでしょうか?よろしくお願いします。

  • やりたいことだけじゃなく、デモデータ、やったことを書くことをお勧めします。背景説明は大切です。 -- 2009-06-01 (月) 20:10:46
  • 175組のデータを集めたら、目的変数の値が1のものが141組あった、という意味ですか?だとすると、どっちかが多すぎる、少なすぎるというのは面妖な。 -- 2009-06-01 (月) 23:28:01

正の乱数発生

edora? (2009-06-01 (月) 02:28:33)

"The R Book"を読んでRでシミュレーションをしてみようと思っています。
以下のように乱数を発生させるサンプルがあるのですがrunif(10000,0,1)の後の"*.Machine$integer.max"がなぜ付いているのかわかりません。これの意味はどういったものでしょうか?また得られる乱数の桁数はどう決まっているのでしょうか?

---サンプル----
RNGkind("Super-Duper")
# 10000個の擬似乱数を正の整数の範囲で生成してinitsというベクトルに付値
inits <- as.integer(runif(10000,0,1)*.Machine$integer.max)

よろしくお願いします。

  • .Machine$integer.max = 2^(32)-1 は R が扱える最大正整数。なぜ悪いと分かっている乱数発生法 "Super-Duper" を使うんですか? -- 2009-06-01 (月) 15:23:19
  • 最大正整数が2^(32)-1なんですね。得られる桁数の指定で使っていると考えてよさそうですね。どうもありがとうございます。"Super-Duper"は書籍で使っていたものでしたが、一般的なリコメンドとして"Mersenne-Twister"が紹介されていました。 -- edora? 2009-06-02 (火) 00:51:17

p値の指数を変更する方法(p値が0.000000e+00となってしまう

かわべ? (2009-05-29 (金) 03:03:48)

多重比較検定をTukey法によって行っています.
青木先生のHP(http://aoki2.si.gunma-u.ac.jp/R/tukey.html)を参考に,

source("http://aoki2.si.gunma-u.ac.jp/R/src/tukey.R", encoding="euc-jp")
dat <- read.table("in.txt",header=T)
tukey(dat$number,factor(dat$No))

というふうに検定を行っていますが

            t            p
1:2  9.239636 0.000000e+00
1:3 12.311420 0.000000e+00
     ・
2:3  3.071784 1.206570e-02
     ・
     ・

というようにp値が0になってしまうものがでてきます. サンプル数が大きすぎるため(各群サンプル数110,4群比較=440)p値がかなり小さくなっているのだと思いますが、このp値の指数をできるだけ大きい数字まで表示させることはできるのでしょうか。(例2.118100e-89というふうに)

  • R version 2.9.0 (2009-04-17)  i386-pc-mingw32  attached base packages: [1] stats graphics grDevices utils datasets methods base -- 2009-05-29 (金) 22:05:47
  • 数字の出力桁数を最大にするだけですむなら option(digits=22) としてみては。 しかしそんな小さな確率は分布関数の計算アルゴリズムの精度を越えてしまい、無意味なのでは。 -- 2009-05-30 (土) 18:45:48
  • ありがとうございます.入れてみましたが、 エラー: 関数 "option" を見つけることができません.と表示されてしまいます.なにかソフトをインストールしなければいけないのでしょうか?ちなみに、ソフトやコマンダー(?)等は一切いれていません。 -- かわ? 2009-05-30 (土) 23:55:11
  • ちなみに数値の出力桁数って初期設定ではどれくらいなのでしょうか?あと、上記に関して、最大で22となっていますが、22が出力係数の最大ということなのでしょうか? -- かわ? 2009-05-31 (日) 02:01:59
  • 失礼 options(digits=22) です。実際は有効桁数は16-17桁です。?options としてみてください。 -- 2009-05-31 (日) 08:30:14

survfitが使えません

かわぐち? (2009-05-28 (木) 22:55:35)

生存分析を行い生存曲線をカプランマイヤー法で描こうと思っています。

event <- c("y","y","y","y","y","n","y","y","n","y","y","y","y","n","n",
"y","y","y","y", "n","y","n","y","y","y","y","y","n","n","y")
time <- c(16,2,6,5,8,13,4,8,11,1,13,7,16,10,9,8,14,17,14,12,13,18,13,6,3,
15,17,16,14,8)
dat <- Surv(time, event=="y")
res <- survfit(dat)
以下にエラー survfit(dat) : 
 Survfit requires a formula or a coxph fit as the first argument

とのエラーが出て分析できません。何が間違っているのでしょうか。

  • survfitがformulaかcoxph fitしか取らないと言っています。引数の形式が違います。?survfitすると" For a single survival curve the right hand side should be '~ 1'"とありますが、かわぐちさんのケースはstrataはありますか? -- akira? 2009-05-29 (金) 00:23:46
  • 返事ありがとうございます。しかし、survfitが要求しているものがわからないのでもう少し教えてください。 strataは層ですか? 一つの生存曲線では右手側が’〜1’であるべき、という文も理解できていません。 -- かわぐち? 2009-05-29 (金) 04:48:51
  • 2.9.0 と 2.8.1 とで挙動が違うようですね.2.8.1 では以下のようにうまく動きます.
    > library(survival)
     要求されたパッケージ splines をロード中です 
    > event <- c("y","y","y","y","y","n","y","y","n","y","y","y","y","n","n",
    "y","y","y","y", "n","y","n","y","y","y","y","y","n","n","y")
    > time <- c(16,2,6,5,8,13,4,8,11,1,13,7,16,10,9,8,14,17,14,12,13,18,
    13,6,3,15,17,16,14,8)
    > dat <- Surv(time, event=="y")
    > res <- survfit(dat)
    > res
    Call: survfit(formula = dat)
    
          n  events  median 0.95LCL 0.95UCL 
         30      22      13       8      16 
    > plot(res)
    2.9.0 では,
    > dat <- Surv(time, event=="y") ~ 1
    としないとダメ.-- surg? 2009-05-29 (金) 10:28:20
  • なるほど、それが右側の~1だったのですね。 2.9.0で仕様が変わっていたとは盲点でした。有難うございました。 -- かわぐち? 2009-05-29 (金) 13:33:05

Sliding windowによる t-test

? (2009-05-27 (水) 00:19:18)

すみません。どなたかこのやり方をご存知ではないでしょうか?
例えば、1から100までの数が順に並んでいると考えてください。
このとき、仮に20個の数字を一つのwindow sizeとしてこのグループとそれ以外の数との間でt-testを行います。更にそれを数を一つずつずらしていき、それぞれに対してt-testを行って、それぞれのp-valueを求めたいと考えています。
つまり、

<比較A>
[1-20]と [21-100]の間のt-test
<比較B>
[2-21]と [1& 22-100]の間のt-test
<比較C>
[3-22]と [1-2& 23-100]の間のt-test
<比較D>
[4-23]と [1-3& 24-100]の間のt-test
<比較E>
[5-24]と [1-4& 25-100]の間のt-test
       .
       .
       .
<比較Z>
[81-100]と [1-80]の間のt-test

として、それぞれのp-valueを求め、最終的にはその中で最も小さいp-valueを求めたいと考えています。
すみませんが、どなたかご存知ではないでしょうか?
お願いします。

  • こういうテストにはきっと何も意味はないよ,と思いつつ・・・
    x <- rnorm(100)
    p <- rep(0,81)
    for(i in 1:81){
    	g <- rep(0,100)
    	g[i:(i+19)] <- 1
    	p[i] <- t.test(x ~ g)$p.value
    }
    • ? 2009-05-27 (水) 01:16:57
  • ありがとうございました。やってみます。 ただ、もしかすると上の場合は、20の要素と全体の100の要素を比較しているのでしょうか?すみません、素人なもので。 求めたいものは、20の要素と残り80の要素の比較なのですが、上のままで大丈夫ですか? よろしくお願いします。 -- ? 2009-05-27 (水) 05:34:20
  • 大丈夫です。 -- ぷぷぷ? 2009-05-27 (水) 07:40:59
  • ありがとうございます!! -- ? 2009-05-27 (水) 08:25:24

barplotで各棒に長い名前を付ける方法

kddoi? (2009-05-25 (月) 16:15:08)

棒グラフを作成しようとしております。しかし、個々の棒に付けるべき文字列が長いため、全ての名前を表示することができません。当初barplotのnames.argに名前を渡していたのですが表示できず、axis関数を使えばより細かく制御できるところまでは調べました。axisのR Documentationにother graphical parameters may also be passed as argumentsとあるので、srtなどを使って回転させようとしても駄目で、また文字の大きさをcexで変えようとしても駄目でした。以下がその様子を示す簡単なプログラムでVery long name 1から7までを全て表示することができません。

pos <- barplot(c(1:7), ylim=c(0,8))
box()
axis(1, at=pos, tick=FALSE, labels=paste("Very long name", 1:7))

ようやくaxisの代わりにtext(pos, 0, paste("Very long name", 1:7), adj=-0.1, srt=-90, cex=0.7)とすることで全ての名前を表示させることができたのですが、場当たり的な対処の気がいたします。Rを使い初めて長くないため網羅的な検索ができていないので、もしより便利な方法があればお教えください。

  • par(las=2, mar=c(10,4,4,1));barplot(c(1:7), ylim=c(0,8), names.arg=paste("Very long name", 1:7)) -- 2009-05-25 (月) 16:31:40
  • シンプルで応用の利く方法をありがとうございます。lasの指定で文字列の方向を変え、marの指定で余白の大きさが変えられたのですね。 -- kddoi? 2009-05-25 (月) 16:55:39
  • それでも長い場合はpaste("Very very very \nvery long name", 1:7)とか -- akira? 2009-05-26 (火) 22:32:03
  • ありがとうございます。C言語のprintf等で使える"\n"や"\t"も使えることが分かりました。 -- kddoi? 2009-06-01 (月) 14:16:22

番号が連続するグループの数を調べたい・・・

ぽち? (2009-05-24 (日) 00:47:22)

例えば、

x <-c(1,2,3,4,5,6,8,9,10,11,12,13,15,16,17,19,20)~

という配列があったとします。
ここから、番号が5個以上連続で続いているグループ(1,2,3,4,5など。4,5,6,8,9はこの場合ふくめません)が何個あるかを調べたいのですが、できるでしょうか?一通り検索で調べたのですが、検索ワードが悪いらしく分かりませんでした。よろしくお願いします。

  • 検索でわかる性質の問題ではありません。Rの文法はわからなくても、日本語でいいので、どのようなロジックで動くプログラムを書けばよいのかのアイデアは持っていますか?文法は調べればわかりますが、アイデアは誰にも教えてもらえませんよ。 -- 2009-05-24 (日) 09:28:15
  • 8,9,10,11,12,13は6つ続きの1グループと考えるだけでよいのか、あるいは8,9,10,11,12と9,10,11,12,13もそれとは別にカウントするのか。多分前者だと思うけど、投稿者の書き方だと曖昧ですね。 -- 2009-05-24 (日) 10:55:34
  • すみません。言葉足らずでした。 「8,9,10,11,12,13は6つ続きの1グループと考えるだけでよい」です。 実際のところ、これはブーツストラップの一部で、このような「XXつ以上連続する番号があるグループ」が一つ以上あれば条件をパスして「1」とカウントし、ない場合はカウントしません。 そのため、 x <-c(1,2,3,5,6,8,9,10,11,13,15,16,17,19,20) に対して、「5つ以上連続する番号があるグループ」という条件で行った場合、これは条件をパスしません。 よろしくお願いします。
    • ぽち? 2009-05-24 (日) 13:44:10
  • これはどう?
    > x <- c(1,2,3,4,5,6,8,9,10,11,12,13,15,16,17,19,20)
    > y <- rle(diff(x))                     #差分の連続のしかたを調べる
    > z <- y$lengths[which(y$values == 1)]  #差分1の連続する長さを得る
    > length(z[z >= 4])                     #(基準-1)以上の要素数を得る
    [1] 2
    • 2009-05-24 (日) 15:56:57
  • nrow(subset(data.frame(c(rle(diff(x)))), values==1 & lengths >= 5)) -- one liner? 2009-05-24 (日) 18:52:52
  • ありがとうございます。 早速、組み込んでやってみます!! -- ぽち? 2009-05-25 (月) 10:05:05

プロットでデータ群を記号分けしたい

初心者。。? (2009-05-22 (金) 15:43:22)

散布図で2種類のデータ群を色分けではなく、記号分けしたいのですが、どうすればよいのでしょうか?
例えば、Aのデータ群を○、Bのデータ群を×で表示したいのですが。。。
初歩的な質問ですが、よろしくお願いします。

  • matplotでどうでしょう -- 2009-05-22 (金) 18:40:13
  • pchに記号のベクトルを与えれば良いのでは?
    > x <- cbind(matrix(sample(100,32),ncol=2,dimnames=list(1:16,c("A","B"))),
        group=rep(c(1,4),8))
    > plot(x[,1:2],pch=x[,3]) 
    ということですか? -- akira? 2009-05-22 (金) 19:03:38
  • akiraさん。回答ありがとうございます。下記の「よろしくお願いします。」さんのような2つのデータ群からの方法を教えていただけないでしょうか?よろしくお願いします。 -- 初心者。。? 2009-05-22 (金) 20:47:29
  • 勉強が不十分なようですね。色分けの方法を知っているなら、akiraさんの回答だけで十分だと思いますよ。ちょっと入門書を読めばすぐに出てくる方法だし、さすがにこれができないようだとこの先R(だけではなく、他の統計パッケージであったとしても)を使い続けるのは厳しいと思います。 -- 2009-05-22 (金) 23:32:33
  • 「初心者。。」さんのお役に立ててよかったです。ただ、私も↑さんと同意見です。糸口が分かったら、次は考える番です。それでもダメならやったことを明示して、質問してはどうですか?ここは予備校や学校や駆け込み寺でないと思ってます。
    > x <- cbind(x=1:4,y=1:4)
    > plot(x,pch=x[,1]) 
    この意味をよく考えれば分かると思います。 -- akira? 2009-05-23 (土) 18:09:45

記載データの散布図での3次元(4次元)表示方法

よろしくお願いします。? (2009-05-22 (金) 14:24:41)

Rの初心者です。以下のようなデータを3次元(または4次元)表示したいのですが、コマンドの入力方法が分かりません。

> x<-cbind(rnorm(700,mean=11,sd=10),rnorm(700,mean=28,sd=16),
  rnorm(700,mean=1,sd=1),rnorm(700,mean=14,sd=15))~
> y<-cbind(rnorm(600,mean=30,sd=50),rnorm(600,mean=27,sd=16),
  rnorm(600,mean=7,sd=1),rnorm(600,mean=16,sd=21))~

どなたか、よろしくお願いします。

  • 「データを3次元(または4次元)表示」が具体的にどういうものなのか正確に説明できないと、コメントがつかないと思うよ -- 2009-05-22 (金) 23:08:04
  • scatterplot3dじゃだめかな? -- 2009-06-01 (月) 14:20:30

SASからRへのプログラム書き換え

もうダメです。。? (2009-05-22 (金) 08:34:54)

ここでお尋ねしてよいのか迷いましたが、自分で考えてももう、どうしようもなく、時間がだけがどんどん過ぎてしましました。どなたか、助けて下さるとありがたいです。

SASの以下のプログラムをRにしなくてはいけません。
たくさん調べてみたのですが、私はどちらも初心者で、考えが及ばないのです。
以下は、Rで書くと、どのように書き直せるのでしょうか?

proc  tpspline  data  A~
  model  Y=(X1 X2 X3)/alpha=0.01;
  score data=A   out=B
  output out=C
Run;

場違いな質問をしていたら申し訳ありません。

  • 機能的な書き換えだけなら, proc tpsplineに対応するR関数の名前をネット上(他のところでも聞いていますよね)でも教えてもらえると思いますが、データの変換も行わなければプログラムに投入できないでしょう。そこまでネット上だけで教えてあげられる人はいないと思いますよ。私はpenalized least squares methodを用いたnonparametric regression modelには詳しくないので、直接の回答はできませんが...自分で勉強する時間がないなら、SASかR、どちらかが得意な知り合いに頭を下げるしかないと思いますが。 -- 2009-05-22 (金) 23:26:53
  •  パッケージ「gss」をインストールした後、例えば 以下のRプログラムを実行すれば、推定値のグラフを描く ところまでやってくれます。
function () 
{
 library(gss)
 xx1 <- c(1,2,4,3,5,6,5,7,6,8)
 xx2 <- c(5,2,1,9,3,1,2,3,9,5)
 yy <-  c(2,2,1,9,2,1,1,1,2,2)
 data1 <- data.frame(x1 = xx1, x2 = xx2, y= yy)
 data2 <- list(x12=cbind(xx1, xx2), y=yy)
 anova1 <- ssanova0(y~1+x12, data=data2)
 ex1 <- seq(from = min(xx1), to = max(xx1), by = 0.1)
 ex2 <- seq(from = min(xx2), to = max(xx2), by = 0.1)
 ex12 <- expand.grid(ex1, ex2)
 data3 <- model.frame(~1+x12, list(x12=cbind(ex12[,1], ex12[,2]))) 
 ey1 <- predict.ssanova0(anova1, data3, inc=c("1","x12"))
 eymat1 <- matrix(ey1, ncol=length(ex2))
 persp(ex1, ex2, eymat1)
}

SASのalphaというのは推定値の信頼区間を推定するための定数のようです。 ssanova0()を利用する場合は、上のRプログラムならanova1の中身を 利用すれば、推定値の信頼区間は容易に得られます。--竹澤? (2009-05-25 (月) 09:01:01)

Rで作った計算プログラミングをVBAやC#用のDLLにするには?

青空? (2009-05-17 (日) 11:23:37)

Rは3年度ほど使わせてもらっていますが、最近VBAやC#用のDLLに変換できる機能があれば便利だなと思うようになりました。皆さんのご存知のとおり、MATLABはVBA用DLL作成機能がついていますが、Rはそのような機能がないのでしょうか?

  • 聞いたことないな・・・。Rをコンパイルするってことか? -- 2009-05-17 (日) 12:08:21
  • DLL作成機能はないかなぁ・・・.ですが、実際やったことはないですがRをエンジンとしたフロントエンドを自作するには?を、参考にRを組み込んだプログラムを作ることができるので、それをDLLとして、作ることはできると思いますが・・・.いづれにしてもボタンひとつでお手軽にというわけには、いかないような・・・.具体的に、「こんな仕様で」みたいなものを、書いてみたらいかがでしょう?だれかがDLLの作り方のサンプルを提示してくれるかもしれませんよ -- ななし 2009-05-18 (月) 09:23:35
  • Rを裏で立ち上げないと、VBAやVBから直接利用出来ないようで、しかもかなり遅いようです。一度Rで作った自作関数をVBAの標準モジュールに添付できるようになれたらと思っていますが。MATLABにはそのような機能があると伺いましたので、Rにはないのかなと。(イメージ的にはRのプログラミングをコンパイルすることと同じかな)どなたがRプログラミングをC言語のようにコンパイルする方法聞いたことがありますか? -- 青空? 2009-06-06 (土) 20:12:59
  • ないってば。見方を変えて、Sならあるのか調べてみたら? -- 2009-06-07 (日) 09:43:24

ベン図の面積

sh? (2009-05-14 (木) 23:04:29)

個数に比例するように面積を変化させたVenn Diagramを描くにはどうすればよろしいでしょうか?参考文献 http://d.hatena.ne.jp/kwg/20090202/p1

  • symbols()でできるけど、個数と円の面積をそのまま比例させるのはまずい。なぜならば、人間の視覚的認知では個数と円の面積の関係を正しく捉えられないから。 -- 2009-05-15 (金) 00:04:55
  • アドバイスありがとうございます。どうすればよろしいでしょうか? -- sh? 2009-05-15 (金) 22:52:51
  • Flanney J (1971). “The Relative Effectiveness of Some Common Graduated Point Symbols inthe Presentation of Quantitative Data.” Canadian Cartographer, 8(2), 96-109を読む。symbolsの使い方は、例えば、個数が5と10として、r <- sqrt(c(5,10)/pi); symbols(c(0,r[2]),c(0,0),circles=r,xlim=c(-2,4),axes=FALSE,xlab="",ylab="",inch=FALSE)。 -- 2009-05-16 (土) 11:35:40
    VennDiagram.png
  • > 個数と円の面積をそのまま比例させるのはまずい
    と言っているが,間違えている(というか,後では正しいことを述べているので)。
    要するに,「個数を半径(直径)に比例させるのではなく,面積に比例させなさい」ということでしょう?「r <- sqrt(c(5,10)/pi)」はそれを表していますよね。 -- 河童の屁? 2009-11-30 (月) 21:49:51

Rをエンジンとしたフロントエンドを自作するには?

しまだ? (2009-05-13 (水) 22:31:36)

Rまだまだ初心者です。筑波大のSDAMのようにデータ処理をRに任せるようなフロントエンドを自作するためのマニュアル等はあるのでしょうか?

  • GUI実装のパッケージは色々あると思う。フロントエンドをどんな言語にするのか、どうやってRを動かすのかで様々。(SDAMではR(D)COMを使っているが、現在はstatconnDCOMという新しい名前になっており、WindowsOS専用。Rworkbenchだと、JavaとRServeのミックス) -- 2009-05-14 (木) 09:15:30
  • Windows版のR-2.7.1に添付されているPDFで「R-exts.pdf」というのがあると思います.そのPDFの8章に「8 Linking GUIs and other front-ends to R」という章があります(なぜか2.8あたりのRには、添付されていないようですが).インターネット上にもありますねWriting R Extensions.また、上の方が書かれているようにR(D)COMやRserve(JavaからRserveを使う)を使う方法もあると思います。 -- ななし 2009-05-14 (木) 12:16:22
  • どうもありがとうございました。まずは御紹介頂いた資料にあたってみます。 -- しまだ? 2009-05-14 (木) 15:08:43

R のコードのデバッグに使用する開発環境について

初心者? (2009-05-11 (月) 00:30:22)

最近 R を使い始めた初心者です。
R でコードを書いて、デバッグしようと思うのですが、予め設定したブレークポイントで実行が中断して、1 行ずつ実行したり、その断面の状態の変数が分かる (VBA の VBE や Visual Studio でデバッグするときにある機能) ような開発環境はあるのでしょうか?
browser() でできることに近いのですが、browser() だと CUI ベースということと、知りたい変数名をいちいち入力するのが面倒なので、GUI ベースの開発環境を使えたりしたら教えていただければと存じます。
Eclipse 上で R を動かしたり、Meadow + ESS で試したりしたのですが、その ような機能はないように見えます。
そもそも、そのような開発をするほどの長さのコードを書かないものなのでしょうか?

  • わたしが知る限り初心者さんが記述しているデバッガ以外で、GUIのものは、しりませんねぇ・・・確かにEclipse上でデバッグできるといちいちオブジェクトの中身を出力したりする必要もないので、便利かもしれませんね.オブジェクト名を入力する必要も少ないでしょうし.Pythonとかにも、GUIベースのデバッガありますものね.そういうのがあると初心者もとっつきやすいのかも?個人的には特にGUIでないと、不便だということはありませんが. -- ななし 2009-05-13 (水) 10:03:29
  • ess-rdired.elは試した?ESSではあらかじめ設定するブレークポイントは空行です。C-c C-cで空行の前まで実行されます。現在行を1行実行して次の行に移動するのはC-c C-n。オブジェクトの中身を表示するのは、ess-rdired.elが表示しているオブジェクト一覧の上でvを押下します。 -- 2009-05-14 (木) 19:29:18
  • 返信が遅くなってしまい申し訳ございません。ess-rdired.elは試していないので、試してみます。丁寧な回答ありがとうございました。 -- 初心者? 2009-05-20 (水) 01:35:34

Rで一から画像を作成する方法

焼津の半次? (2009-05-08 (金) 21:46:35)

 Rで、一から画像を作成してPNG形式で保存したいのですが?Rでできるのでしょうか?

  • 「一から画像を作成して」の部分がよくわからんが、「PNG形式」では保存できる。 -- 2009-05-08 (金) 23:02:05
  • 画像の保存はbitmap・Jpeg・PNG・windows metafile・pdf・postscript等でできます。他にも何かあったかも。 -- 2009-05-09 (土) 09:23:27
  • SVG -- 2009-05-09 (土) 13:02:18

GLM−エラー

そのまま? (2009-05-08 (金) 15:50:59)

一般化線形モデル(GLM)の分析について、以下のようなデータを用いて

> d02$y
 [1] 59.61 33.27 20.27 10.18 11.77 12.88 23.30 14.15  5.10  0.79
> d02$x
 [1] 27.84 27.66 26.90 26.91 27.25 27.24 27.30 27.21 27.29 27.07

AIC値を求めるとき、

> AIC(glm(y~x,family=poisson,data=d02))
[1] Inf
Warning messages:~
1: In dpois(y, mu, log = TRUE) : non-integer x = 59.610000
2: In dpois(y, mu, log = TRUE) : non-integer x = 33.270000
     略
9: In dpois(y, mu, log = TRUE) : non-integer x = 5.100000
10: In dpois(y, mu, log = TRUE) : non-integer x = 0.790000

のようなエラーが出ます。なぜでしょうか?教えてください。

  • これは,AIC が出しているウォーニングメッセージではなく glm のウォーニングメッセージですね。family=poisson を指定しているのだから,従属変数が整数値でないのはおかしいよ(従属変数が実数値なら family=poisson は指定できないよ)といっているのです。なお,ウォーニングメッセージ中の x は従属変数を指していますので注意(x=59.61 となっているから,わかりますね)
    従属変数を無理矢理整数にすると以下のようにウォーニング無しで答えがでますけど,それで良いというものではないですね。 -- 2009-05-08 (金) 16:06:59
    > AIC(glm(as.integer(y)~x,family=poisson,data=d02))
    [1] 98.2934
    > AIC(glm(round(y)~x,family=poisson,data=d02))
    [1] 93.20353
  • as.integerを使うことで解決できました。有難うございます。 -- そのまま? 2009-05-08 (金) 16:47:30

エクセルでデータファイルを作る際のエラー

高橋? (2009-05-08 (金) 00:37:04)

本当に素人です。
Rで回帰分析を行うために、エクセルで”カンマで区切って数値”をして保存したあと、Rでそのファイルを読み込んだんですが、y値が認識できません。classで確認してみるとNULLになっています。何回やっても無駄でした。テキスト(例えば、矢野先生のRによる心理統計など)を見ながら、PATHやheader=TRUEなどちゃんと書いたと思います。何で認識しないんでしょうかね?教えてください。

  • read.csv使ってますか? -- 2009-05-08 (金) 11:23:21
  • あ!すみません。質問の仕方が悪かったみたいですね。解決できました。回帰分析を行うとき、1行目の列名を間違って記入していました(小文字と大文字)。どうも有難うございました。 -- 高橋? 2009-05-08 (金) 15:59:00

heatmapの行と列の名前の取り出し方について

maori? (2009-05-06 (水) 17:21:29)

たびたび初歩的な質問をすみません。
糖鎖とタンパク質との反応のheatmapを書いていて、糖鎖の数が多くて見にくいのでヒートマップの行の名前として糖鎖の名前を順番通り取り出したいのですが、どのようにすればよいのか分かりません。
heatmapの中のlabRowがそれを示しているのだと思ったのですがどのように取り出せば良いのでしょうか。

> z <- read.table("test.txt",header=TRUE,sep="\t",row.names=1)
> z_numeric <- apply(z,c(1:2),as.numeric)
> z_euclid <- dist(z_numeric,method="euclid")
> heatmap(z_numeric,hclustfun= function(z_euclid)
  hclust(z_euclid,method="ward"))

です。
また、ヒートマップの詳しい書き方について学べるページがありましたら、教えていただければと思います。
使用環境は

> sessionInfo()
R version 2.8.1 (2008-12-22) 
i386-apple-darwin8.11.1 

です。よろしくお願いします。

  • x<-heatmap(ほげほげ); labels(x$Rowv) -- takahashi? 2009-05-06 (水) 19:13:05
  • 返信ありがとうございます。
    > label_z <- heatmap(z_numeric,hclustfun= function(z_euclid) 
      hclust(z_euclid,method="ward"));labels(x$Rowv)
    character(0)
    > label_z
    $rowInd
     [1]  1  5 13 19  8 18  6 14 15  3  7  2  9 17 16 12 10 11  4
    
    $colInd
    [1] 4 3 5 1 2
    
    $Rowv
    NULL
    
    $Colv
    NULL
    となってしまうのですが、何が原因でしょうか。どう解決すれば良いのでしょうか。 再び質問ですみません。-- maori? 2009-05-06 (水) 20:52:23
  • heatmap() 関数の引数として keep.dendro = T を追加して実行し,その結果を使って labels(res$Rowv) を実行してみてください.機能のより豊富な levelplot() 関数もおすすめです(latticeパッケージ). -- 別の ishida 2009-05-07 (木) 16:18:27
  • ありがとうございます!取り出すことができました。levelplot関数についても調べて利用してみます。 -- maori? 2009-05-07 (木) 20:02:27

plotにおける横軸目盛と関数の値の対応がずれる

hf? (2009-05-06 (水) 13:01:44)

二項分布について,

> dbinom(0,3,.5)
[1] 0.125

のように求めた値と,

> plot(dbinom(0:3,3,.5),xlim=c(0,5),ylim=c(0,.5))

でx=0,1,2,3に対する値を求めてプロットしたものとを比べると,後者のグラフでは,横軸の1に対応する位置に上で求めた値0.125がプロットされます。結果として,x=0,1,2,3に対応する値が,グラフ上では(横軸の値)=1,2,3,4に対応する位置にプロットされ,1だけずれた位置に描かれます。
dbinom(x,n,p)でxに与えた値と,plot(dbinom(x,n,p))でグラフをプロットしたときの(横軸の値)とが一致するようにするには,どうすればよいでしょうか?
使用環境は以下の通りです。

> sessionInfo()
R version 2.8.0 (2008-10-20) 
i386-pc-mingw32

よろしくお願いいたします。

  • plot(0:3, dbinom(0:3,3,.5)) -- 2009-05-06 (水) 13:49:15
  • ありがとうございました。 -- hf? 2009-05-06 (水) 14:04:02

R2WinBUGSでモデルファイルの読み込み

tonton1225? (2009-05-04 (月) 16:14:57)

RからWinBUGSを呼び出し、下記のモデルファイルを読み込むとエラーが起きます。
エラーの内容はよく分からない記述になっていて、解読できません。
エラーは無駄に長く、コピペしても意味がないっぽいのでコピペしませんでした。
WinBUGSのバージョンは1.4.3、WindowsXPです。
なぜ、モデルファイルを読み込めないのかどなたか教えて下さい。
モデルファイル

model
{
	for(i in 1:N) {
		data[,i] ~ dmultinom(4,prob)
	}
	
	Tau <- 1
	
	alpha1 ~ dnorm(0, Tau)
	alpha2 ~ dnorm(0, Tau)
	alpha3 ~ dnorm(0, Tau)
	alpha4 ~ dnorm(0, Tau)
	alpha <- ceiling(abs(c(alpha1,alpha2,alpha3,alpha4)))
	
	prob ~ ddirichlet(alpha)
}

WinBUGSを呼び出す

# パッケージの読込
library(MCMCpack)
library(R2WinBUGS)

# データの作成
Tau.real<-10
alpha.real<-rnorm(4, 0, Tau.real)
alpha.real <- ceiling(abs(alpha.real))
prob.real<-rdirichlet(1,alpha=alpha.real)
data<-rmultinom(n=100,size=4,prob=prob.real)

N<-ncol(data)

# 初期値と保存するパラメータを設定
in1<-in2<-in3<-list(alpha1=1,alpha2=1,alpha3=1,alpha4=1,prob=c(.25,.25,.25,.25))
inits<-list(in1,in2,in3)
parameters<-c("alpha1","alpha2","alpha3","alpha4","prob")

# R2WinBUGSを実行
sample.wb<-bugs(
	data, inits, parameters,
	model.file="model.bug.test.txt",
	debug=FALSE,
	n.chains=3, n.iter=10000, n.burnin=1000, 
	codaPkg=TRUE,
	bugs.directory="C:/Program Files/WinBUGS14",
	working.directory=NULL
)
  • 投稿書式がなっていなかったので,修正しておきます(初心者に親切でしょ?)投稿作法については,修正できない。 -- 2009-05-04 (月) 17:10:26
  • ありがとうございます。色々と初心者ですみません。 -- tonton1225? 2009-05-04 (月) 17:18:59
  • 「エラーの内容はよく分からない記述になっていて、解読できません。エラーは無駄に長く、コピペしても意味がないっぽいのでコピペしませんでした。」と書いていますが,無駄だと思うのは,あなただけかも知れない。一々,同じことをやってみて,同じエラーを出してみて原因を探ってあげようという奇特な人はそんなにはいないのでは無いかと思う次第で(「投稿作法については云々」は,こういうことなんだけど)まあ,エラーメッセージが数千行でない限り出してみれば?本当に,「意味がない,わけわかめなエラーメッセージ」なら,「こんな風にわけわかめなんですよ!」ということがわかるように編集して,投稿すればよいと思うわけです。
    まあ,これだけ親切に??投稿法について記述しても,初心者に厳しいとか言われるのは目に見えているわけで。そういう人は,さっさと回答してあげるように,せつにお願い申し上げる次第です。 -- 2009-05-04 (月) 18:08:31
  • エラーの一部ですが、試しに出してみます。よろしくお願いします。
    incompatible copy
    BugsCmds.TextError   [000003A1H] 
    	.beg	INTEGER	831976856
    	.end	INTEGER	16861596
    	.name	ARRAY 256 OF CHAR	"C:/Documents and Settings/sumiok"   
    "C:/Documents and Settings/sumioka/My Documents/program/R/kubo/model.bug.test.txt", 0X, ..., 0X   
    	.pos	INTEGER	35
    	.text	TextModels.Model	[01016F90H] 
    	.v	Views.View	[010182D0H] 
    BugsCmds.Parse   [00000470H] 
    	.name	ARRAY 256 OF CHAR	"C:/Documents and Settings/sumiok"   
    "C:/Documents and Settings/sumioka/My Documents/program/R/kubo/model.bug.test.txt", 0X, ..., 0X   
    	.s	BugsScanners.Scanner	
    	  .char	CHAR	"]"
    	  .nextCh	CHAR	" "
    	  .real	REAL	5.515143454889401E-308
    	  .int	INTEGER	1
    	  .pos	INTEGER	35
    	  .type	INTEGER	0
    	  .len	INTEGER	1
    	  .string	BugsScanners.String	"i"   
    "i", 0X, "ta", 0X, 0X, "hlet", 0X, "#", 0D4A8X, "#",
    1B4BX, 3144X, 0X, 0X, 0D4ECX, "#", 0B64X, 3130X,
    0D4C0X, "#", 0D4C0X, "#", 2653X, 3144X, 80D0X, 108X,
    0D550X, 117X, 0X, 0X, 0D4D8X, "#", 0D4D8X, "#",
    354FX, 3144X, 80D0X, 108X, 0D550X, 117X, 0X, 0X,
    0D4FCX, "#", 625EX, 3131X, 0D880X, 104X, 0D4ECX, "#",
    0B64X, 3130X, 0X, 0X, 2D60X, 32E7X, 2D74X, 32E7X,
    14X, 0X, 0D51CX, "#", 4C97X, "&otilde;", 0E290X,
    102X, 2D60X, 32E7X, 2D74X, 32E7X, 14X, 0X, 0DBFCX, "#",
    0D43EX, "#", 0D544X, "#", 4CE5X, "&otilde;",
    2D60X, 32E7X, 2D74X, 32E7X, 14X, 0X, 0E044X, "#",
    0D55CX, "#", 1152X, 32E7X, " ", 0X, "!", 0X, 1FX,
    0X, 0X, 0X, 0D554X, "#", 2050X, "&oslash;", 0DBD0X,
    "#", 1D4X, "÷", 0D34X, 32E7X, 0X, 32E6X, 6150X,
    7372X, "e#", 0D43EX, "#", 0D46CX, "#", 5270X, 3131X,
    0X, 0X, 0D4ECX, "#", 0B64X, 3130X, 0X, 0X, 0X,
    0X, 8A0X, 116X, 0DBFCX, "#", 0D43EX, "#", 0D494X,
    "#", 5270X, 3131X, 0X, 0X, 0D4ECX, "#", 0B64X,
    3130X, 0X, 0X, 0X, 0X, 6E0X, 116X, 0DBFCX, "#",
    0D43EX, "#", 0D4A8X, "#", 1B4BX, 3144X, 0X, 0X,
    0D4ECX, "#", 0B64X, 3130X, 0D4C0X, "#", 0D4C0X,
    "#", 2653X, 3144X, 80D0X, 108X, 0D550X, 117X, 0X, 0X,
    0D4D8X, "#", 0D4D8X, "#", 354FX, 3144X, 80D0X,
    108X, 0D550X, 117X, 0X, 0X, 0D4FCX, "#", 625EX, 3131X,
    0D880X, 104X, 0D4ECX, "#", 0X, 0X, 0X, 0X, 0X,
    0X, 0X, 0X, 14X, 0X, 0D51CX, "#", 4C97X, "&otilde;",
    0E290X, 102X, 0X, 0X, 0X, 0X, 0X, 0X, 0X, 0X,
    214X, 314BX, 0D558X, "#", 32D4X, "&oslash;", 0DBD0X,
    "#", 1D4X, "÷", 0D538X, "#", 1D4X, "÷", 0DBCFX,
    "#", 3X, 0X, 10X, 0X, 1D4X, "÷", 0DBBCX, "#", 0X,
    0X, 214X, 314BX   
    	  .source	POINTER	NIL
    	  .textReader	TextModels.Reader	[010156C0H] 
    	  .eot	BOOLEAN	FALSE   
    StdInterpreter.CallProc   [0000047AH] 
    	.a	BOOLEAN	FALSE
    	.b	BOOLEAN	FALSE
    	.c	BOOLEAN	FALSE
    	.i	Meta.Item	
    	  .obj	INTEGER	4
    	  .typ	INTEGER	0
    	  .vis	INTEGER	4
    	  .adr	INTEGER	854006166
    	  .mod	POINTER	[32E60000H]
    	  .desc	POINTER	IllegalAddress000000BCH
    	  .ptr	Meta.ArrayPtr	[0100AD30H] 
    	  .ext	Kernel.ItemExt	NIL   
    	.imported	ARRAY 256 OF CHAR	""

以上が一部です。 -- tonton1225? 2009-05-04 (月) 19:08:10

POSIXlt の bug ?

surg? (2009-05-04 (月) 10:16:35)

質問というよりは報告ですが、strptime() で生成した POSIXlt オブジェクトの length が実際のサイズと関係なく「9」となっています.

> (t <- strptime(paste("1-1-2001 9", 1:20, sep=":"), "%m-%d-%Y %H:%M"))
 [1] "2001-01-01 09:01:00" "2001-01-01 09:02:00"
"2001-01-01 09:03:00"
   略
[16] "2001-01-01 09:16:00" "2001-01-01 09:17:00"
"2001-01-01 09:18:00"
[19] "2001-01-01 09:19:00" "2001-01-01 09:20:00"
> length(t)
[1] 9

そのため、データフレームへの結合で問題が起こります.
同じサイズのデータフレームには結合できません.

> d1 <- data.frame(a=1:20)
> d1$b <- t
以下にエラー `$<-.data.frame`(`*tmp*`, "b", value = list(sec = c(0, 0, 0,  : 
 replacement has 9 rows, data has 20

サイズ9のデータフレームには一応結合できる(warning が出ますが).

> d2 <- data.frame(a=1:9)
> d2$b <- t
> d2
  a                   b
1 1 2001-01-01 09:01:00
2 2 2001-01-01 09:02:00
   略
8 8 2001-01-01 09:08:00
9 9 2001-01-01 09:09:00
Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  壊れたデータフレームです。列が切り詰められるか、または NA 値で埋められます

データフレーム作成時に入れておけば,問題なし.

> d3 <- data.frame(a=1:20, b=t)
> d3
    a                   b
1   1 2001-01-01 09:01:00
2   2 2001-01-01 09:02:00
   略
19 19 2001-01-01 09:19:00
20 20 2001-01-01 09:20:00

ちなみに、as.POSIXlt()を使っても同様.

> (t <- as.POSIXlt(paste("2001-01-01 9:1", 1:20, sep=":")))
 [1] "2001-01-01 09:01:01" "2001-01-01 09:01:02"
"2001-01-01 09:01:03"
 [4] "2001-01-01 09:01:04" "2001-01-01 09:01:05"
"2001-01-01 09:01:06"
   略
[16] "2001-01-01 09:01:16" "2001-01-01 09:01:17"
"2001-01-01 09:01:18"
[19] "2001-01-01 09:01:19" "2001-01-01 09:01:20"
> length(t)
[1] 9
  • オンラインヘルプは見ましたか?
    Details
    There are two basic classes of date/times.
    Class "POSIXct" represents the (signed)
    number of seconds since the beginning of
    1970 as a numeric vector. Class "POSIXlt"
    is a named list of vectors representing
    
    sec
          0-61: seconds
    min
          0-59: minutes
    hour
          0-23: hours
    mday
          1-31: day of the month
    mon
          0-11: months after the first of the year.
    year
          Years since 1900.
    wday
          0-6 day of the week, starting on Sunday.
    yday
          0-365: day of the year.
    isdst
          Daylight savings time flag. Positive if
    in force, zero if not,
          negative if unknown.
    要するに,POSIXlt の要素は9個ということでしょう?
    > t[1]
    [1] "2001-01-01 09:01:00"
    > cat(t[1]$sec,t[1]$min,t[1]$hour,t[1]$mday,t[1]$mon,
    t[1]$year,t[1]$wday,t[1]$yday,t[1]$isdst)
    0 1 9 1 0 101 1 0 0
    何の問題もないように思います(ちなみに,確認した限りでは,R 1.8.1 でも同じく「9」を返します)
    なお,
    Details
    
    Both functions are generic: you can write methods to handle specific
    classes of objects, see InternalMethods.
    とありますので,「必要な length は,自分で書け」といっているような雰囲気?
    単純には,例えば以下のようにすればあなたの要求は満たされる?のかな?
    > length(as.character(t))
    [1] 20
    必要な情報はほとんどオンラインヘルプから得られると思いますよ。 --  ? 2009-05-04 (月) 16:51:27
  • ありがとうございます.コメントがつくとは思ってませんでした :-)
    繰り返しになりますが、私が言いたかったのは「POSIXlt オブジェクトの length() はデータサイズを返さないので、POSIXlt オブジェクトを既存のデータフレームに結合する時は要注意」という事です.それ以上でも,それ以下でもありません.
    まあ、bug というよりは仕様なのでしょうね.
    ちなみに
    > d1 <- data.frame(a=1:20)
    > d1$b <- t
     以下にエラー `$<-.data.frame`(`*tmp*`, "b", value = list(sec = c(0, 0, 0,  : 
      replacement has 9 rows, data has 20
    はダメだけど、
    > d1$b <- data.frame(t)$t
    なら大丈夫.-- surg? 2009-05-04 (月) 20:16:50

expression()でsymbol等が表示できなくなりました

u-kun? (2009-05-01 (金) 16:23:35)

以前にR-2.8.1のですが、R-2.9.0をインストールしてR User Configurationを使用したところ、
expression()でmuや%*%等の表示がwindowsのグラフィックデバイスではできなくなりました。
muはmに%*%は'になってしまいます。
pdfに出力すればちゃんと表示されます。
R-2.8.1に戻しても表示されませんでした。

現在の使用環境はwindows XP sp2でRのバージョンは以下の通りです。

R version 2.9.0 Patched (2009-04-28 r48429) 
i386-pc-mingw32 

locale:
LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;
    LC_NUMERIC=C;LC_TIME=Japanese_Japan.932

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base   

Rの問題ではなく、私の使用環境の問題でしょうか?

  • お騒がせしました。解決しました。R User Configurationでオートで設定したのが問題だったようです。R User Configurationで設定される環境変数R_USERを削除したら元通りになりました。2.9.0 Patchedで問題なくsymbolが表示できています。 -- u-kun? 2009-05-01 (金) 18:10:46
  • 当方でも同じ現象がおきて悩んでいたのですが,どうもRdevga内のフォントの指定においてRのplot math engineが5番目に"Symbol"フォントが指定されると決め打ちしているのに,R User ConfigurationがTT Arialの設定の前にMS Gothicの設定を追加するのが原因のようですね・・・. -- とらぉむ? 2009-06-08 (月) 02:00:27

ヒートマップの目盛りの値の変更について

maori? (2009-04-28 (火) 21:47:55)

初めて質問させていただきます。
過去の質問等をみさせていただいてもよくわからなかったのでよろしくお願いします。
heatmapを書いているのですが、元になる値が(正規化はしています)とても近いので
マップの色が近くて困っています。

heatmapの内容を変えることにより調節できると思うのですが、helpをみてもgoogleで調べても
どうしたら良いか分かりません。

以下が私が入力したコマンドです。

y <- read.table("standarddeviation.txt",header=TRUE,sep="\t",row.names=1)
y_numeric <- apply(y,c(1:2),as.numeric)
y_euclid <- dist(y_numeric,method="euclid")
pdf("standarddeviation_ward4.pdf",paper="special",width=27,height=25,pointsize=25)
heatmap(y_numeric,scale="column",hclustfun= function(y_euclid)  hclust(y_euclid,method="ward"),
  margins=c(30,30),col=cm.colors(256),RowSideColors = rc,ColSideColors = cc,
  cexRow = 0.2 + 1/log10(10), cexCol = 0.2 + 1/log10(10))
dev.off()

よろしくお願いします。

  • standarddeviation.txt がどのようなものであるかわからないので,heatmap の色がどのように「近くなる」のかを追試できません。rc と cc が何なのかも,定義がありません。ちなみに,apply(y,c(1:2),as.numeric) 等としなければならない理由もよくわかりません。また,プログラムの引用なのに,それようの書式(先頭1桁に半角空白をおく。行末にチルダはいらない)で記述されていないので,見にくいほか,RowSideColors?ColSideColors? の後に ? が付いてしまう。(追試できる形でプログラムを添付しましょう。データが膨大になるような場合には,現象を再現できるような,最小限のデータに変えて質問するのが望ましいです) -- 2009-04-28 (火) 22:08:42
  • ↑の方のおっしゃることも尤もですね。整形ルールをちゃんと理解しましょう。ただ、↑さんの言い方も少し冷たいような気が…ところで「?」がつくのはPukiWikiの仕様で、WikiNameと判断されたのだと思います。私の書いたWikiNameにも?がありますよね。
    で、ご質問ですが、help(heatmap)でimageの引数をとることがわかります。scaleに合わせてzlimを指定してはどうですか?
    > x <- matrix(sample(100,200,re=T),ncol=4)
    > range(x)
    [1]   1 100
    > heatmap(x)
    > heatmap(x,zlim=c(0,200))
    こういうことを言っているのでしょうか?でも個人的には、無理やり違うように見せるより、似たままでも十分情報を持つように思います。 -- akira? 2009-04-29 (水) 00:01:00
  • > ↑さんの言い方も少し冷たいような気が…
    今後の質問のことも考えてのアドバイスですけどね。
    上の方の注意書き「回答者は神通力を持ってはいません。「これこれしたが、うまく動きません」といった質問には、あなたの試みたことを回答者が再現できるような、データ、コード、エラー出力(そして、R のバージョン、使用 OS、使用非標準パッケージ名)を添えることをお勧めします。あまりに長くなる場合は適宜編集して下さい。」と同じことを書いただけですが,言葉遣いが気に入りませんでしたか。
    また,質問者の真意を推量して答えたつもりが,全然違ったということもありますしね。まあ,ああいえば,こういう。要するに,自分の回答スタイルに合わないと色々言う人が多いんですね。で,よく,「もう回答するのはよそう」と思うわけです。が,また回答するようになるわけだ。
    zlim では,極端になるだけなので,グレード表示(グラデエーション)が必要ないなら,zlim よりは,col の指定で heat.colors ではないもの(例えば heatmap(x, col=rainbow(1000)) などのように)を使えばいいのでは,と答えれば,あったかい回答でしょうか。
    > ところで「?」がつくのは「PukiWikiの仕様」
    よーく知っています。 -- 2009-04-29 (水) 09:18:15
  • 迅速なコメントありがとうございます。 いろいろ知らないことが多くてすみません。 今出先なので、バージョンは分からないのですがMac OSで4月の初めにRをいれたばかりです。(研究室に行き次第書きこみます) standarddeviation.txtは物質と物質との反応値を示したものを正規化したものなのですが、-0.212,-0.243,-0.232等、近い値が多すぎて、ほとんど真っ赤で波打っています。 helpを参照して上記のように変更してみたのですが、今度はほとんど水色でよく分からなくなりました。近い値が多いのでデータ同士の距離のほんの少しの差異でも色の差異を 大きくしたいのです。 すみません。apply(y,c(1:2),as.numeric)についてですが、研究室のページを写しただけで、heatmapの中に入れる関数が、何を示しているのかいまひとつ分からないので す。けれども、いろいろ教えてくださり、本当にありがとうございます。やってみます!!
  • 追記です。バージョンは
    > sessionInfo()
    R version 2.8.1 (2008-12-22) 
    i386-apple-darwin8.11.1 
    
    locale:
    ja_JP.UTF-8/ja_JP.UTF-8/C/C/ja_JP.UTF-8/ja_JP.UTF-8
    
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base  
    でした。
  • col=rainbow(1000)で大変みやすくなりました。ありがとうございます。

data.frameへのapply適用で数字がis.numeric=FALSEとなる

akira? (2009-04-28 (火) 19:31:45)

いつもありがとうございます。基本的事項で恐縮ですが、理由が良く分かりません。教えてください。

> x <- data.frame("Alpha"=LETTERS[1:3],"Num"=1:3)
> apply(x,2,is.numeric) # x$"Num"がTRUEにならないのはなぜ?
Alpha   Num
FALSE FALSE
> apply(x,c(1,2),is.numeric) # x$"Num"がTRUEにならないのはなぜ?
     Alpha   Num
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE FALSE
> is.numeric(x$"Num") # x$"Num"だけ指定するとTRUE
[1] TRUE
> is.numeric(x$"Num"[1]) # x$"Num"だけ指定するとTRUE
[1] TRUE

となります。
私の環境は

> sessionInfo()
R version 2.9.0 Patched (2009-04-24 r48395) i386-pc-mingw32
locale:
LC_COLLATE=Japanese_Japan.932;LC_CTYPE=Japanese_Japan.932;LC_MONETARY=Japanese_Japan.932;
    LC_NUMERIC=C;LC_TIME=Japanese_Japan.932
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

です。ちなみにWindowsのR-2.8.1 Patched、LinuxのR-2.9.0 patchedでも同じでした。

  • apply の第1引数は array で(the array to be used.),今の場合は apply に データフレーム が渡されるので array に変換されてから評価される。array に評価されるとき,x の 1列目は factor で 2 列目が integer なので,両者を表現できる character array に変換される(array は,全体が同じデータ型でないといけない)。だから,is.numeric の結果はいずれも FALSE になる(だって,本当の型は character なのだから)。
    以下の実行例が参考になるでしょう。
    基本的には apply(foo, 2, bar) は foo が array のときに使うべし。
    foo がデータフレームのときには,sapply(foo, bar) を使うべし。
    なお,data.frame("Alpha"=LETTERS[1:3],"Num"=1:3) というのは,いささか過剰反応で,data.frame(Alpha=LETTERS[1:3],Num=1:3) でよい。x$"Num" も x$Num でよい。 -- 2009-04-28 (火) 21:15:06
    > apply(x,2,class)
          Alpha         Num 
    "character" "character" 
    
    > sapply(x,class)
        Alpha       Num 
     "factor" "integer"
  • なるほど、引数がarrayなのは知っていましたが、今回、意味がよく分かりました。"X"は過剰反応と分かっているのですが、エディターに色付けさせているからなんです。こっちの事情ですみません。 -- akira? 2009-04-28 (火) 23:44:18

添付ファイル: filelmfit3.png 1555件 [詳細] filemmscf_hclust.png 1667件 [詳細] filelong-tail.png 1646件 [詳細] fileoresen.png 1622件 [詳細] filetest.png 865件 [詳細] filelmfit2.png 1609件 [詳細] filefit-nls.png 1691件 [詳細] filespline.png 1638件 [詳細] filejips-law.png 1629件 [詳細] filets-plot2.png 1698件 [詳細] filetokyo01.png 1604件 [詳細] filebarplot_and_legend.png 1650件 [詳細] file2lines-xlab.png 1631件 [詳細] filertnorm.png 1542件 [詳細] filefit.lm.png 1609件 [詳細] fileplot-ca.png 1715件 [詳細] filecluster-name.png 1677件 [詳細] filespline2.png 1692件 [詳細] fileplot.hclust.png 1653件 [詳細] fileVennDiagram.png 1701件 [詳細] filebarplot_and_legend_001.png 1695件 [詳細] filecorresp.png 1652件 [詳細] filets-plot.png 1581件 [詳細] filedendrogram.png 1655件 [詳細] file2lines-labels.png 1650件 [詳細] filemixmix.txt 1633件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1719d)