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

新規投稿はできません


過去の記事のアーカイブ



主成分分析

sumi? (2008-11-15 (土) 12:14:00)

初歩的な質問で大変恐縮です。

主成分分析したものをバリマックス回転、もしくはプロマックス回転するためにはどうしたらよいのでしょうか?

また因子分析を実行しようとすると「これらの初期値からは最適化できません」と出てしまいます。

  • 特に使用環境を添えるのは常識です。sessionInfo() とすればそうした情報が簡単にえられます。 -- 2008-11-15 (土) 12:17:11
  • すみません。はじめて投稿するのでわかりませんでした。 -- sumi? 2008-11-15 (土) 12:23:56
  • R version 2.7.2 (2008-08-25) -- sumi? 2008-11-15 (土) 12:24:41

R version 2.7.2 (2008-08-25) 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 のバージョン、使用 OS、使用非標準パッケージ名)を添えることをお勧めします。 -- 2008-11-16 (日) 12:22:45
  • 対応分析でデータを標準化してbiplotでグラフを作ろうとしても ”計算結果が NaN になりました”の表示がでます。マイナスの数値はダメなんですか? -- 猿並? 2009-01-11 (日) 18:46:05

RのARモデルのAICについて

野沢菜? (2008-11-14 (金) 21:52:52)

お世話になります。

ARモデルのAIC値について質問致します。

どうやらRのARモデルのAIC値は最小モデルの値を0とし、相対値を返して来ていると言うのまでは判ったのですが、それにしても計算が合わないので、困っています。

以下のような実験をしてみました。

まずNileをAR(2)で計算させると

ar(Nile,order=2)

Call:
ar(x = Nile, order.max = 2)

Coefficients:
1 2
0.4081 0.1812

Order selected 2 sigma^2 estimated as 21247


sigma^2を21247と推定してきました。同様にar(Nile,aic=FALSE,order.max=3) とやると、21204 と推定してきます。

ここでAICを求めると、

ar(Nile,order=3)$aic
0 1 2 3
27.8938963 1.3373691 0.0000000 0.7625609


と、AR(2)が最小で0、AR(3)は0.7625609だと言っています。一旦整理します。

AR(2)σ^2 = 21247
AR(3)σ^2 = 21204
AR(2)AIC = 0.0000000
AR(3)AIC = 0.7625609

と言う事なのですが、回帰のAICでlength(Nile)が100なのでAICを計算させて
差をみると

n<-100;si2<-21247;m<-2;

AIC2 <- n*(log(2*pi)+1+log(si2))+2*(m+2)

n<-100;si2<- 21204;m<-3;

AIC3 <- n*(log(2*pi)+1+log(si2))+2*(m+2)

AIC3-AIC2
[1] 1.797413

と、AR(3)AIC = 0.7625609 とは、かけ離れた値になってしまいます。

私は、どこをどう間違っているのか、ご指摘をお願い致します。

  • 特に使用環境を添えるのは常識です。sessionInfo() とすればそうした情報が簡単にえられます。 -- 2008-11-15 (土) 12:16:57
  • 2-100*(log(21247*0.97)-log(21204*0.96)) では? -- asdf? 2008-11-17 (月) 11:14:21
  • AR1:1.3373691->5.337865,AR2:0.0000000->000000,AR3:0.7625609->0.7611347,AR4:2.758->0.7555342 と、こんな風なんです。 -- 野沢菜? 2008-11-19 (水) 11:02:50
  • 2-100*(log(21247*0.97)-log(21204*0.96)) の値はAR(3)AIC = 0.7625609 に近くないですか? -- asdf? 2008-11-19 (水) 16:44:55
  • Order selected 2 sigma^2 estimated as 21247 のように表示されるのは不偏推定量です。AICが使うのは最尤推定量です。 -- asdf? 2008-11-20 (木) 09:39:08

二元配置分散分析の求め方

flyer? (2008-11-11 (火) 15:25:38)

いつもお世話になっています。
以下のようなデータで分散分析を二元配置の対応なしで分散分析を行おうとしたのですが、summary(aov(***))で得られるデータがF値のないものとなります。
収穫量に対しての要因が品種と試験場が存在すると言う設定なのですが、aovの使い方が違うのでしょうか。
よろしくお願いします。



収穫量

[1] 68 70 72 71 73 74 73 74 73 73 72 74 73 71 72 69 71 72 72 69

品種

[1] A1 A1 A1 A1 A1 A2 A2 A2 A2 A2 A3 A3 A3 A3 A3 A4 A4 A4 A4 A4

Levels: A1 A2 A3 A4

試験場

[1] B1 B2 B3 B4 B5 B1 B2 B3 B4 B5 B1 B2 B3 B4 B5 B1 B2 B3 B4 B5

Levels: B1 B2 B3 B4 B5

> summary(aov(収穫量~試験場*品種))

> Df Sum Sq Mean Sq

>試験場 4 8.2000 2.0500

>品種 3 26.8000 8.9333

>試験場:品種 12 22.2000 1.8500

  • 1セルにデータがひとつずつしかないからじゃないですか? Residuals の DF が0ですね. -- ほいささっささ? 2008-11-11 (火) 16:42:47
  • ほいさっさ さんのいうとおり。繰り返しがないから交互作用は検出できない。なのに「試験場*品種」としてしまったのが誤り。「試験場+品種」とすればよいだけ。一般の統計学の教科書にある例題とその例解でチェックしてみましょう。なんでも,機械的にやってはダメです。 -- 2008-11-11 (火) 18:30:08
    > summary(aov(収穫量~試験場+品種))
                Df  Sum Sq Mean Sq F value  Pr(>F)  
    試験場       4  8.2000  2.0500  1.1081 0.39711  
    品種         3 26.8000  8.9333  4.8288 0.01982 *
    Residuals   12 22.2000  1.8500                  
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
  • ほいささっさささん、--さん、ありがとうございました。調べていくうちに乱塊法というのがあるという事がわかり式を変形して答えを出してみました。そしてaovでも「試験場+品種」で出来るとわかりうれしく驚いています。ありがとうございました。 -- flyer? 2008-11-11 (火) 18:45:42
  • ほいささっさささん、--さん、ありがとうございました。調べていくうちに乱塊法というのがあるという事がわかり式を変形して答えを出してみました。そしてaovでも「試験場+品種」で出来るとわかりうれしく驚いています。ありがとうございました。 -- flyer? 2008-11-11 (火) 21:18:55

xtabsとftableで複数の要素を行に入れたい場合

たけ? (2008-11-10 (月) 22:05:27)

下記のようなデータセットで、地点 緯度 経度 年 月の列と各種類の列を持つ表に書き換えたく、xtabsとftableを下記のように実行したのですが、2点問題があり困っております。
1)地点 緯度 経度 年 月全部の組み合わせを出力してしまい、整形が必要ですし、大きなデータになると実行時間がかかりメモリもパンクします。
2)出力されたテーブルは行の値は属性として入った状態になっており、y[3,]などと行を取り出す指定をしても、地点名や緯度経度の入った行の値を取り出すことは簡単にはできません。間を空けずに各行に地点名などの値を格納したいのです。
以上の2点について、xtabsとftableを用いたものでなくても構いませんので、うまい対処方法をご存知の方がいましたらお教え頂ければ幸いです。


x <- read.csv("test.csv")
y <- ftable(xtabs(値~地点+緯度+経度+年+月+種類,x))


データの例:test.csv
 年,月,地点,緯度,経度,種類,値
平成15年,1月,東京,139.766084,35.681382,いちご,10
平成15年,8月,東京,139.766084,35.681382,いちご,20
平成16年,1月,東京,139.766084,35.681382,いちご,10
平成16年,8月,東京,139.766084,35.681382,いちご,25
平成15年,1月,つくば,140.111234,36.082744,いちご,10
平成15年,8月,つくば,140.111234,36.082744,いちご,30
平成16年,1月,つくば,140.111234,36.082744,いちご,10
平成16年,8月,つくば,140.111234,36.082744,いちご,45
平成15年,1月,東京,139.766084,35.681382,みかん,100
平成15年,8月,東京,139.766084,35.681382,みかん,20
平成16年,1月,東京,139.766084,35.681382,みかん,100
平成16年,8月,東京,139.766084,35.681382,みかん,25
平成15年,1月,つくば,140.111234,36.082744,みかん,100
平成15年,8月,つくば,140.111234,36.082744,みかん,30
平成16年,1月,つくば,140.111234,36.082744,みかん,100
平成16年,8月,つくば,140.111234,36.082744,みかん,45
  • 一部,うまく動かない理由が分からない。。なぜ,「みかん」行が取り出せないのだろう。日本語処理の不備か? -- 2008-11-10 (月) 23:05:30
    x <- read.csv("test.csv")
    y <- ftable(xtabs(値~地点+緯度+経度+年+月+種類,x))
    a <- data.frame(y)
    b <- a[a$Freq>0,]
    b[b$地点=="つくば",]
    b[b$緯度=="140.111234",]
    b[b$種類=="みかん",]
  • x <- read.csv("test.csv",encoding="UTF-8") などと, UTF-8環境の場合は必ず明示してあげてみて下さい. FIXMEに取り組む元気がないので... -- なかま 2008-11-11 (火) 00:20:33
  • どんな表がほしいのか良くわからないですが、reshapeパッケージのcast(),melt()やreshape関数を使って作れませんか? -- okinawa 2008-11-11 (火) 08:35:41
    > library(reshape)
    > x <- read.csv("c:/test.csv")
    > colnames(x)[6]<-"variable"
    > colnames(x)[7]<-"value"
    > y<-cast(x)
    > y
           年  月   地点     緯度     経度 いちご みかん
    1 平成15年 1月 つくば 140.1112 36.08274     10    100
    2 平成15年 1月   東京 139.7661 35.68138     10    100
    3 平成15年 8月 つくば 140.1112 36.08274     30     30
    4 平成15年 8月   東京 139.7661 35.68138     20     20
    5 平成16年 1月 つくば 140.1112 36.08274     10    100
    6 平成16年 1月   東京 139.7661 35.68138     10    100
    7 平成16年 8月 つくば 140.1112 36.08274     45     45
    8 平成16年 8月   東京 139.7661 35.68138     25     25
    で、dataframeにするには、
    >z<-data.frame(y)
  • encoding 指定すればちゃんとできた。。。
    factor ==> numeric は自分でやってね -- 2008-11-11 (火) 11:28:38
    > b[b$種類=="みかん",1]
    [1] 東京   つくば 東京   つくば 東京   つくば 東京   つくば
    Levels: 東京 つくば
    > b[b$種類=="みかん",2]
    [1] 139.766084 140.111234 139.766084 140.111234 139.766084 140.111234  
        139.766084 140.111234
    Levels: 139.766084 140.111234
  • あちゃー, encoding壊滅状態かも...SBCSはlatin1で, MBCSはUnicodeとnative, デバイス間はUTF-8でオブジェクトはネイティブ...えっと...わけわからん....(T_T) -- なかま 2008-11-13 (木) 20:39:12
  • お返事遅くなり申し訳ありません、okinawaさん大変スマートな方法ありがとうございます。検索したつもりでしたがwikiにもあったのですね。http://www.okada.jp.org/RWiki/?reshape%A4%C7%A5%D4%A5%DC%A5%C3%A5%C8%A5%C6%A1%BC%A5%D6%A5%EB。またデータフレームからの取り出しと日本語環境の問題提起は大変興味深いです。なかまさん皆さんなにやら課題を提起してしまいすみません(汗)。上達して貢献できるようになるとよいのですが。 -- たけ? 2008-11-19 (水) 20:52:21
  • 色々いじっています。日本語がうまくとおらないですが、 cast(x,...~syurui,mean)などとすれば平均など色々できるのですね。これは便利 -- たけ? 2008-12-16 (火) 16:54:30

rbindするデータフレームの数が多い場合・・・

Shiro? (2008-10-31 (金) 06:56:27)

たとえば、各年のデータを含むデータフレーム、
df.2000, df.2001, df.2002, df.2003, df.2004, df.2005
があるとし、これを以下のようにバインドするとします。
df.all <- rbind (df.2000, df.2001, df.2002, df.2003, df.2004, df.2005)
しかし、もしもバインドしたいデータフレーム数が膨大に増えてくると、書き連ねるのが長くなってしまいます。
そこで、下記のようにデータフレーム名を作成してみました。
period = c(2000:2005)

# データフレーム名の作成
paste("df", period, sep = ".")
[1] "df.2000" "df.2001" "df.2002" "df.2003" "df.2004" "df.2005"
そして、これでは単なるcharacterなので、get関数で下記のようにしてみましたが、うまくいきません。
df.all <- rbind (get(paste("df", period, sep = ".")))
初心者です。調べた結果、pasteで名前を作るまではできたのですが・・・その次のステップでgetくらいしか見つけられず、苦慮しています。お力添えを頂ければ大変ありがたいです。

  • ヒント -- 2008-10-31 (金) 09:12:20
    x <- rnorm(10)
    y <- rnorm(10)
    eval(parse(text="cbind(x, y)"))
    eval(parse(text="12+34"))
  • eval(parse(***))を使う。要はプログラムの文字列を自動的に作って、それを実行する。これは色々応用がきくので覚えていて損は無い。(ただし、文字長に8Kの制限があるので注意) -- 2008-10-31 (金) 09:23:51
    period <-c(2000:2005)
    dfname<-paste("df.", period, sep = "",collapse=",")
    text<-paste("df.all <- rbind (",dfname,")",sep="")
    eval(parse(text=text))
  • こういうのもあり。 -- 2008-10-31 (金) 10:08:40
    df.all <- do.call("rbind",lapply(paste("df", period, sep = "."),get))
  • do.call("rbind",mget(ls(pattern="^df.[0-9]{4}"),envir=.GlobalEnv?)) -- なかま 2008-10-31 (金) 11:19:20
  • すぐに丁寧なコメントを頂いて感激です。とても素晴らしい掲示板ですね。頂いた情報を元に周辺を勉強してみます。どうも有難うございました。 -- Shiro? 2008-11-01 (土) 02:59:09

範囲の指定

tt? (2008-10-31 (金) 02:55:21)

非常に初歩的な質問なんですが、hist()を使うときに、横軸の範囲を指定するにはどうしたらよいのでしょうか?

  • xlim 引数で指定すればよいのでは? -- 2008-10-31 (金) 09:04:09
  • できました。ありがとうございました。 -- tt? 2008-10-31 (金) 09:51:50

R で作る EPS ファイル

 ? (2008-10-29 (水) 21:32:23)

postscript(file, family="Japan1Ryumin") で作る,日本語フォントを含む eps ファイルは,「不正なepsファイルだ」と言われて,Photoshop 等では開くことが出来ません。LaTeX からは \includegraphics でちゃんと挿入できるんですけど。どこかを弄ることで,解決されるのでしょうか。
postscript(file) でローマ字だけのファイルなら,問題は生じません。
Windows, Mac 共に,同じ問題があるようです。

  • Adobe製品ならたとえ読めてもEPSなら普通に崩れるケースも多いでしょう. そういうもんです(Adobe間ですら互換性はありません). PDFなら問題が少ないでしょう. PDFでも問題があるならRのベクターデータを弄る人へが参考になるかもしれません. どうしてもEPSがよろしければ, Adobeのサポート(サポートしておりませんと言われる...)にお問い合わせ下さい.(笑) RではGhostscriptでの互換性を第一(古いのは無理だけど)に作っています. それ以外は費用と労力(OS×Adobe製品×言語数)に見合う価値があるとは思いません. -- なかま 2008-10-30 (木) 10:58:44
  • 回答ありがとうございました。普段はPDFでなんの支障もなく生活しているのですが,(古い?)出版界では,「画像はEPSにしてください」みたいにいわれるので,何か抜け道があるかと思い,お聞きしました。 -- 2008-10-30 (木) 11:34:04
  • PDFでお願いすればたぶん大丈夫なはずです. その場合はRのベクターデータを弄る人へのエンコードの問題に注意すれば受け入れてもらえると思います。 -- なかま 2008-10-30 (木) 13:05:00

Rを用いたランダム効果解析

初心者random? (2008-10-26 (日) 14:24:04)

教えてください。以下のデータ(data01)は、
2元配置の変量モデル(変量因子groupAと変量因子groupB、それぞれ要因化)
における、2つの変量因子のeffectへの影響を解析するものです。

random効果として、groupAおよびgroupBを指定し、関数lme()を用いて解析したいのですが、
random効果の項の設定をうまくできません。

random効果として、
groupA+groupB+groupA*groupB ---(1)
を設定したく考えております。

model<-lme(effect~1,random=***) この部分(***)の設定がわかりません。

これまで、random=~1|groupA, random=~1|groupA/groupBは試みましたが、
(1) groupA+groupB+groupA*groupB 
の設定ができず、質問させていただきました。

よろしくお願いします。

data01

  groupA groupB effect

1 1 1 13.2
2 1 1 11.9
3 1 2 16.1
4 1 2 15.1
5 1 3 9.1
6 1 3 8.2
7 2 1 22.8
8 2 1 18.5
9 2 2 24.5
10 2 2 24.2
11 2 3 11.9
12 2 3 13.7
13 3 1 21.8
14 3 1 32.1
15 3 2 26.9
16 3 2 28.3
17 3 3 15.1
18 3 3 16.2
19 4 1 25.7
20 4 1 29.5
21 4 2 30.1
22 4 2 29.6
23 4 3 15.2
24 4 3 14.8

罫線を点線にしたい

psa? (2008-10-24 (金) 10:24:29)

par(tck=1)でグラフ上に罫線を入れたのですが、その罫線を好きなように変更したいと考えています。たとえば、x軸の10ごとに点線の罫線をいれて、50のところを太い罫線にするようなコンビネーションはどうしたらできますでしょうか?プログラムは以下のようにしています。よろしくお願いいたします。
par(tck=1)
plot(1:100)

  • use 'abline' -- 2008-10-24 (金) 11:35:05
    > plot(1:100)
    > abline(v=0:10*10, lty=3)
    > abline(v=50, lwd=2)
  • 読みたく無い量だけど, マニュアル読みましょう, いっぱいやりかたあるし. plot(1:100,xaxt="n"); axis(1,seq(0,100,by=10),lty="dotted",tck=1); abline(v=50, lwd=2) -- なかま 2008-10-24 (金) 18:10:22

epsファイルの作成

taromaru? (2008-10-23 (木) 16:42:25)

WindowsXP上で、R2.7.2を使っております。epsファイルをRから作ってtexに読み込もうとすると、ghostscriptがうまくビットマップファイルを作ってくれず、dviファイルに図が表示されません。例えば、

 hist(rnorm(100))
 dev.copy2eps(file="temp.eps")


temp.epsというファイルはできますが、tex に読み込んでコンパイルしたあとdviファイルを開くと

Failed to make temp.bmp by the command

というエラーメッセージが出て、dviファイルには図が表示されません。Ghostscriptのヴァージョンは、8.63です。そこで、GSView4.9で temp.eps を開こうとすると、

Unknown in Prolog section at line 34:

 %%IncludeResource: CID fake Bold font HeiseiKakuGo-W5



Unknown in Prolog section at line 71:

 %%IncludeResource: CID font HeiseiKakuGo-W5-EUC-H


(以下省略)

といったエラーメッセージが出て開けません。そこで、

 dev.copy2eps(file="temp.eps", paper="special", onefile=FALSE)


といったオプションもつけてみましたが、結果は同じです。どなたかご教示いただけないでしょうか。

  • gsのインストール時のCJKに関するチェックを選択しなかったのではないですか? lib/cidfmapを手で直すかgsをインストールしなおしてチェックを入れれば大丈夫です. 丁度フォントリソースの設定箇所のメッセージが出てまして, そんなフォントはフォントに知らんと申しております. -- なかま 2008-10-23 (木) 17:37:46
  • どうもありがとうございます。CJKに関するチェックはしています。再インストールしてみましたが結果は同じでした。ちなみに、metafile形式で書き出して、wmf2eps というユーティリティでepsに変換すればうまくいくんですが、この手間を何とか省きたくて質問いたしました。 -- taromaru? 2008-10-23 (木) 17:53:00
  • うーん, 症状からすると, lib/cidmapの中しか思いつきません. フォントをたとえば, dev.copy2eps("hoge.eps" ,family="Japan1Ryumin") とかに変えてみてはいかがでしょうか? いずれにしても, gsの問題だと思います. -- なかま 2008-10-23 (木) 19:42:53
  • おっしゃるとおり、lib/cidfmap の中身をTexWiki? に記載してある内容にしてみたら、うまくいきました。どうもありがとうございました。 -- taromaru? 2008-10-23 (木) 21:15:36

最尤法による最適関数の導出について

Saito? (2008-10-22 (水) 21:35:20)

いつもお世話になっております。
似たような質問、トピックを捜しましたが見当たらなかったため質問させてください。
手持ちのデータに当てはまりそうな関数を自分で作成して、そのパラメータを最尤推定するにはどのようにすればよいでしょうか。例えば、私が今手元に持っているデータは、

a<-rep(0,50)
b<-rep(1:2,length=50)
c<-rep(3:10,length=50)
d<-c(a,b,c)
d2<-as.data.frame(table(d))
d2$Freq<-(d2$Freq)/d2[1,2]
plot(d2$d,d2$Freq)

のような形をしており、これに尤もらしく当てはまりそうな関数として、

f<-function(sig,beta) 1-exp(-(as.numeric(d2$d)/sig)^-(beta))

を関数例として考えました(あんまりいい例ではないかもしれませんが…)。このパラメータsigとbetaの値を最尤推定したいのです。最尤法はもちろん、optim()、mle()、fitdistr()などは勉強したのですが、何か勘違いしているのか他に適切な関数があるのか、中々思うようにいきません。どなたか、ご存知の方がいらっしゃいましたら手法などご教授いただけると幸いです。
なお、環境はWindowsXP、R-2.7.2です。
よろしくお願いいたします。

  • nls は最尤法なんだろうか? -- 2008-10-23 (木) 01:06:20
    > # f<-function(sig,beta) 1-exp(-(as.numeric(d2$d)/sig)^-(beta))
    > a <- rep(0,50)
    > b <- rep(1:2,length=50)
    > c <- rep(3:10,length=50)
    > d <- c(a,b,c)
    > d2 <- as.data.frame(table(d))
    > d2$d <- as.integer(d2$d) # d2 が factor は百害あって一利なし
    > d2$Freq <- (d2$Freq)/d2[1,2]
    > plot(d2$d,d2$Freq)
    > ans <- nls(Freq~1-exp(-(d/sig)^(-beta)), data=d2, start=list(beta=1, sig=1))
    > summary(ans)
    
    Formula: Freq ~ 1 - exp(-(d/sig)^(-beta))
    
    Parameters:
         Estimate Std. Error t value Pr(>|t|)    
    beta   1.5905     0.2278   6.981 6.46e-05 ***
    sig    1.8398     0.1852   9.933 3.79e-06 ***
    ---
    Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 
    
    Residual standard error: 0.07757 on 9 degrees of freedom
    
    Number of iterations to convergence: 8 
    Achieved convergence tolerance: 3.585e-06 
    
    > x2 <- seq(min(d2$d), max(d2$d), length=300)
    > y2 <- predict(ans, newdata=data.frame(d=x2))
    > lines(x2, y2, col="red")
    nls.png
  • ご教授、ありがとうございます。今も調べているのですがおそらく、nls()は各パラメータを微分をして右辺を0にして、連立方程式を解いてそれを最尤推定値としているのではないでしょうか??(付け焼刃の知識なので間違っていましたらご指導お願いします…。) そして、
    > AIC(ans)
    [1] -21.23610
    と返してくれるので、おそらく最尤推定をしてくれているのだとは思うのですが…。他の関数だと違った結果になるのでしょうか…?引き続き試しているのですが、うまくいかないです…。--Saito? 2008-10-23 (木) 10:03:47
  • どうも、みたところ離散的な分布の確率密度関数を求めようとしているように見えます.考え方は一緒なので、たとえば連続な分布関数を持つ正規分布で同様のことをやってみると -- ななし? 2008-10-23 (木) 11:25:37
    > spl <- rnorm(100)    #サンプルを準備、平均0標準偏差1の正規分布
    > sum(dnorm(spl, 0, 1, log=T))    #確率密度を掛け合わせたものが尤度なので、対数を取って合計すると対数尤度
    [1] -144.8611
    > sum(dnorm(spl, 1, 1, log=T))    #平均と標準偏差が異なると尤度は小さくなる
    [1] -198.297
    > sum(dnorm(spl, 1, 2, log=T))    #平均と標準偏差が異なると尤度は小さくなる
    [1] -187.8094
    #この(対数)尤度を最大にするのが最尤法
    > eval_fn <- function(x, spl){
    +     m <- x[1]
    +     sig <- x[2]
    +     -sum(dnorm(spl, m, sig, log=T))    #optimは最小化なので「-」マイナスをつける
    + } #平均と標準偏差をパラメータにした関数を定義する
    #x[1]が平均、x[2]が標準偏差、splはサンプル
    > eval_fn(c(1,1), spl)
    [1] 198.297
    > optim(c(1,1), eval_fn, lower=c(-Inf, 0.001), method="L-BFGS-B", spl=spl)
       #標準偏差は正の実数なので小さな実数を下限にする
    $par
    [1] -0.03435954  1.02867148    #1番目が最尤法で求められた平均、2番目が標準偏差
    
    $value
    [1] 144.7206    #尤度関数の値、マイナスをつけたので正になっている
    
    $counts
    function gradient 
          30       30 
    
    $convergence
    [1] 0
    
    $message
    [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
    
    > mean(spl)
    [1] -0.03435954    #実際のサンプルの平均、まったく同じ
    > sd(spl)
    [1] 1.033853    #標準偏差、最適化の精度の関係で若干上の数値が違う
  • 同様のことをSaitoさんの例で行うと -- ななし? 2008-10-23 (木) 11:58:21
    > a<-rep(0,50)
    > b<-rep(1:2,length=50)
    > c<-rep(3:10,length=50)
    > d<-c(a,b,c)    #これがサンプル
    > f<-function(x, spl){
    +     sig <- x[1]
    +     beta <- x[2]
    +     -sum(log(1-exp(-(spl/sig)^-(beta))))
    + }
    > f(c(1.5,1.5), d)
    [1] 129.5854
    > optim(c(1.5,1.5), f, lower=c(0.001, 0.001), method="L-BFGS-B", spl=d)
    $par
    [1] 17.294329  5.655511
    
    $value
    [1] 1.433712e-09
    
    $counts
    function gradient 
          27       27 
    
    $convergence
    [1] 0
    
    $message
    [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
    
    と、一応何か答えは出ました.

    が、sigが大きくなると、確率密度関数がどんな観測値に対しても1を返すようになるのでsigは際限なく大きくなっていきます.関数形にどうも問題が・・・?これがうまくいかないということなのかな・・・

  • 指数分布だと -- ななし? 2008-10-23 (木) 12:46:01
    > f2<-function(x, spl){
    +     ramda <- x[1]
    +     -sum(log(ramda*exp(-ramda*spl)))
    + }
    > f2(c(1.5), d)
    [1] 530.1802
    > optim(c(1.5), f2, lower=c(0.001), method="L-BFGS-B", spl=d)
    $par
    [1] 0.3807116
    
    $value
    [1] 294.8573
    
    $counts
    function gradient 
           8        8 
    
    $convergence
    [1] 0
    
    $message
    [1] "CONVERGENCE: REL_REDUCTION_OF_F <= FACTR*EPSMCH"
    
    > hist(d)
    > plot(d, 0.38*exp(-0.38*d))
  • ななしさんありがとうございます。素晴らしい回答で、逆に理解に時間がかかっていますが、少し整理させてください。 まずnls()とoptim()の違いなのですが、得られたパラメータの値が違っています。何故こんなにも推定値が違うのでしょうか…?(optim()では発散してしまった??)ちなみに私の分野ではx軸はいくつかのxの値(実験で得られるデータは連続です)をまとめてしまって(離散値となります)ヒストグラム化し、そのヒストグラムに合う尤もらしい関数を求めます。このような場合、どちらの関数を使うのが適切なのでしょうか…?(それこそ、nlsとoptimの計算方法を調べないといけないのでしょうか) そしてnls()とoptim()で得られた尤度でAICを求めて、それぞれ比較することは可能なのでしょうか…?モデルが一緒だから構わないようにも思うのですが、この場合はどうなるのか調べてもわからなかったもので…。(例えばglm()とglmmML()では単純に比べられないようですが…。)

すみません、長くなりましたが私が最初やりたかったことはほとんど解決しています。ただ残る疑問として上記をまとめますと、 1.nls()とoptim()での違いは何か?別々の値が推定された場合どのように解釈すればよいのか? 2.xが離散値の場合、どちらが適切なのか? 3.2.でどちらでもよいというような場合、AICを用いてnls()とoptim()間でモデル選択を行うことはやってもよいのか?? です。ご教授いただければ幸いです。

ちなみに私がうまくいかないといっていたのは、functionの中身でsplに相当する部分をを変な組み込み方にしていたため、値が返ってこないというものでした。要はoptim()を理解できていなかったため起こったようです。-- Saito? 2008-10-23 (木) 13:05:17

非アルファベット・数字のソート

R初心者? (2008-10-22 (水) 18:41:13)

以下のような例は,どういう事になっているんでしょうか。UTF-8 だと,その順序だよと言うことでしょうか。

> sort(c("青", "赤", "黄", "緑", "紫"))
[1] "紫" "緑" "赤" "青" "黄"

日本語の読みの順序でソートするにはどのようにしたらよいでしょうか。自分で関数を書かないといけませんか?

> sessionInfo()
R version 2.8.0 Patched (2008-10-20 r46764) 
i386-apple-darwin9.5.0 

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     

です。なんとなく予感がして,UNIX上のR-1.8.1(sessionInfo がありません(^_^;)だと,

> sort(c("青", "赤", "黄", "緑", "紫"))
[1] "黄" "紫" "青" "赤" "緑"
> Sys.getlocale()
[1] "ja_JP.EUC/ja_JP.EUC/C/C/ja_JP.EUC/C"

なるほど,なんとかできるのかな?

  • LC_COLLATEの値によって変化します. LANG=C R -q -e 'sort(c("A","a"))' 等として, en_USとCを比べてみましょう(これは結構みなさん知らないでしょ?). 読みがなでのソートは形態素解析エンジンに渡せば仮名をとりだせるのでそれを頼りにソートしましょう. 基本的にロカールの*実装*に依存してしまうので, 最終的に泥くさい方法になります. UTF-8の場合はたまたま仮名が隣接しているので仮名に直す作業が重要になりますね. -- なかま 2008-10-22 (水) 20:54:38
  • kakasiとかを使って「よみ」に変換してソートいう手もあります。参考:日本語化掲示板#dc63b279 -- 谷村 2008-10-22 (水) 20:51:53
  • 大仰で恐縮ですが,お遊びということで -- ishida 2008-10-23 (木) 07:43:22
    kanji <- c("黄","紫","青","赤","緑")
    x <- paste(kanji, collapse = " ")
    write(as.character(x), file = "hoge.txt" )
    library(RMeCab)
    y <- RMeCabText("hoge.txt")
    yomi <- character(length(y))
    for(i in 1:length(y)){
     yomi[i] <- y[[i]][9]
    }
    kanji[order(yomi)]
     [1] "青" "赤" "黄" "緑" "紫"
    file.remove("hoge.txt")
     [1] TRUE
  • おぉ、石田先生、RMeCab?を作られたのですか!しばらく隠遁している間にRはどんどん進歩していたのだなと実感いたします。 -- 谷村 2008-10-23 (木) 11:34:37
  • とりあえず動く程度のものをここあるいはここに公開しております.マニュアルがとてもいい加減なので,使い方が分かりにくいのですけど. -- ishida 2008-10-23 (木) 12:04:19

SVR(support vector regression)をipopソルバーで実装する方法

tottori? (2008-10-20 (月) 03:08:30)

SVMの回帰への拡張であるSVRをkernlabパッケージにあるipopソルバー(Quadratic Programming Solver)を用いて解きたいと考えています。
分類(通常のSVM)の場合にはhelp(ipop)の例のように

H <- kernelPol(rbf,x,,y)
c <- matrix(rep(-1,m))
A <- t(y)
b <- 0
l <- matrix(rep(0,m))
u <- matrix(rep(C,m))
r <- 0


と指定することで動きますが、回帰の場合にはどのように指定すればよいか分かりません。ラグランジュ乗数が分類の場合と異なった形で出てくるため、自分なりに試行錯誤しましたが解決できませんでした。

kenlabに関する文献「kernlab – An S4 Package for Kernel Methods in R」のipopに関する記述の最後に[This optimizer can be used in regression, classification, and novelty detection in SVMs]とあり、回帰問題にも用いれると考えているのですが…

アドバイスを頂きたいです。
よろしくお願いします。

  • ksvm関数の説明のページにregressionのサンプルがあるのだけれども、それじゃだめなのかなとか思ったり思わなかったり -- ななし? 2008-10-20 (月) 15:07:16
    ## regression
    # create data
    x <- seq(-20,20,0.1)
    y <- sin(x)/x + rnorm(401,sd=0.03)
    
    # train support vector machine
    regm <- ksvm(x,y,epsilon=0.01,kpar=list(sigma=16),cross=3)
    plot(x,y,type="l")
    lines(x,predict(regm,x),col="red")
  • お返事ありがとうございます。 ただ、定式化の部分をいじりたいと考えているので(例えばサンプルごとにCostやepsilon(tube)を変えるなど)ksvmでなくipopで実装が可能か教えて頂きたいです。 -- tottori? 2008-10-20 (月)17:00:20

flicker雑音

kd? (2008-10-16 (木) 10:23:37)

flicker雑音をRで生成する良い方法はあるでしょうか? (それとも,アルゴリズムを考えて書き下す方法しかないでしょうか?

C言語のプログラムの中身

C言語のプログラムの中身? (2008-10-15 (水) 15:44:22)

isoMDSという関数を改良したくて,中身を見たのですが,その中で



  on.exit(.C(VR_mds_unload))
  .C(VR_mds_init_data, as.integer(nd), as.integer(k), as.integer(n), 
      as.integer(ord - 1), as.integer(order(ord) - 1), as.double(y), 
      as.double(p))
  tmp <- .C(VR_mds_dovm, val = double(1), as.integer(maxit), 
      as.integer(trace), y = as.double(y), as.double(tol))


という部分がありました.調べた結果,「.C()」はC言語のプログラムを呼び出すものということが書かれていましたが,この中身,すなわちVR_mds_init_dataなどの中身を知りたい場合はどうすればよいのでしょうか?

よろしくお願いします.

  • 必要な関数を探す gonzui -- 2008-10-16 (木) 12:00:00
  • この関数はMASSライブラリの関数.MASSライブラリはVRパッケージに含まれているので、そのソースをダウンロード<http://cran.r-project.org/src/contrib/VR_7.2-44.tar.gz>.その中のMASS.cにあります. -- ななし? 2008-10-17 (金) 13:04:44
  • 返信遅れて申し訳ありません。gonzuiさん、ななしさん、助かりました!ありがとうございます。 -- きゅう? 2008-10-22 (水) 12:12:39

下限値を0に固定してプロット

ぬえ? (2008-10-12 (日) 07:17:22)

散布図行列を描くときに、軸の下限値を0に固定(上限値は自動設定)って可能のなのでしょうか。
パラメータごとに値のレンジがかなり違うので、単純にxlim、ylimを指定するだけでは上手くいきません。

たぶん、xlim=range(x)というような処理がどこかでされてるんだと思うので
それをxlim=range(c(0,x))に変えられたらいいんですけど。

  • xlim=c(, max(x)) でよいのでは? -- 2008-10-12 (日) 08:58:51
  • pairsでプロットしてるときに、x1?とx2?をプロットした図とx[[]1]とx3?をプロットした図のxlim、ylimを別個に指定したいんです。 -- ぬえ? 2008-10-12 (日) 13:10:27
  • max(x[[1]])=5、max(x[[2]])=150といったデータなので、max(x)ではつぶれてしまって分からなくなるプロットが出来てしまいます。 -- ぬえ? 2008-10-12 (日) 13:25:09
  • やっぱし、mfrowとかで分割して一つづつ描くしかないんでしょうか… -- ぬえ? 2008-10-14 (火) 00:47:16
  • pairs.default を使うと言うことでよいかな?関数を読んで修正すればよいと思うのだが。たとえば以下のようなことで満足するのかな?pairs.default の74行目辺りだ。 -- 2008-10-14 (火) 10:57:14
           localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE, 
               type = "n", ...)
    を
           localPlot(x[, j], x[, i], xlab = "", ylab = "", axes = FALSE, 
               type = "n", xlim=c(0, max(x[,j])), ylim=c(0, max(x[,i])), ...)
    に
  • ありがとうございます、バッチリです!既存の関数を書き換える、って発想が抜けてました…。勉強になりました。 -- ぬえ? 2008-10-14 (火) 13:16:37

構文チェックの方法

syou6162? (2008-10-10 (金) 23:21:52)

Rのコマンドラインオプションなどで構文チェックをする方法はないでしょうか?R --helpやR CMDのほうのヘルプなども一通り見てみましたが、見つけることができませんでした。

Rubyで言えば
$ ruby -c hoge.rb
のようなものを考えています。

  • こんなのかなぁ -- なかま 2008-10-11 (土) 23:15:25
    $ R -q -e 'is.expression(try(parse(file=commandArgs(trailingOnly=T)),silent=T))' --args hoge.R
  • おお。すごい。さすが。お願いすることが出来ればですが,これを実現するための新たなオプションの創設と,gui (Rコンソール)からも出来るような関数があると。。。 -- 第三者? 2008-10-12 (日) 09:01:42
  • parse()がそもそもそれじゃないの? -- okinawa 2008-10-12 (日) 09:22:39
  • やはり-cオプションのようなものはないのですね。parseで解決しました。ありがとうございます。 -- syou6162? 2008-10-12 (日) 22:06:50

データフレームのマッチング

Lee? (2008-10-09 (木) 05:55:27)

おそらく非常に簡単にできるのではないかとは思うのですが、検索のキーワードが下手なせいか、適切な関数なり手段なりを見つけることができず、困っております。ご教示頂けたらとても助かります。

下のような2つのデータフレームにおいて、df.A のColumn1の値 (数字もしくは文字列) に一致するものをdf.B のColumn1からピックアップし、それに対応するdf.BのColumn2の値を、df.Aの横に加え、新たなデータフレームを作成したいのです。ここで、df.AのColumn1には、a, b, c, d が複数含まれますが、df.BのColumn1には、a, b, c, d, e, …はそれぞれ1つしかない、すなわち、1対1対応になっています。ただし、df.Aには含まれない g, h, …等もdf.Bには含まれます。
たとえば、df.AのColumn1は日付、Column2はその日に採取した複数のデータだとします。そして、df.BのColumn1とColumn2はそれぞれ日付とその日の降雨量だとします。そうすると、日付から降雨量のデータをピックアップして、その日に採取したデータとの関係を見るためのデータフレームを作成したい、ということになります。

df_A df_B

	Column1	Column2			Column1	Column2

Row1 a 5.5 Row1 a 102
Row2 a 2.6 Row2 b 203
Row3 a 3.2 Row3 c 302
Row4 a 5.6 Row4 d 202
Row5 b NA Row5 e 102
Row6 b 6.3 Row6 f 301
Row7 b 10.2 Row7 g 602
Row8 c 3.9 Row8 h 302
Row9 c 5
Row10 a 6
Row11 c NA
Row12 d 8.2
Row13 d 2.9
Row14 b 3.5
Row15 a 6.2
Row16 d 4.6
以下続く

新df

	Column1	Column2	

Row1 a 5.5 102
Row2 a 2.6 102
Row3 a 3.2 102
Row4 a 5.6 102
Row5 b NA 203
Row6 b 6.3 203
Row7 b 10.2 203
Row8 c 3.9 302
Row9 c 5 302
Row10 a 6 102
Row11 c NA 302
Row12 d 8.2 202
Row13 d 2.9 202
Row14 b 3.5 203
Row15 a 6.2 102
Row16 d 4.6 202
以下続く

  • すみません、データフレームが見づらいので書き直します。 -- Lee? 2008-10-09 (木) 05:57:53
  • すみません、データフレームが見づらいので書き直してみます。 -- Lee? 2008-10-09 (木) 05:59:33
  • df.A df.B 新df -- Lee? 2008-10-09 (木) 08:00:12
  • この例なら
    df.A[[3]] <- df.B[df.A[[1]],2]
    で済みますが……。 -- 中澤? 2008-10-09 (木) 10:41:44
  • 実際のデータはもう少し複雑でしたが、どうやらこれでうまくいきそうです。ここまですぐにできるとはちょっと衝撃的でした。大変ありがとうございました。 -- Lee? 2008-10-10 (金) 01:40:47

作業スペースの保存

tt? (2008-10-08 (水) 16:31:54)

作業スペースの保存を実行すると、

以下にエラー gzfile(file, "wb") : コネクションを開くことができません

追加情報:  Warning message:

In gzfile(file, "wb") :

 圧縮されたファイル 'C:\Documents and Settings/…


とでできて保存できません。
どうしたらよいのでしょうか?

  • C:\ ? バックスラッシュを使ってるんですか?バックスラッシュなら二本重ねないといけないのでは?スラッシュ / をお使いなさい -- 2008-10-08 (水) 16:34:52
  • 解決しました。ありがとうございました。 -- tt? 2008-10-08 (水) 16:42:14

Rcmd BATCH file.Rでplot表示を残すには?

ISHIMARU? (2008-10-08 (水) 16:25:40)

R-2.7.2をWindows XPで使用しています。
たとえば、a.Rというファイルにplot(1:5)と記載して、Rcmd BATCH a.Rと実行しても、
グラフが表示されず(残らず)、何事もなかったかのように終了してしまいます。
表示を残す方法があるのでしょうか。
初級Q&A アーカイブ(4) の「R CMD BATCHの使い方」を参考にして、
.Rprofileにlibrary(grDevices)と記載もしてみましたがだめでした。
よい方法がありましたらご教授ください。

  • グラフをファイルに書き出すための方法を取らないとだめでしょう。このページの目次の22番目辺りに「plot図の保存方法について」というのがありますけど?違いますか? -- 2008-10-08 (水) 16:38:00
  • そうでしたか…。ご教授ありがとうございました。 -- ISHIMARU? 2008-10-08 (水) 16:45:03
  • それにしても、なぜRCMD BATCHを使おうとしているのか気になります。よろしかったら教えてください。 -- okinawa 2008-10-08 (水) 18:55:35
  • Perlスクリプトでfile.Rを吐き出した後、同じスクリプト内でsystem("Rcmd BATCH file.R")を実行させようと考えました。gnuplotだとグラフ表示まで出来たものですから・・・。 -- ISHIMARU? 2008-10-08 (水) 19:21:17
  • ローカルでやられるのなら、RCMD BATCHではなくRterm.exe とか Rgui.exeをperlから直接起動してみたらいかがですか?.Rprofile内にR起動時に呼び込むコードを書いておけばいいと思います。 -- okinawa 2008-10-09 (木) 09:14:06
    .Rprofile (Rterm.exe や Rgui.exeとおなじところにおく)
    library(graphics)
    library(grDevices)
    source("c:/a.r")
  • いちいち .Rprofile を弄るのも大変ですし。perl 使いじゃなくて awk 使いなので,以下のようにすればよいのでしょう?pdf 関数は例と言うことで。 -- 2008-10-09 (木) 14:32:52
    BEGIN {
    	out = "a.R"
    	print "pdf('a.pdf', width=5, height=4)" > out
    	print "hist(rnorm(1000))" > out
    	print "dev.off()" > out
    	close(out)
    	system("R --vanilla --slave < a.R")
    }
    これを,gawk -f a.awk のように呼び出す
  • ご教授いただきありがとうございました。.Rprofileを書き換えRtermとRguiの双方を検証してみました。結果は・・・大成功でした!。特にRtermの方がグラフのみが線画され、シンプルで若干起動も早いようにも感じました。また、2つ目の方法も大きなヒントになりました。書かれたスクリプトの後にperl(汗)なら、system("cmd /c a.pdf")とすれば、一連の動作でグラフを確認できるのですね。本当にありがとうございました。 -- ISHIMARU? 2008-10-09 (木) 18:23:37

Windows版Rで,UTF-8が文字化けしない?

? (2008-10-07 (火) 14:26:12)

現在TechnoratiのAPIでブログの記事を引っ張ってきて,RMeCab?等を用いて計量テキスト分析,というのに挑戦しています。
RMeCab?に通す段階で,不可解な現象に出会い,困惑してしまいました。
APIの返り値はUTF-8なのですが,それがなぜかCP932のR上で文字化けせずに表示されてしまいます。
つまり,

text1 # APIで取得したテキスト
[1] "日本語" # 文字化けしない

(text2 <- "日本語") # R上で付値
[1] "日本語" # 当然化けない

text1 == text2
[1] FALSE

(iconv(text1, "UTF8", "CP932") == text2 # 明示的に変換
[1] TRUE

となります。変換せずそのままRMeCab?に突っ込んだところ,「正しく」文字化けして返ってきました。
ということで,この問題自体は解決しているのですが,根本的な原因がわかりません。
なぜこのようなことが起こるのでしょうか?
(変な言い方ですが)ちゃんと化けてくれたほうがありがたいのですが,そのように設定することは可能でしょうか?
不明瞭な質問で申し訳ないのですが,よろしくお願いします。
環境は以下です。そのほか,設定はなにもいじっていません。

sessionInfo()
R version 2.7.2 (2008-08-25)
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] RMeCab_0.61 XML_1.96-0
loaded via a namespace (and not attached):
[1] tools_2.7.2

  • 今は, Unicode化に向けての過渡期ですので, そのような事が出来ます. charToRaw?等でヘキサで確認してiconv等を使えば良いでしょう. 設定でOn/Offしたりは出来ません. -- なかま 2008-10-07 (火) 15:36:02
  • ありがとうございます。charToRaw?は知りませんでした。エディタから日本語を含んだ命令を実行すると化けるのも,Unicode化に伴うものでしょうか(essでは問題ないので気にしていませんが)。Rの現在進行形な部分に触れられたことは少しうれしかったりします。 -- ? 2008-10-07 (火) 17:14:28
  • Unicode化に伴う違う部分の不整合です. -- なかま 2008-10-07 (火) 17:58:20
  • 了解しました,ありがとうございます。 -- ? 2008-10-07 (火) 18:36:34

正規表現にマッチした部分の取り出し

うち? (2008-10-06 (月) 20:55:07)

grep(, value=T)で試してみましたが,マッチした文字列全体が返されてしまいます。正規表現にマッチした部分のみを取り出すには,どのようにしたら良いか御教示いただけないでしょうか。substring()を正規表現で制御するようなイメージです。

> # /に挟まれた数字のみ抜き出したいが...
> grep("(?<=/)\\d*(?=/)", c("2007/1/1","2007/2/2", "2007/12/31"), value=T, perl=T) 
[1] "2007/1/1"   "2007/2/2"   "2007/12/31"
  • 私の環境では上のコードはエラーになりました。sub(".*\\/(.*)\\/.*","\\1",c("2007/1/1","2007/2/2", "2007/12/31"))ということですか? -- akira? 2008-10-06 (月) 21:42:38
  • 私の環境を明記するのを怠ってしまい,失礼しました。OSはWindows XP SP3です。拡張正規表現が不勉強なので手持ちの参考書にあった記法で書いてperl=Tとしたら,/で挟まれた部分にマッチした様でしたので上記のように投稿しました。
    > sessionInfo()
    R version 2.5.1 (2007-06-27) 
    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"  
    [7] "base"     
    akiraさんのご回答をコピペしたら,意図通りの動作をしました。ありがとうございます。sub()の使い方を勉強します。 -- うち? 2008-10-06 (月) 22:09:15
  • \\1でマッチングされた()内のパターンを示すことができるのですね。本Wikiの正規表現Tips紹介に書いてあることですが理解できていませんでした。もう一つ質問で申し訳ないのですが,\\/はどういう動作をするのでしょうか,今回の例では/の前の\\を外しても同じように動作します。/はメタ文字では無いですよね。
    > sub(".*\\/(.*)\\/.*","\\1",c("2007/1/1","2007/2/2", "2007/12/31"))
    [1] "1"  "2"  "12"
    > sub(".*/(.*)/.*","\\1",c("2007/1/1","2007/2/2", "2007/12/31"))
    [1] "1"  "2"  "12"
    • うち? 2008-10-07 (火) 09:11:38
  • 我々年寄りは, sedなりawkなりで正規表現(セパレータが'/')を覚えたので脊髄反射でパターンを書いてしまいます. 閑話休題, エスケープ文字の後がエスケープされる物でなければそのエスケープは無視して処理が継続されます. したがってこの場合の結果は, '\\/'は'/'と等価と言うことになります. -- なかま 2008-10-07 (火) 13:54:01
  • ご回答ありがとうございます。疑問が解けてすっきりしました。 -- うち? 2008-10-07 (火) 18:17:18

xtabで得たテーブルをdataframe化する

ssamu? (2008-10-06 (月) 05:17:40)

こんにちは、お世話になります。
今までもっぱら文系の道を歩んできましたが、将来の研究のため統計ソフトの操作を身につけようと頑張ることにしました。
初歩的な質問で大変恐縮ですが、xtab関数を使用して得た結果を通常のdata.frameのように操作することってできますか?
(もしくは、data.frame形式に変換できないでしょうか?)
[,2]のように指定して列を切り出したり、という操作。

例えば、LanguageRのパッケージの中にあるwarlpiriというデータから

xtabs(~Speaker+CaseMarking?, data = CaseMarking?)
TABLE1=xtabs(~Speaker + CaseMarking? , data = CaseMarking?)



の様に集計を行ったとして、この「TABLE1」を再利用/加工したいのですが…。

間接的な回答でもご教示いただけると非常にありがたいです。

  • table2 <- data.frame(TABLE1) 呈示されたプログラム断片にミスがある。直すべし。 -- 2008-10-06 (月) 08:26:03
  • 変数への挿入は = ではなく <- にすべし。関数の引数の = と間違えるため。 -- 2008-10-06 (月) 09:21:36
  • 「変数への挿入は = ではなく」→「変数への代入は = ではなく」にすべし.変数へのassignmentの日本語訳に「挿入」は推奨されない.付値・割り当てと訳される場合もある. -- 2008-10-06 (月) 16:20:34
  • 「table2 <- data.frame(TABLE1)」では、質問者がやりたいことは出来ないんじゃないかな?答える前に確認すべし. -- 2008-10-06 (月) 16:48:54
  • TABLE2<-as.data.frame(TABLE1) -- 2008-10-06 (月) 18:35:22
  • > 答える前に確認すべし ごもっとも。しかしまあ,何がやりたいのかわからなかったので -- 2008-10-06 (月) 22:09:26
  • 迅速な回答、ありがとうございます!(xtabの構造のため?)やや体裁が変わってしまいますが、データの操作はas.で可能になりますね。 -- ssamu? 2008-10-06 (月) 22:25:51

同じ内容のデータを複数回とってあり、その回数を変数としてあるデータ

やぼてん? (2008-10-04 (土) 16:19:23)

お世話になります。<R本読むだけ>から、ようやく<Rを使いはじめた>に状態levelを変えつつある初心者です。つぎのような重複データの処理がわからず困っています。

個体ごとに、生きている葉の数と死んでいる葉の数が数えあります。その結果、変数として、NO(=個体番号)、TREAT(=処理濃度(%))、D_or_A(=生死(0か1))、NO_LEAF(=葉の数)の4つが得られています。データは,たとえば

32 15 0 12
32 15 1 7
33 50 0 8
33 50 1 18
というものになります。

分かりたいのは、生きている葉の数、死んでいる葉の数をどのようにすれば解析中に入れられるのかということです?

glm(D_or_A ~ TREAT, binomial, weight=LEAF_NO)
としてもうまくいきませんでした。

よろしくお願いします。

  • データフレームは,一ケース1行で表した方が良いと思う。。。個体番号,濃度,生きている葉の数,死んでいる葉の数 -- 2008-10-04 (土) 23:02:14
    32 15 12 7
    33 50 8 18
  • この分析がどういうことをやろうとしているのかちょっとわからないため(投資理論とか計量経済にしか土地勘がありませんので)、的を得たコメントではないかもしれませんが
    > xy <- data.frame(NO=32, TREAT=15, D_or_A=0, LEAF_NO=12)
    > xy <- rbind(xy,c(32, 15, 1, 7), c(33, 50, 0, 8), c(33, 50, 1, 18))
    > res_glm <- glm(D_or_A ~ TREAT, binomial, weight=LEAF_NO, data=xy)
    > res_glm
    
    Call:  glm(formula = D_or_A ~ TREAT, family = binomial, data = xy, weights = LEAF_NO) 
    
    Coefficients:
    (Intercept)        TREAT  
       -1.11754      0.03857  
    
    Degrees of Freedom: 3 Total (i.e. Null);  2 Residual
    Null Deviance:      61.83 
    Residual Deviance: 57.1         AIC: 61.1 
    となって、一応エラーは出ずに済んでいるみたいですね.どのあたりが「うまくいきませんでした」なのかが、回答してくださる方が知りたいところなのかも!!?ただこの方法だと「生きている葉の数、死んでいる葉の数をどのようにすれば解析中に入れられるのか」ということでは、説明変数に入っているわけではないですね.これが「うまくいっていない」ということなのでしょうか・・・? -- ichigo? 2008-10-06 (月) 13:26:33
  • アドバイスありがとうございます。   ”Rによる医療統計学”では11章、ロジスティック回帰分析のところには、二つのデータ型に対する分析法がしめされています。一つは始めの方がご教示くださったデータ型で、もう一つは私が示したデータ型(非説明変数が0と1の二値からなる)です。どちらもロジスティック回帰なのでしょうが、私には、前者はproportionデータの分析という感じで、後者が狭義のロジステイック回帰という印象です。 さて、前者ですと、確かにweights(私がweightとしていたのはsが抜けていて誤りでした)オプションは有効です。”Rによる医療統計学”p181にその例が次のように示されています。 glm.hyp <- glm(prop.hyp ~ smoking + obesity + snoring, binomial, weights=n.tot) # prop.hyp はある現象が起きた割合で、n.totが観察数です。 これをまねて、質問いたしましたモデルを0と1のバイナリーデータにたいして、weightsオプションを加えてみた次第です。もし、バイナリーデータに対してはうまくいかないのなら、始めにご教示下さった方が書かれた形にデータを作り直さねばなりません。でも、なんとか、いまのデータ型ですましたいです。私のようなデータを持つ人もいるのではないでしょうか。  ichigoさんご教示ありがとうございます。ichigoさんが出された結果についてですが、もし私が読み間違っているのなら申し訳ないのですが、私には、weightsオプションが働いていないように思えるのです。 というのは、Degree of freedomが3になっていて、データの数が12+7+8+18=45を反映していないみたいだからです(degree of freedomは44になるはず??)。 いかがなものでしょうか? -- やぼてん? 2008-10-06 (月) 16:24:22
  • 私は統計学の専門家ではありませんし、医療関連のデータを扱ったことはありませんので、そのあたりを考慮に入れてみていただければと思いますが、確かに私も自由度が3というのは気になっていました.そこで、まったく同様のことをおこなうであろうデータを作ってみて同様のロジスティック回帰を行ってみました.
    > xy2 <- matrix(as.matrix(xy[1,1:3]),xy[1,4], 3, byrow=T)
    > xy2 <- rbind(xy2, matrix(as.matrix(xy[2,1:3]),xy[2,4], 3, byrow=T))
    > xy2 <- rbind(xy2, matrix(as.matrix(xy[3,1:3]),xy[3,4], 3, byrow=T))
    > xy2 <- rbind(xy2, matrix(as.matrix(xy[4,1:3]),xy[4,4], 3, byrow=T))
    > xy2 <- data.frame(xy2)
    > colnames(xy2) <- c("NO", "TREAT", "D_or_A")
    > res2_glm <- glm(D_or_A ~ TREAT, binomial, data=xy2)
    > res2_glm
    
    Call:  glm(formula = D_or_A ~ TREAT, family = binomial, data = xy2) 
    
    Coefficients:
    (Intercept)        TREAT  
       -1.11754      0.03857  
    
    Degrees of Freedom: 44 Total (i.e. Null);  43 Residual
    Null Deviance:      61.83 
    Residual Deviance: 57.1         AIC: 61.1 
    結果は、自由度の行以外まったく同じでした.これを見る限り先の【res_glm】の場合においても「weights」引数はきちんと機能しているようにも見えます.そして
    > xy3 <- data.frame(NO=32, TREAT=15, D_or_A=7/19, LEAF_NO=19)
    > xy3 <- rbind(xy3, c(33, 50, 18/26, 26))
    > res3_glm <- glm(D_or_A ~ TREAT, binomial, weights=LEAF_NO, data=xy3)
    > res3_glm
    
    Call:  glm(formula = D_or_A ~ TREAT, family = binomial, data = xy3,      weights = LEAF_NO) 
    
    Coefficients:
    (Intercept)        TREAT  
       -1.11754      0.03857  
    
    Degrees of Freedom: 1 Total (i.e. Null);  0 Residual
    Null Deviance:      4.722 
    Residual Deviance: -2.761e-30   AIC: 10.93 
    だと、自由度は1と(AICとかは違いますが)・・・自由度の考え方の件はその道の専門の方にお任せします・・・(私も知りたい・・・) -- ichigo? 2008-10-06 (月) 18:04:08
  • ichigoさん、さっそく展開データ(=重複をひとつひとつ繰り返したデータ)でご検討下さりありがとうございます。ichigoさんが書かれてコードを紙の上で検討しただけでは理解できませんでしたが、自分で動かしてみて理解できました。勉強になります。たしかに展開データはもとデータと比べて自由度だけが違います。----そこで、weightsオプションを除いてやってみました(res_glm5 <- glm(D_or_A ~ TREAT, binomial, data=xy)。結果はweightsオプションがあったときとは全然違い、Interceptが3.013e-16、TREATが -1.269e-17 となりました。 自由度は3でした(他にNull Deviance:5.545、Residual Deviance: 5.545、AIC: 9.545)。 ---やはりichigoさんがおっしゃるとおり、weightオプションは働いていると考えて良さそうです。では、なぜ自由度だけが異なるのか、なぞです。weightsオプションを使ってロジスティック回帰をして、そのご変数選択などして大丈夫なのか、まったく自身がもてません。(コードや出力をboxの中に入れる方法が分からないので、読みにくくて申し訳ありません) -- やぼてん? 2008-10-07 (火) 14:03:13
  • この中を「自由度」で検索してみたら同様の内容が.Q&A#content_1_16-- ichigo? 2008-10-07 (火) 16:23:32
  • ichigoさん まさに同じ内容のことが質問されていました。お手数をおかけしてすみませんでした。初級Q&Aは過去のアーカイブを一応チェックしたのですが、見落としたようです。検索必用でした。反省。 -- やぼてん? 2008-10-07 (火) 18:08:18
  • wightsオプションで、自由度が大きくならない理由について考えてみました。あたっているかは分かりませんが....。私の考えは、weightsオプションは、重し付けをしているだけで、データを増やしているわけではない、というものです。つまり「このデータは、別のデータの2倍の重し付けをしよう」ということにすぎない、ということです。回帰のパラメータを得るには、これでもichogoさんのxy2のように全データ(=展開したデータ)を解析するのと同じ結果が得られるます。しかし、このあとモデル選択などをするときには、データ数が違うので同じようにはならない可能性があります(ここはよく分かっていません)。したがって私は、当面weightsオプションというブラックボックスは使わず、展開データにして解析することにします。そのさいは、ichigaさんがやられた方法を使わせていただきます。もし、私の考えに間違いがあれば、お教えいただければ幸いです。 ありがとうございました。 -- やぼてん? 2008-10-08 (水) 11:10:31

因子の置換(追加)

うち? (2008-10-03 (金) 19:58:06)

因子を置換(追加)する処理をしたいのですが,下記のようなコードで実行すると意図しない結果になってしまいます。置換対象を前もって文字列化しておくことで意図した処理はできたのですが,因子を直接置換(追加)する方法を教えていただけないでしょうか。

> iris2 <- iris
> unique(iris2$Species) 
[1] setosa     versicolor virginica 
Levels: setosa versicolor virginica
> 
> #Sepal.Length>7.5以上の種名をhogeに置換
> iris2$Species <- ifelse(iris2$Sepal.Length>7.5, "hoge", iris2$Species) 
> class(iris2$Species) #文字列になってしまう
[1] "character"
> iris2$Species <- as.factor(iris2$Species) #後で因子に変換しても
> unique(iris2$Species) #変になってしまう
[1] 1    2    3    hoge
Levels: 1 2 3 hoge
> iris2$Species <- as.character(iris2$Species) #先に文字列化しておくと
> 
> iris2$Species <- ifelse(iris2$Sepal.Length>7.5, "hoge", iris2$Species) 
> iris2$Species <- as.factor(iris2$Species)
> unique(iris2$Species) #意図したようになる
[1] setosa     versicolor virginica  hoge      
Levels: hoge setosa versicolor virginica
  • 後半の方法で動くなら問題ないのでは?これじゃダメなんでしょうか? -- akira? 2008-10-04 (土) 10:29:04
  • atomic type のfactorの使い方の問題です。factor typeは曲者で複数の型(character,カテゴライズされたnumeric)を同時に持っているため処理のしかたによって中身が変化します。前半はfactor typeのまま使ったので、中身がカテゴライズされたnumericでatomic typeがcharacterになりました。後半の方法はfactor type を明示的にcharacter type に型変換してるのでうまくいったわけです。
    > str(iris2$Species)
    Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
    このように、characterの後ろにカテゴライズされたnumeric(1 1 1 1の部分)が隠れています。factor typeは自動的に文字データをコード化してくれているのです。このあたりは他の言語とちがうので慣れが必要ですね。-- okinawa 2008-10-04 (土) 14:15:18
  • ご回答ありがとうございます。下記のようにgsub()で置換した場合(因子の追加はしてませんが)は前もってcharacterにしなくても意図通りになるのですが,カテゴライズされたnumericは置換せずにcharacterのみ置換したので上手く行ったということですね。factorの使い方について大変勉強になりました。
    > iris2$Species <- gsub("versicolor","hoge", iris2$Species)
    > iris2$Species <- as.factor(iris2$Species)
    > unique(iris2$Species)
    [1] setosa    hoge      virginica
    Levels: hoge setosa virginica
    > str(iris2$Species)
     Factor w/ 3 levels "hoge","setosa",..: 2 2 2 2 2 2 2 2 2 2 ...
    • うち? 2008-10-04 (土) 15:09:47
  • その通りです。factor type をas.numeric()で取り出せば、numeric部分を、as.character()で取り出せばcharacter部分が取り出せます。これをカテゴリーデータのコード化に使うと便利ですよ。 -- okinawa 2008-10-04 (土) 21:01:42

heatmapのセルの色

hm? (2008-10-01 (水) 14:57:21)

行列xの要素は0と1の2値データです。(i) heatmapにおいてデフォルトでセルの色が2色以上になっているは、どのような意味があるのでしょうか?(ii) heatmapにおいてセルの色を0なら黒色、1なら赤色にしたいのですが、どうすればよろしいでしょうか?

set.seed(101)
x = matrix(sample(c(0,1), 100, replace=TRUE),10,10)
heatmap(x)
  • 色はxの値によって付けているのではなく,デンドログラムの結果を反映するように付けているのだから,xが0/1でも色は二食で済むわけはないのでは? -- 2008-10-01 (水) 18:40:37
  • 縦軸の増加方向をどうするかは考えてもらうことにして,以下のようなもので,白黒のチェスボードみたいなものはかけますよね。 -- 2008-10-01 (水) 19:01:33 set.seed(101)
    x <- matrix(sample(c(0, 1), 100, replace=TRUE), 10, 10)
    plot(c(1, ncol(x)+1), c(1, nrow(x)+1), type="n", asp=1,
    bty="n", axes=FALSE, xlab="", ylab="")
    for (i in 1:ncol(x)) for (j in 1:nrow(x))
       rect(i, j, i+1, j+1, col=1, density=c(0, 100)[x[j, i]])
    board.png
  • 白黒にしたいだけなら、 image(x, col=c("white","black"))で・・・ -- 2008-10-01 (水) 19:57:22
  • heatmapも内部ではimageを使っています. -- 2008-10-01 (水) 22:02:23
  • アドバイスありがとうございます。heatmap(x, col=c("white","black")) としてみたのですが、データセット(行列xの1と0の2値データ)によってはセルの色("white" or "black")が正しく表示されません。-- hm? 2008-10-02 (木) 02:03:44
    set.seed(101)
    x = matrix(sample(c(0,1),25,replace=TRUE),5,5)
    rownames(x) = LETTERS[1:nrow(x)]
    heatmap(x, col=c("white","black"))
  • よく見よう。heatmap(x, col=c("white","black"))じゃなくimage(x, col=c("white","black"))
    heatmap はデンドログラム付なので,行・列が並べ替えられている。それが困るというのでしょう? -- 2008-10-02 (木) 07:35:19
  • (1) heatmapにおいてセルの色を白黒にするには、どうすればよろしいでしょうか?(2) imageにおいて(heatmapのように)行名札と列名札を表示するには、どうすればよろしいでしょうか? -- hm? 2008-10-02 (木) 09:22:09
  • 色々注文する前に,? heatmap, ? image をちゃんと読んだかな?もし,必要な指定を行うオプションがないなら,先に示されたもののように,自前で関数を書けば良いだけではないかな? -- 2008-10-02 (木) 09:34:40
  • 私自身よくわかっていませんが
    heatmap(x, scale="none")
    でどうでしょう?白黒にしたいなら
    heatmap(x, scale="none", col=c("white","black"))
    でしょうか・・・? -- ichigo? 2008-10-02 (木) 10:35:49
  • hmさんのおっしゃる「col=c("white","black")にしても、データセット(行列xの1と0の2値データ)によってはセルの色("white" or "black")が正しく表示されません」というのは
    > heatmap(rbind(0,x), col=c("white","black"))
    > heatmap(rbind(1,x), col=c("white","black"))
    のような、同一行がすべて同じ値だった場合と推察.この場合も
    scale="none"
    をつけると、うまくいく?
    heatmap(x)
    だけの場合で2色以上使われるのは、行ごとにスケーリングされているためのようです.行ごとには2色しか使われていないようですが・・・ -- ichigo? 2008-10-02 (木) 11:09:30
  • ありがとうございます。scale="none"で解決しました。 -- hm? 2008-10-02 (木) 16:24:41

Meadow+ESSにおける文字化け

Kai? (2008-10-01 (水) 13:51:45)

お世話になります。しょうもない疑問で申し訳ありませんが、以下について一考願えませんでしょうか?

使用環境
・Windows XP
・Meadow 3.00
・ESS-5.3.8
・R-2.7.1
において、日本語データを格納したデータをedit()で開くと、日本語のみ文字化けしてしまいます。ただし、
・Meadow上では、日本語データを文字化けさせないで表示できる
・edit上で、文字化けした項目を選択すると、正しい日本語が表示され、他の項目に移ると、文字化けしたものに戻ってしまう
・Rだけで同様の処理をすると、edit()上でも文字化けは起っていない

説明が不明瞭で申し訳ありませんが、Meadow+ESS+R環境で、edit()を用いてデータを表示させたときのみ、文字化けが発生しているようです。ただし、化けているだけで、実際の値は入っているようです。

文字化けをなくす方法はありませんでしょうか?

  • R_HOME/etc/Rconsole(必ずインストールしたシステム設定の方を変える)のfontを`TT FixedFont?' にして使って下さい. 近視眼的にFixedFont?でなければ, 英語の固定幅フォントに設定しなおすので日本語が見えません. -- なかま 2008-10-02 (木) 11:53:06
  • ご助言ありがとうございます。試してみます。 -- Kai? 2008-10-07 (火) 18:03:03

demoおよびpackageのhelpについて

KW? (2008-09-30 (火) 10:45:56)

初めまして,初歩的な質問で申し訳ないのですが,demo()やlibrary(help="")と入力すると以下のような警告メッセージが表示されます。

> demo()
Warning message:
In file.show(outFile, delete.file = TRUE, title = paste("R", tolower(x$title))) :


> library(help=stats)
Warning message:
In file.show(outFile, delete.file = TRUE, title = gettextf("Documentation for package '%s'",  :


使用環境は以下の通りです。

> sessionInfo()
R version 2.7.2 (2008-08-25) 
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 
> .libPaths()
[1] "C:/PROGRA~1/R/R-27~1.2/library"
> .packages(all.available = TRUE)
[1] "base"       "boot"       "class"      "cluster"    "codetools"  "datasets"   "foreign"    "graphics"  
[9] "grDevices"  "grid"       "KernSmooth" "lattice"    "MASS"       "methods"    "mgcv"       "nlme" 
[17] "nnet"       "rpart"      "spatial"    "splines"    "stats"      "stats4"     "survival"   "tcltk"   
[25] "tools"      "utils"  ~

通常のhelpメニューは表示されます。またパッケージも普通に使えるので,問題はないと思います。pathやDoc関係で問題があると思うのですが,詳しい解決方法をご享受できればと思っています。よろしくお願いします。

  • 再インストールしたほうがいいかも。 -- okinawa 2008-09-30 (火) 11:08:14
  • ありがとうございます。再インストールしたのですが,状況は相変わらずです。citation()やexample()といった関数は使えるのですが,contributors()やdemo()といった別ウィンドウに表示するような関数に警告メッセージが表示されるので,別ウィンドウに表示される際に問題があるのでしょうか。 -- kw? 2008-10-01 (水) 23:33:28
  • 私の環境winxpsp2,R2.7.2では再現しません。OS周りの障害っぽいですね。もしかしてvistaとか。 -- okinawa 2008-10-02 (木) 09:01:41
  • どうもすみません,自己解決しました。OSはWinXPです。CドライブのDocument and Setting以下のパスが日本語になっていたので,それをアルファベットに設定しなおしたら,正常になりました。自分自身パソコンにそれほど詳しくないのですが,パソコンを購入して初期の段階でユーザー名を入力する際日本語表記にしてしまうと,ユーザーアカウントを切り替えない限り,Document and Setting以下のユーザーフォルダが日本語表記になるので,Rの外部出力の際(というかDocumentを読み込む際に)日本語を認識しないため,エラーが出たものと思われます。パス名はアルファベットでないといけないのですね。お騒がせしました。okinawa様ありがとうございました。 -- kw? 2008-10-02 (木) 11:48:30
  • ああ、そこでしたか。windowsのRの鬼門ですね。 -- okinawa 2008-10-02 (木) 16:05:23

version 2.7.2 日本語版ではなく英語版で使いたい

Rei? (2008-09-28 (日) 20:05:42)

お世話になります。
最新バージョン 2.7.2 をインストールしたところ、以前のバージョンではインストール時に日本語版にするという選択をしなければ、英語版になったと思うのですが、本バージョンではどうやっても日本語版になってしまいます。英語版にする、あるいは、英語版をインストールする方法をご存じの方がいらっしゃいましたらご教示頂ければ幸いです。
(1) 使用環境: Windows Vista
(2) 使用PC: 日本語PC
(3) インストールに使用する言語を英語にしたが同様であった。
(4) ミラーサイトをUSAでダウンロードしたが同様であった。

分散の期待値を求めたい

お団子? (2008-09-25 (木) 08:05:39)

Saitoさんごめんなさい間違った場所に投稿しました。再投稿します。

SASでは、次のようにプログラムすると、下記のような
分散の期待値が求められますが、これをRで実行する方
法(関数)はあるのでしょうか?

model Data = R A R(A) B A*B R(A B) / ss2 e2;
random R R(A) R(A B);

変動因 Type II 期待平均平方
R Var(Error) + Var(R(A*B)) + 2.8182 Var(R(A)) + 11 Var(R)
A Var(Error) + Var(R(A*B)) + 2.8765 Var(R(A)) + Q(A,A*B)
R(A) Var(Error) + Var(R(A*B)) + 2.7273 Var(R(A))
B Var(Error) + Var(R(A*B)) + Q(B,A*B)
A*B Var(Error) + Var(R(A*B)) + Q(A*B)
R(A*B) Var(Error) + Var(R(A*B))

image()でカラーバー(凡例?)を表示したい

? (2008-09-23 (火) 15:52:51)

場所を間違えて質問してしまったようでご迷惑をお掛けいたしました。
以下原文ですが、宜しくお願いいたします。

「contour()ではカラーバーが自動的に右側に描写されますが
これをimageの方で表示することは出来ないのでしょうか?
helpを読んでもそのような記述は見当たらず・・・質問させて頂きます。」

wiki内でimageやカラーバーといった単語検索を試しましたが見つかりませんでした。。すみません。

  • もっと詳しく書かないと回答のしようがない -- 2008-09-23 (火) 19:26:47
  • 通常三次元データをimage()で描写しますとhttp://cse.naro.affrc.go.jp/takezawa/r-tips/r/image/50-24.gifの図がアウトプットされます。 -- ? 2008-09-23 (火) 19:40:38
  • filled.contour()ですとhttp://www.okada.jp.org/RWiki/?plugin=attach&refer=%A5%B0%A5%E9%A5%D5%A5%A3%A5%C3%A5%AF%A5%B9%BB%B2%B9%CD%BC%C2%CE%E3%BD%B8%A1%A7%A5%A4%A5%E1%A1%BC%A5%B8%BF%DE&openfile=fc1.jpgのように自動でカラーバーが挿入されます。このカラーバーをimage()でも表示させることは可能でしょうか?(長文&わかりづらくてすみません) -- ? 2008-09-23 (火) 19:43:17
  • filled.contour() を使えばいいのでは?と言われたら,どう答えるんですか?
    さらに,先読みして答えれば,filled.counter のソースを呼んで,image を改造すれば?と言われたらそれでおしまいでは? -- 2008-09-23 (火) 22:06:41
  • コメントありがとうございます。filled.contour()は等高線描写なせいか隣の点との境界がにじんでしまい、クッキリしません。一マス一マスをタイル状に描写したいのでimage()かなと思ったのですが。。。 -- ? 2008-09-23 (火) 22:12:39
  • example() では再現できないのでしょうかね?ちゃんと再現できるようなプログラムを示して欲しいものですけど。
    「filled.contour()は等高線描写なせいか隣の点との境界がにじんでしまい、クッキリしません」というのは,ファイル形式のせいじゃないの?jpeg でやったら,【にじむ】のは当たり前でしょう。 -- 2008-09-23 (火) 22:57:27
  • 直接描く方法ならこんな感じでしょうか? -- ichigo? 2008-09-24 (水) 11:47:16
    NN <- 100
    x <- 10*(1:nrow(volcano))
    y <- 10*(1:ncol(volcano))
    image(x, y, volcano, col = terrain.colors(NN), axes = FALSE)
    cols <- terrain.colors(NN)
    for( ii in 1:NN ){
        rect(par()$usr[1]+(par()$usr[2]-par()$usr[1])/NN*(ii-1), par()$usr[3], 
            par()$usr[1]+(par()$usr[2]-par()$usr[1])/NN*ii, par()$usr[3]+10, 
            col=cols[ii] , border=NA)
    }
    rect(par()$usr[1], par()$usr[3], par()$usr[2]-1, par()$usr[3]+10, col=NA)
  • お二方ありがとうございます。 -- ? 2008-09-24 (水) 19:46:06
  • > z<-matrix(1:9,nrow=3,ncol=3)> image(1:3,1:3,z)> filled.contour(1:3,1:3,z) のようにimage()の出力はブロック状で行われ、私はこのように出力された図にカラーバーを添えたいと思っているのですが、そのようなオプションはなく、itigo様に示していただいたように自作するしかなさそうです。 -- ? 2008-09-24 (水) 19:56:43
  • 指摘していただきましたソースを読んでのimage()改造ですが、試みたのですが私にはまだ早すぎました・・ソースを読んでも意味がわかりませんでした。。。 -- ? 2008-09-24 (水) 20:13:28
  • Rもwikiも不慣れな私に丁寧にアドバイスしていただいて、本当にありがとうございました。 -- ? 2008-09-24 (水) 20:14:54
  • imageを改造するより、filled.contourを改造したほうが早いかと。 -- 2008-09-24 (水) 22:53:10
  • .Internal(filledcontour(as.double(x), as.double(y), z, as.double(levels), col = col)) っていう行を、image(x,y,z,col=col,add=TRUE) に書き換えるだけで大丈夫だと思う。 -- 2008-09-24 (水) 23:00:22
  • 追加アドバイスありがとうございます。書き換えた内容で新しく関数を作ったところ問題が完璧に解決いたしました!本当に皆様ありがとうございました。m(__)m -- ? 2008-09-25 (木) 16:38:24

dev.off()等の出力をコントロールするには?

ichigo? (2008-09-19 (金) 17:04:34)

たとえば

>postscript()
>plot(1:10)
>dev.off()

とすると

postscript
         2

と、デフォルトで表示されると思うのですが、これを出さない方法はありますでしょうか.
いろいろ試したり、検索したりしたのですがわからなくて困っています.

  • options()には、これ関連のオプションはなさそう
  • Rを起動するときの「--slave」オプションでも抑制できない.
  • (dev.off())とかやっても、出力されてしまう(当然ですか(汗).
    環境は R version 2.4.1 (2006-12-18)
    i686-pc-linux-gnu
    です.よろしくお願いします.
  • 汚いけど、sink()でファイルに吐き出せば? -- 2008-09-19 (金) 17:31:18
  • invisible() -- 2008-09-19 (金) 17:38:23
  • junk <- dev.off() でも(所詮ゴミなんだから) -- 2008-09-19 (金) 22:07:28
  • みなさま(それともおひとり・・・?)ありがとうございます.うまく出来そうです.
    • 「junk <- dev.off()」でも、出来たんですね・・・まさか戻り値だとは思わなくてうっかりしていました・・・
    • sinkはsink("/dev/null")でいけそうです.
    • invisible()というのは初めて知りました.勉強になりました. -- ichigo? 2008-09-24 (水) 10:44:52

data.frameの列数

kd? (2008-09-18 (木) 23:23:37)

data.frameに関するエラーメッセージ(下記例,R 2.7.2)なのですが,日本語としては,「列の長さ」の方が正確と思えるのですが(「列数」ではなくて),R(のdata.frame)では第1列(もしくは第2列)の「列数」という言い方をするのでしょうか?

> test<-data.frame(c(1:2),c(1:3))
    以下にエラー data.frame(c(1:2), c(1:3)) : 
    引数は異なった列数を意味します:  2, 3
  • 思い切り古い R-1.5.1 でやってみると,Error in data.frame(c(1:2), c(1:3)) : arguments imply differing number of rows: 2, 3 というエラーを吐きましたね。行の数が違うということだけど,意味しているところは列ベクトルの長さですね。そのうち,2.8 に向けての和訳(見直し)のお知らせがあるので,その時に修正すれば宜しいのではないかな。
    手元に用意している一番古い R-0.49 だと,Error in data.frame(frame, as.character(row.names), as.logical(as.is)) : incompatible argument dimensions で,だいぶ違ってたのねぇ。 -- 2008-09-19 (金) 00:06:44

ある範囲に含まれる生物の数をカウントするには

Saito? (2008-09-17 (水) 22:50:20)

いつもお世話になっています。
似たような質問がないか探しましたが、見つけられなかったので質問させてください。(ただ、gstatパッケージでのクリギングについてという記事が最も近い感じではありました)

ある調査区域を調査して、区画ごとにそこにいた生物の個体数を数えています。サンプルとしては以下のようになります。点線で囲まれた30個の長方形がそれぞれの区画です(本当はx軸を0.1刻みで網をつけ、60個にしたかったのですがうまくいきませんでした。それについてもご教授していただけると幸いです)。

lon=runif(20,131,132)
lat=runif(20,46,49)
ss=rpois(20,5)
d=data.frame(lon,lat,ss)
with(d,
    {
plot(lon, lat, col=as.factor(ss),
          xaxp=c(131,132,10), ylim = c(46, 49), panel.first = grid(),
          )
}
)

ここで質問なのですが、それぞれの区画での合計発見数(ssの値に限らず1発見1カウント)、および総個体数(sum of ss)を算出するにはどのようなプログラムを書けばよいのでしょうか。tapplyやexpand.gridなどで色々やってはみたのですが…。
環境はWindowsXp?, R-2.7.2です。

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

  • え〜〜。なにがやりたいのかなあ。前半については,lonとlatを階級に区切って,クロス集計するだけでよいのでは?
    lon2 <- floor(lon/0.1)*0.1
    lat2 <- floor(lat/0.1)*0.1
    table(lon2, lat2) # programmed by 一言居士
    後半は,
    lon3 <- rep(lon2, ss)
    lat3 <- rep(lat2, ss)
    table(lon3, lat3) # programmed by 一言居士
    かな,ちょっと手抜きだけど。
    0.1 は要するに,区間幅ね。好きな幅にして。「*0.1」 はあってもなくても良い。 -- 一言居士 2008-09-17 (水) 23:49:50
  • 回答ありがとうございます。クロス集計という単語はあまり意識していませんでした。ただ、若干やりたいことと違っており自分ではうまく挿入できなかったので、もう少しお尋ねしても構わないでしょうか。上記のプログラムだと、前半にしても後半にしてもlonやlatの値によってクロス表の水準の値が変わってしまいます。lonとlatがなかった、つまり全く発見がなかった区画についても0という値を返したいのですが、その場合はどのようにすればよいのでしょうか? -- Saito? 2008-09-18 (木) 00:43:50
  • table(cut(lat, seq(46,49,.5)),cut(lon, seq(131,132,.2))) -- 弁慶? 2008-09-18 (木) 01:00:51
  • 後半は,table(rep(cut(lat, seq(46,49,.5)),ss),rep(cut(lon, seq(131,132,.2)),ss)) ということになりますなあ〜。 -- 2008-09-18 (木) 01:40:15
  • すごい!納得致しました。latやlonの箇所をss分だけ繰り返すのですね。私はそこにlat3とlon3を入れて計算していたため、間違ったようです。本当にありがとうございました。 -- Saito? 2008-09-18 (木) 01:55:01
  • 後半は,rep は使わないでよい。以下のように xtabs を使って,
    xtabs(ss~cut(lat, seq(46,49,.5))+cut(lon, seq(131,132,.2)))
    とすべきだった。cut の結果を2回使うので,変数として取っておくとよい。
    lat4 <- cut(lat, seq(46,49,.5))
    lon4 <- cut(lon, seq(131,132,.2))
    table(lat4, lon4) # xtabs(~lat4+lon4) と同じ
    xtabs(ss~lat4+lon4)
    蛇足ながら -- 一言居士 2008-09-18 (木) 07:24:54
  • おお、すごいシンプルに!また勉強させていただきました。ありがとうございます。 -- Saito? 2008-09-18 (木) 14:18:52
  • すみません。追加で質問させてください。上記のプログラムのxtabsで区切った辺の平均値を算出し、その区画の平均座標を求めるために以下のようなプログラムを作成しました。
    lon=runif(20,131,132)
    lat=runif(20,46,49)
    ss=rpois(20,5)
    lat4 <- cut(lat, seq(46,49,.5))
    lon4 <- cut(lon, seq(131,132,.2))
    a3=xtabs(ss~lat4+lon4)
    a33=as.data.frame(a3)
    s<-rep(seq(46,48.5,.5),length(seq(131,131.8,.2)))
    s2<-s+0.5
    r<-rep(seq(131,131.8,.2),each=length(seq(46,48.5,.5)))
    r2<-r+0.2
    mean.lat<-(s+s2)/2
    mean.lon<-(r+r2)/2
    d3<-data.frame(a33$lat4,a33$lon4,mean.lat,mean.lon,a33$Freq)
    d3
    ただ、どうにも手動の部分が多く(s,rを作成するあたり)データが多くなってきたときにミスが発生しそうです。strsplitやsubstrなども試してみたのですが、うまくいきません。何か簡潔に平均座標を求めるやり方などアドバイスをいただけたら幸いです。 よろしくお願いします。 -- Saito? 2008-10-09 (木) 17:50:04

Windows版 R-2.7.1 で日本語ファイルパスはダメですか?

? (2008-09-17 (水) 17:50:44)

メニュバーから File | Source R code... を選択し,日本語を含むファイルパスにあるコードを読み込もうとすると,下記のようなエラーが発生します.

Error in file(file, "r", encoding = encoding) :

 cannot open the connection

In addition: Warning message:
In file(file, "r", encoding = encoding) : cannot open file 'H:\・・渰渰dž>

OSはWindowsXP,Rのバージョン2.7.1です.ちなみに,R-2.4.1では,全く同じマシン環境で全く同じ操作をしても問題無しでした.どなたか解決策を教えていただけないでしょうか.

  • はい, 日本語パスは問題があるので, asciiのpath配下に変更して頂けると幸いです. Unicode化の現在1合目なので...(既に遭難中...) -- なかま 2008-09-17 (水) 19:27:32
  • 了解しました.ありがとうございます. -- ? 2008-09-18 (木) 09:11:28

ロジスティック回帰分析におけるsommersDの求め方

basel? (2008-09-17 (水) 12:16:01)

ans<-glm(y~x,family=binomial(link="logit"),data=ds)
でロジスティック回帰分析を行った後に、「SommersD」を求めたいのですが、どのようにしたら良いのでしょうか?

  • ソマーズのDは,属性相関係数の一つだと言うことはおわかりなんですね。で,何と何の相関をとりたいのでしょうか? -- 一言居士 2008-09-17 (水) 12:36:25
  • この場合、y,xの相関です。 -- basel? 2008-09-17 (水) 18:48:21
  • 必要な関数を探すの「検索サイトで探す」のR site serach で somers をキーワードにして検索すれば,Hmisc ライブラリの somers2 関数が出てきます。検索するときに必要なので,つづりは間違わないように。 -- 一言居士 2008-09-17 (水) 19:03:25

コンジョイント分析

マーケター? (2008-09-16 (火) 17:18:27)

コンジョイント分析のできるパッケージはないでしょうか

  • コンジョイント分析といっても,程度も範囲も広いようですが?
    非常に限定的で単純なものは,lm(重回帰分析)でやれるようなものですよね。それで十分かどうかは別問題ですけど -- 一言居士 2008-09-16 (火) 20:44:21
  • 直交表を生成してくれる関数がRにあれば、lm(重回帰分析)と組み合わせてコンジョイント分析できるんですが。。。直交表を生成してくれる関数が見当たりません。これだけ世界で田口メソッドが使われているんですが。。残念です。 -- マーケター?? 2008-09-16 (火) 21:42:37
  • 任意の直交表を生成するのもいいけど,既存の直交表で対応できるように調査デザインを組めばよいだけのことではないですか?(田口メソッドの本にはずいぶんたくさんの直交表が用意されているのでは?)
    任意の直交表を作るのも,そんなに大変なことではないけど(ある程度の試行錯誤で出来るようなので,それをプログラム化すればある程度は対処可能では?),そこまでする必要性がどれだけあるか。
    それと,lm を使う解法って,近似解というか特殊な場合についてのものではないですか?
    以下のプログラムは,L8 直交表を探索します。無駄は多いが。
    z <- x <- rep(1:2, each=4)
    m = 1
    for (i in 1:90000) {
    	y <- sample(x)
    	if (cor(x, y)  == 0 && y[1] == 1) {
    		tmp <- cbind(z, y)
    		if (sum(abs(cor(tmp)-diag(m+1)))==0) {
    			z <- tmp
    			m <- m+1
    			print(m)
    		}
    	}
    		
    } # programmed by 一言居士
    
    > z
         z y y y y y y
    [1,] 1 1 1 1 1 1 1
    [2,] 1 2 1 1 2 2 2
    [3,] 1 1 2 2 2 1 2
    [4,] 1 2 2 2 1 2 1
    [5,] 2 2 1 2 2 1 1
    [6,] 2 2 2 1 1 1 2
    [7,] 2 1 1 2 1 2 2
    [8,] 2 1 2 1 2 2 1
    > cor(z)
      z y y y y y y
    z 1 0 0 0 0 0 0
    y 0 1 0 0 0 0 0
    y 0 0 1 0 0 0 0
    y 0 0 0 1 0 0 0
    y 0 0 0 0 1 0 0
    y 0 0 0 0 0 1 0
    y 0 0 0 0 0 0 1
    そのほかの直交表も,rep(1:2, each=4) のところを変えればできるでしょう。 -- 一言居士 2008-09-16 (火) 22:09:50
  • す、すごい! 有難うございました -- マーケター? 2008-09-17 (水) 17:00:16

変動パターンが似ているもの同士をクラスタリングすることについて

R初心者? (2008-09-15 (月) 16:38:52)

複数の遺伝子の発現を数時間毎に測定し、それをデータとしてまとめて、その発現のパターンをRを用いてクラスタリングしようと考えています。
その際に、1,2,3...と2,3,4...といったような、生じる値は異なっていても、数字の変動の傾向(例の場合だと、1ずつ増えるのでパターンが似ている。)がよく似ているもの同士(つまり、増え方を考慮しないもの。y=xとy=x+1のような関係であるもの)をクラスタリングするスクリプトはどうつくればいいのか、途方にくれています。ご存知の方がいらっしゃたら教えてください。宜しくお願いします。

  • 「数字の変動の傾向」が変量になると思いますので、それをクラスタリングしてはどうでしょうか? -- akira? 2008-09-16 (火) 09:38:57

連続して計算された値を順に書き出したい

Saito? (2008-09-11 (木) 20:34:09)

いつもお世話になっています。
既出でしたら申し訳ありません。似たような例を探したのですが、見当たらなかったので質問させてください。たとえばforなどを使って順に計算された値をすべて書き出すにはどのようにかけばよいでしょうか。たとえば、0,1を99個生成しそれぞれを数えたものと、100個生成しそれぞれ数えたものをくっつけると、

> r=0
> t=0
> for(i in 1:99){
> ifelse(sample(0:1,1)==0,r<-r+1,t<-t+1)
> }
> c1=data.frame(r,t)
> 
> r=0
> t=0
> for(i in 1:100){
> ifelse(sample(0:1,1)==0,r<-r+1,t<-t+1)
> }
> c2=data.frame(r,t)
> c3=merge(c1,c2,all=T)
> c3
>   r  t
> 1 45 54
> 2 48 52

となります。ここでは99と100というたった2つの場合ですが、本当は反復数を自動で変えてもっと多くして、rとtの値を一覧で見たいのですが、なかなか思うようにできません。どなたかご教授いただけたら幸いです。
なお、OSはWindowsXp?、Rのバージョンは2.7.2です。

  • すみません、題名がよくないのですね。forにこだわっている訳ではないので、直しておきます。for以外でも全く構わないので、ご教授願えないでしょうか。 -- Saito? 2008-09-11 (木) 21:16:12
  • やりたいことは分かりましたが,それを for を使ってやる方法といわれても,気が進まない。for を使わない方が良いので,というかもっと色々なやり方があるので,どうしようかなと言うところ。どうやって答えたらあなたが満足するのか分からない。
    func は,0/1 乱数を n 個発生させて,0,1 の個数を数えそれを返す。ここでのアドバイスは,1個ずつ乱数をn回発生させるのではなく,n個の乱数を1回発生させること。
    sapply は,func を使って何回か実験をする。毎回何個の0/1乱数を発生させるか,あなたは「自動的に」といっていたが,ここでは,func の中でと同じように sample で決めている。この部分を他の数値ベクトルで置き換えればよい。
    しかし,全体としては,何だかなあと言うできばえのプログラムであなたが本当にやりたいことが分かればもっとスマートなプログラムが書けることでしょう。-- 一言居士 2008-09-11 (木) 21:14:18
    > func <- function(n) { # 実験の記述
    + 	x <- sample(0:1, n, replace=TRUE)
    + 	t <- sum(x)
    + 	r <- n-t
    + 	return(c(r=r, t=t))
    + } # programmed by 一言居士
    > sapply(sample(50:100, 5, replace=TRUE), func) # 5 回実験してみよう
      [,1] [,2] [,3] [,4] [,5]
    r   48   32   39   35   26
    t   49   31   39   25   33
  • 本当に,あなたが書いたように 0/1 データの 0 と 1 を数えるようなシミュレーションがやりたいのなら,0/1 乱数を発生して個数を数えるなんて真っ正直なことをしないで,二項乱数を発生させる方が手っ取り早い。つまり,rbinom を使うと言うこと。 -- 一言居士 2008-09-11 (木) 21:42:18
  • sapplyは全く使いこなせていませんでした。なるほど、こうすればできますね。私がやりたかったのは上の例を用いさせていただきますと、
    s=sapply(sample(1:100, 5000, replace=TRUE), func)
    t=t(s)
    plot(t)
    という図を作りたかったのです。といいますのも、論文である理論値からの対称性について言及を行うつもりで、その対称性というのが上記で示した1,0の乱数がx軸の値が大きくなるにつれて生成される割合も多くなるという性質のものだったからです。確かに最初はrbinomで試したのですが理解が不十分なためうまくいかず、仕方なく具体例を示したのでした。わかりにくく、手間を取らせてしまい申し訳ありませんでした。 -- Saito? 2008-09-11 (木) 22:02:50

plot図の保存方法について

basel? (2008-09-11 (木) 19:36:05)

たとえばboxplotを作図してjpegで保存したい場合、
bp<-boxplot(a~b)
save(bp,file="bp.jpeg")
ではだめだったのですが、何が原因なんでしょうか?

  • うまくいかないのは,そういう方法で保存するのではないためです。やり方は何通りかあります。どれが一番よいかは,プラットフォームにもよる。作図してから,「そうだ,保存しておこう」と思ったような場合に適しているのは,ファイルメニューから,「画像を保存する」を選ぶこと。もっと計画的にやるなら,事前に pdf や png 関数で書き出すファイルを用意し,描画の後,dev.off すること。ただ,jpeg で保存するのは,最悪(jpeg は写真などの保存に適した画像フォーマットですが,グラフなどの保存には不適です)。 -- 一言居士 2008-09-11 (木) 21:27:45
  • R-Tipsの「47. 作図の準備」を勉強されるのが良いと思います。 -- akira? 2008-09-12 (金) 07:33:12

clip()の動作がよく分かりません。

hanageishi? (2008-09-09 (火) 12:02:03)

clip()が期待通りに動作してくれません。
使用環境は WindowsXP, R version 2.7.1 (2008-06-23)です。

以下のようにすれば、par()$usrはc(0.96,2.04,2.96,4.04)ですが、clip()の値は左側に広げてあるので、(0.96,3.2)の点はaxisにかかるものの半欠けにならないことを期待しました。ところが実際には半欠けになります。

> windows()
> plot(1:2,3:4)
> clip(0.9,2,3,4)
> points(0.96,3.4)

ところがなぜか、そのあともう一度clip()を呼び出すと、今度は半欠けにならずにプロットされます。

> clip(0.9,2,3,4)
> points(0.96,3.2)

ただclip()を二回立て続けに呼び出しただけではだめなようで、clip()の前にpoints()が実行されていることが必要のようです。そこまでは分かったのですが、原因が分かりません。ちなみにplot()以降は、par()の中身は一切変更されていなかったようです。もしどなたか原因をお分かりでしたらご教示ください。

  • How the clipping rectangle is set depends on the setting of par("xpd"): this function changes the current setting until the next high-level plotting command resets it. Exactly when the clipping region will be reset can be hard to predict. plot.new always resets it. Functions such as lines and text only reset it if par("xpd") has been changed. However, functions such as box, mtext, title and plot.dendrogram can manipulate the xpd setting. -- 2008-09-09 (火) 13:43:00
  • どのような動作を期待しているのかよくわからないが,par(xpd=TRUE)にすればよいのでは? -- 一言居士 2008-09-09 (火) 13:45:02
  • なるほど、clip()と同時にpar(xpd=TRUE)をしておけば、求める図は描画できるようになったので問題は解決しました。上記の例では、一度目にclip()を呼び出したときには引数として指定した範囲とは無関係にプロット領域でクリップされて描画されるのに対して、二度目にclip()を呼び出した後はpar()$xpdがFALSEのまま変更されていないにも関わらず、一度目とは異なりclip()に指定した範囲でクリップされて描画されるので、この一度目と二度目の差が何に起因するのか不明で、不思議です。ご指摘いただいたhelpの説明も読んだのですが、clip()と同時にpar(xpd=TRUE)とすることが必要であるとは読めません。Examplesもそのようなことはしていません。まあ、par(xpd=TRUE)さえしておけばclip()の設定が生きることは分かったので、単に気持ち悪いだけなのですが...。 -- hanageishi? 2008-09-09 (火) 15:10:29
  • っていうか,clip() いらないんじゃ? -- 一言居士 2008-09-09 (火) 15:49:26
  • や、プロットが左にはみ出してもいいけど下にはみ出してもらっちゃ困るという条件にしたかったので、xpd=TRUEだけというわけに行かず、clip()を使わざるを得なくなりました。あんまりそんなことが必要になる機会は多くないでしょうけど...。 -- hanageishi? 2008-09-09 (火) 16:56:37
  • わたしは, clipを使った事が無いので見てみました.(嗚呼ぁ...) なので, gridの利用をお薦め致します. -- なかま 2008-09-09 (火) 19:37:03
  • 嗚呼ぁ、やはり嗚呼ぁなのですね...。gridとはgrid graphics packageのことでしょうか。また大変危険なおもちゃを見つけてしまいました...。これでまた仕事がそっちのけにされそうです。ありがとうございました。 -- hanageishi? 2008-09-10 (水) 13:45:01

quantileの逆引きが出来ますか?

maruru? (2008-09-03 (水) 03:19:25)

正規分布で平均値、標準偏差、0.025、0.975、サンプル数が既知の時、簡単にquantleを推定する方法が無いかなあと思いまして、初心者ゆえ安直なことを考えたのですが、教えていただけますでしょうか?

  • [quantleを推定]とは,どういうこと?何を求めるの? -- 一言居士 2008-09-03 (水) 12:57:29
  • 25%分位点、75%分位点を求められないかと思いました。サンプル数は未知でした。 -- maruu? 2008-09-03 (水) 20:52:23
  • サンプル数が未知であっても,母分布の母平均・母標準偏差の最尤推定値が標本平均・標本標準偏差(あなたが言っている「正規分布で平均値、標準偏差が既知」ということはそういうことでしょう?)だったら,母分布は正規分布と推定するしかないわけだから,その25%点,75%点に限らず任意のq%点は,qnom(q/100, mean=平均値, sd=標準偏差) で求めることが出来ます(それ以外の方法はない)。
    [quantileの逆引き]なんて言うから話が通じない。。。。
    具体的には,平均値が50,標準偏差が10(いわゆる,偏差値ですな)において,上位25%に位置するものは何点か?
    答え,
    > qnorm(0.75, mean=50, sd=10) # programmed by 一言居士
    [1] 56.7449
    上から2.5%目のものの得点はいくつか。
    > qnorm(0.975, mean=50, sd=10) # programmed by 一言居士
    [1] 69.59964
    それが,なにか? -- 一言居士 2008-09-03 (水) 21:10:51
  • 早速のご教示、ありがとうございます。如何質問すればいいか、捻りすぎました。申し訳ありません。関数の仕組みというか、使い方がよく解らないというか、、、。何か特殊なことがあるのかと思ったものですから、通じない質問をしてしまいました。それが、なにか?と問われましてもどう返事をしていいものか、、、。とにかくありがとうございました。「再ひゅうすいていち」って、「最尤推定」ですよね。初めてのおバカな質問にお答えいただき、ほんとにありがとうございます。 -- maruru? 2008-09-03 (水) 21:39:23

X11 module cannot be loaded?

lis-kyoto? (2008-09-02 (火) 17:16:15)

SUSEのunixにRをyast2からインストールしまして、
確率分布を描くプログラムを実行させようとしましたところ、

Error in X11(): X11 module cannot be loaded
In addition: Warning messeage:
In X11(): unable to load shared library '/R/modules//R_X11.so':

  /usr/lib/R/modules//RR_X11.so: undefined symbol: cairo_image_surface_get_data


というエラーでできませんでした。(WindowsでRをインストールして実行したときは問題なく実行できてました。)
もともと、SUSEにインストールの時にも、cairoがないとか言われたのですが、
X11も、cairoもunixにはちゃんと入っていたので無視してインストールしてしまっていました。
なにかpathが通っていないのか、Rの問題なのか、調べてみたのですが、初心者でまったくわからないので、教えていただけますでしょうか。

  • cairoのバージョンがビルド時と違うのでしょう, "~/.Rprofile" に,
    setHook(packageEvent("grDevices", "onLoad"),
       function(...)
          grDevices::X11.options(type="Xlib"))
    などと買いて, cairoを無効にしてみて下さい. -- なかま 2008-09-02 (火) 17:31:16
  • どうもありがとうございます。やってみます!/R/bin/Rprof*でいいのですよね? -- lis-kyoto? 2008-09-02 (火) 19:21:57
  • ?.Rprofileとしてヘルプを見てください. あなたが言ってるのは, プロファイル違いで, perlのスクリプトです(^_^) -- なかま 2008-09-02 (火) 22:53:45
  • あああああ, そかそか, 前にも同じような質問が... えっと, チルダはホームディレクトリを示す呪文で, "~/.Rprofile" は, "/home/<myname>/.Rprofile" と書いたのと等価になります. 通常, .Rprofileは無いでしょうから, 自分で作成します. 今時のUnix入門書で良いのを存じませんが, "ドットなんとかprofile"とか, "ドットなんとかrc" ファイルがアプリケーションの個人用の設定ファイルと言うのは公然の秘密です -- なかま 2008-09-02 (火) 23:08:50
  • なかまさま。どうもありがとうございました。結局、cairoの最新版をインストールしたらうまくいきました!コメントもありがとうございました。勉強になりました。 -- lis-kyoto? 2008-09-03 (水) 10:50:19

Rパッケージインストーラの一覧の二重表示

伊太利屋次郎? (2008-09-01 (月) 12:44:11)

OSX 10.5.4でR 2.7.2を使用しています。実害はない(?)と思いますが,Rパーケージインストーラーのソース,バイナリーともに一覧を表示させると,パッケージが二重に表示されます。導入済みパッケージ(バイナリー,ソースともに)のバージョンは必ずしも,同じポジション(すべての導入済みパーケージが二重表示の上段だけにまたは下段だけに)に表示されるとは限りません。
どうなっているのでしょうか?

  • ちょっとみただけですが,私の環境ではそのようなことはないのですけど。たとえば,どういうパッケージが二重表示されますか? -- 2008-09-01 (月) 13:34:05
  • リポジトリーにあるバージョン(すべて)です。CRANミラーは筑波大に設定しています。 -- 伊太利屋次郎? 2008-09-01 (月) 15:55:25
  • おかしいですね?うちではこうなっていますけど。 -- 2008-09-01 (月) 16:15:44
    package.png
  • はい,おかしいいです?! 自分はこうなっています。 -- 伊太利屋次郎? 2008-09-02 (火) 09:31:31
    double_pkg_instlr.jpg
  • AppCleaner?を使って/Application/R.app, ~/Library/Preferences/org.R-project.R.plistを削除してからR 2.7.2を再インストールしたら正常に戻りました。installed.packages()で確認しておいたインストール済みのパッケージもちゃんと保存されてました。なぜあんなに二重表示されたのかは未だに不明ですが... -- 伊太利屋次郎? 2008-09-03 (水) 10:50:53

2次元の散布図で、ラベルが他のラベルやマークと重ならないように表示するには?

Koichi? (2008-09-01 (月) 01:44:08)

お世話になります。2次元の散布図を作成しようとして、表題の件で行き詰っ
ています。

hoge <- matrix(
    c(
         1,  1,    "label1",
         1,  0.99, "label2",
         1, -1,    "label3(this is long)",
        -1,  1,    "label4(long again)"
    ), ncol=3, nrow=4, byrow=TRUE
)
plot(hoge)
text(hoge, hoge[,3], pos=1)


このようにラベルをそのままプロットすると、ラベル同士が重なったり、ラベ
ルの一部がプロットエリアの外に出てしまったり(表示されなかったり)しま
す。

目標は、上のhogeのようなデータを元に、以下のようなプロットを自動的に
生成することです。

fuga <- matrix(
    c(
         0.85,  1,
         0.95,  0.9,
         0.75, -0.9,
        -0.7,   1
     ), ncol=2, nrow=4, byrow=TRUE
)
plot(hoge)
text(fuga, hoge[,3])


このように自動的にラベル位置を調節してくれるような関数はありますでしょ
うか? identify関数が、これに近いこと(なるべく空いたスペースにラベル
表示)をやってくれるようなのですが、点を1つずつクリックしていくという
のは少し厳しいものがあります。お知恵をかしていただけましたら幸いです。

  • 誰も反応しないので、 -- 谷村 2008-09-09 (火) 17:49:57
    library(maptools)
    pointLabel(x=as.numeric(hoge[,1]),y=as.numeric(hoge[,2]),labels=hoge[,3],cex=.5)
    地図のラベルではよくある問題です
  • まさしくこういうものを探し求めておりました。感動しました。大変ありがとうございました。 -- Koichi? 2008-09-11 (木) 03:08:04

csvデータを読み込み時系列の棒グラフを作成したい

マーサ? (2008-08-31 (日) 14:19:21)

始めまして!マーサと申します。
Rは2日目の初心者です、Rの解説本を読みながら手探りで勉強を始めましたがもうギブアップ状態です。
下記にcsvデータと試したコマンドを記述してみます。
このcsvデータ(データ数は710個)から時系列の棒グラフを作成する方法を教えてください。
日付 天山高
2001/10/2   2
2001/10/3  61
2001/10/4   4
2001/10/5
2001/10/6   3
2001/10/7   2
2001/10/8
2001/10/9   2

入力したコマンド
x <- read.csv("C:/R-sample/IJT.csv"))

barplot(x)  # 以下にエラー barplot.default(x

             #   'height' はベクトルか行列でなければなりません

以上です、またこのデータは項目が1個ですが、元データは日付に対して12の項目があります、1画面に4行、3列のグラフを表示させる方法も教えてください。
日付 天山高 天山低 天山微 天山その他 眼鏡岩高 眼鏡岩低 眼鏡岩微 眼鏡岩その他 摺鉢山高 摺鉢山低 摺鉢山微 摺鉢山その他
2001/10/2  2 6  2 11  6
2001/10/3 6 1 7 1 145 8 1 16 1
2001/10/4  42 2 2 2 3
2001/10/5  3 3 3 3 1
2001/10/6 3 4 3 4 1
2001/10/7 2 1 2 1 1 1
2001/10/8 1 1
2001/10/9 2 1 2 3 2 2

  • 時系列データは折れ線グラフで描く方がよいと思いますね。
    それはさておき,まず,データがちゃんと読めているか確認してくださいね。前の部分に挙げられた1変数データファイルには欠損値があるようですが,欠損値は NA で埋めておいてくださいね(後ろに挙げられたデータにも欠損値有り?)
    データの引用法について調べてくださいね。バープロットで描くのなら,以下のように。
    barplot(x[,2], names.arg=x[,1]) # programmed by 一言居士
    画面を区切って複数のグラフを描く方法は,layout を調べましょう。 -- 一言居士 2008-08-31 (日) 15:23:25
  • ご教示ありがとうございました、棒グラフ出来ました、この後複数のグラフ表示トライしてみます。 -- マーサ? 2008-09-01 (月) 22:05:07

stepwise法におけるupper,lowerの設定

basel? (2008-08-28 (木) 15:50:56)

ans<-step(glm(y~x,data=df)
とステップワイズ法を実行するとき、上・下限値の設定の仕方を、どなたかご教授願います。
sasでいうところのslentry,slstayをどのようにコメントすればよいのでしょうか

  • ? step として,ヘルプを読むと,そういう機能を指定する引数はないことがわかると思います。 -- 一言居士 2008-08-28 (木) 17:57:22
  • helpでscopeというところにそれらしいことが書いてあったような・・・ -- basel? 2008-08-28 (木) 18:23:40
  • それは違う -- 一言居士 2008-08-28 (木) 18:49:48

日本語を含むEPSファイルをGhostscript7.07で表示できない

Koichi? (2008-08-22 (金) 01:09:40)

Windows XPでR 2.6.2を使用しております。以下のようにしてRから
出力したEPSファイルが、Ghostscript7.07で表示できず(TeX文書
に貼り付けることができず)困っております。

plot(0,main="ほげ")
dev.copy2eps(file="c:\\hoge.eps", family="Japan1Ryumin")

Ghostscript 8.63では表示できるのですが、できればまだ8.xxには
移行したくありません。7.07の設定が悪いのかと思って、試行錯誤
しているのですが、なかなか上手く行きません。現在のCIDFnmapの
中身は以下のようになっています。

/Ryumin-Light      /MS-Mincho        ;
/GothicBBB-Medium  /MS-Gothic        ;
/HeiseiMin-W3      /Ryumin-Light     ;
/HeiseiKakuGo-W5   /GothicBBB-Medium ;
/MS-Mincho         (msmincho.ttc) 1  ;
/MS-Gothic         (msgothic.ttc) 1  ;


GS7.07の設定のヒント、あるいは、「うちではGS7.07でも
ちゃんと見えているよ」といった情報等、教えていただけ
ましたら幸いです。

なお、GS7.07のエラーは以下のようなものがでています。

Error: /undefinedresource in --findresource--
Operand stack:
   Ryumin-Light-Bold   basefont-H   .basefont-H   Identity-H
  --nostringval--   CMap   Identity-H   CMap   Identity-H
Execution stack:(後略)
  • PostScript?以外をお使い頂くか, gsをバージョンアップするかの何れかを選んでください. -- なかま 2008-08-22 (金) 17:27:26
  • ご返信ありがとうございます。その後もう少し試行錯誤してみたのですが、結局gsをバージョンアップしました。 -- Koichi? 2008-08-23 (土) 22:45:15

ロジスティック回帰におけるステップワイズ法

basel? (2008-08-20 (水) 17:46:59)

glmのリンク関数"logit"で変数選択する場合、ステップワイズ法を利用したいのですが、どのようにすればよいのでしょうか?
ans<-glm(y~x1+x2...xn,family=binomial(link="logit"),data=df)
この例でいうとどのようにすればよいのでしょうか?

  • step(ans) とするだけ。。。 -- 2008-08-20 (水) 21:24:47
  • ありがとうございました。m(_ _)m -- basel? 2008-08-21 (木) 10:15:17

ベクトルの要素を並べ替えたものをすべて書き出したい

初心者? (2008-08-19 (火) 11:04:26)

おそれいります。

あるベクトル
x <- c(rep(1,19),rep(0,6))
から、すべての要素を並べ替えたリストを作成したいのです。

どうすればよろしいでしょうか。
よろしくおねがいいたします。

  • つまり、考えうるすべての組み合わせ(=25C6)のリストということです。 -- 初心者? 2008-08-19 (火) 11:42:59
  • 25C6ならcombinationsです。
    a <- c("a","b","c")
    apply(combinations(length(a),2),1,function(x,y) y[x], a)
    ということですか? -- akira? 2008-08-19 (火) 11:46:10
  • 素早いご返事ありがとうございます。しかし、combinations を使うと、「エラー: オブジェクト "combinations" は存在しません」となります。パッケージをインストールしなくてはいけないでしょうか。書き忘れましたが、OSはWindows XPで、 Rのバージョンは 2.7.1 です。 -- 初心者? 2008-08-19 (火) 12:03:33
  • 自己解決しそうです。gtoolsパッケージをインストールして、permutations(2,5,c(0,1),repeats=TRUE) で目的のことに近づいてきました。説明不足ですみませんでした。ただし、これではダブルカウントで相当多くなってしまいます。 -- 初心者? 2008-08-19 (火) 13:11:04
  • combn(25,6, function(x) {y <- numeric(25); y[x] <- 1; return(y)}) # programmed by 一言居士 -- 一言居士 2008-08-19 (火) 14:32:41
  • ありがとうございました。助かりました。combnでこんな使い方ができるんですね。 -- 初心者? 2008-08-20 (水) 12:35:01

標準入力を行う関数

one? (2008-08-14 (木) 22:34:42)

お世話になります。
print()でYesかNoの入力をユーザーに促し、switch()で処理を分岐させたいと考えていますが、キーボードから入力する関数が見つかりません。
C言語ならscanf()で標準入力ができますが、Rでそれに相当するような関数はないでしょうか?ご教授よろしくお願いします。

環境はWindows R 2.7.1です。

  • ある。readline とか,readLinesとか?すきなものをどうぞ。今回の要望とは違うけど menu なんてのもあるし,その他いっぱい(うそ)ある。 -- 一言居士 2008-08-14 (木) 22:43:18
  • ありがとうございます。「標準入力」で検索しても見つからなかったので困っていました。 -- one? 2008-08-15 (金) 06:34:19

経験分布のP値

sh? (2008-08-14 (木) 03:17:04)

観測データ全体のうち、興味ある値以下のものの「比率」を求めるには、例えば、

set.seed(1)
x <- sort(rnorm(200))
ecdf.x <- ecdf(x)
ecdf.x(0.23)

としますが、より正確な「確率値(P-value)」を求めるにはどうすればよろしいでしょうか?
References: (1) 階段関数、経験分布関数 - RjpWiki, (2) 正規性の検定(経験分布関数の作図), (3) 経験分布関数 - ryamadaの遺伝学・遺伝統計学メモ

  • どういう意味で「より正確な」というのでしょ?最尤推定値が一番正確でしょ?それに,最尤推定値を求めるなら,ecdf なんか使う必要ある?mean(x<0.23)で同じ値出るでしょ?
    それと,あなたが求めたいといっているのは,P-value じゃないですよ。P value と確率値というのも同じものじゃないですよ。
    あなたがやりたいこと,やろうとしていることをもう少し,正確に述べた方がよいですよ。Reference は何の意味で挙げているの?自分はこういうところを見ましたということをいっているだけなのかな?でも,そこで何を学んで何が分からないのかというのをまとめてくれる方が,回答者には役立つでしょう。回答者にも同じ所を見てから答えてくれと言うのかしらん? -- 一言居士 2008-08-14 (木) 19:19:52
  • コメントありがとうございます。正確に述べず、大変失礼しました。「確率値」は「P-value」の日本語訳と思っておりました。以下のp-value計算例で、ecdfを使う代わりに最尤推定値を求めるにはどうすればよろしいでしょうか?。
    set.seed(1)
    x <- rnorm(130) 
    y <- rnorm(80) 
    (p.val <- 1 - ecdf(y)(x))
    Reference: R help archive: Re: [R] Rank-based p-value on large dataset より一部改訂 I have 80 values (call them y) that I am using as an empirical distribution and I want to find the p-value of 130 points (call them x) from the empirical distribution. -- sh? 2008-08-15 (金) 00:28:13
  • 先に示した mean(x<0.23)を吟味していないね。今回のだって,それが分かれば答えは明確。sapply(x, function(i) mean(y>=i)) だけでよい。ecdf なんか,いらない。
    ecdf が何をするものなのかわかりますか?plot(ecdf(y)) とやってみればよい。y<a を満たす個数,およびその割合を求めるのに,ecdf が不要であることがよく分かる。 -- 2008-08-15 (金) 07:23:47
  • その質問の大元を見なかったんですか?http://tolstoy.newcastle.edu.au/R/help/05/03/0223.html 質問者自体が p.val[i] = sum(y>x[i])/length(y) という答えを持っている。右辺は mean(y>x[i]) ということだし,これを for ループでやるのを sapply にしただけ。
    なお,質問者が p-value という用語を使っているのは,まさに質問者は P value を求めたいのだ。つまり x は 検定統計量だろうから。 -- 一言居士 2008-08-15 (金) 07:31:35
  • Referenceの質問者は計算時間を縮小する方法を質問しています。私は経験分布を用いて(サンプルサイズが小さいときでも)より正確なp-valueを求める方法をお尋ねしたかったのです。-- sh? 2008-08-15 (金) 22:33:04
  • 最尤推定値を求めて、正確なP-valueを求める方法がわかりません。例えば、set.seed(1); x <- sort(rnorm(200)); mean(density(x)$x<0.23) は正しい方法でしょうか?アドバイスをよろしくお願いします。-- sh? 2008-08-18 (月) 01:30:11
  • 母分布が正規分布のとき,0.23より小さいものの確率(母比率)を,大きさ200の標本から推定しようということですね?
    母比率は,
    > pnorm(0.23)
    [1] 0.5909541
    ですが,標本の大きさを200,2000,20000,200000,2000000,20000000 としてやってみると,
    > sapply(200*10^(0:5), function(n) {set.seed(1); x <- sort(rnorm(n));  
      mean(density(x)$x<0.23)}) # programmed by 一言居士
    [1] 0.5214844 0.4941406 0.5527344 0.5371094 0.5234375 0.5175781
    ということになり,母比率とはずいぶん異なるようです。
    標本の大きさを200に固定して20回やってみると,
    > sapply(1:20, function(n) {x <- sort(rnorm(200)); mean(density(x)$x<0.23)})
     [1] 0.4941406 0.5449219 0.5664062 0.5000000 0.5468750 0.6015625 0.5468750
     [8] 0.5761719 0.5156250 0.5136719 0.5273438 0.5175781 0.5117188 0.5292969
    [15] 0.5566406 0.5507812 0.5625000 0.5234375 0.5488281 0.5820312
    いつも,あんまり良い推定値ではないですね。 -- 一言居士 2008-08-18 (月) 09:40:16
  • アドバイスありがとうございます。mean(density(x)$x<0.23)よりもmean(x<0.23)を用いた方が良い推定値が得られるようですね。 -- sh? 2008-08-18 (月) 11:18:09
    > pnorm(0.23)
    [1] 0.5909541
    > summary(sapply(1:100, function(n) {x <- sort(rnorm(200)); mean(density(x)$x<0.23)}))
      Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.4395  0.5059  0.5215  0.5283  0.5439  0.6465 
    > summary(sapply(1:100, function(n) {x <- sort(rnorm(200)); mean(x<0.23)}))
      Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    0.5050  0.5750  0.5950  0.5964  0.6162  0.6800 

特定の係数値だけを取り出したい

Saito? (2008-08-12 (火) 17:02:22)

似たような質問がないか探しましたが、見当たらなかったので質問させてください。回帰分析の結果で、特定の変数の係数値を取り出すときには手動でやる以外に方法はないのでしょうか?例えば以下のような場合です。

set.seed(1)
a=rnorm(10,0,1)
b=rnorm(10,2,3)
c=lm(b~a)
coef(c)#aの係数だけを取り出したいとする。
coef(c)[2]#手動でaの係数の番号を指定して抽出

この場合ですと[2]という指定を手動で行っています。しかしこの方法ですと係数が多くなってきたときや、独立変数を変えたときなどに指定の番号を間違う恐れがあります。$や@などを使って色々試したのですが上手い方法を見つけられませんでした。どなたか方法をご存知でしたらご教授していただけないでしょうか。なお、OSはWindowsXp?でバージョンはR.2.7.0です。

  • 要するに,foo という変数に対する係数を取り出したいと言うことですか?coef(bar)["foo"]でよいでしょう。あなたの質問への回答なら,coef(c)["a"]。隠し業ではなく,要素の参照法として,明記されている方法です。 -- 一言居士 2008-08-12 (火) 17:43:18
  • 回答ありがとうございます。明記されていたのですか。私のリサーチ不足でした。申し訳ありません。 -- Saito? 2008-08-12 (火) 18:08:48

ubuntuでのグラフィックデバイスの利用

myuhe? (2008-08-04 (月) 19:32:30)

ubuntuでrjpwiki内の次のページ(http://www.okada.jp.org/RWiki/?R%20%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB#pbac840c)を参考にr-baseとr-base-devをインストールしました。
インストール後、Rの起動はできたのですが、plot()などでグラフィックを描画しようとすると、次のようなエラーメッセージが出てグラフが出力されません。
 "以下にエラー plot.new() : 存在しないデバイスにプロットしようとしました"
linuxに関しては、最近使い始めたばかりで、もしかするとOSに依存した問題なのかもしれませんが、どうしても解決しないため、質問させていただきました。
 解決法について、ご存知の方いらしたら、ご教示ください。
 なお、環境は以下のとおりです。
os:ubuntu8.04 ※winXPとのデュアルブート
Rver2.7.1
(追記)sessioninfo()の出力結果を載せておりませんでしたので、載せておきます。

attached base packages:~
[1] stats     graphics  grDevices utils     datasets  methods   base~
  • すみません。自己解決しました。plot.new()で呼び出しておけば良かったのですね。これまでWinユーザだったため、勝手がわかっておりませんでした。 -- myuhe? 2008-08-04 (月) 20:16:57
  • 私は似たような環境(os:ubuntu7.10 ※winXPSP2とのデュアルブート)で、問題なく行きますが…
    > sessionInfo()
    R version 2.6.1 (2007-11-26) 
    i486-pc-linux-gnu 
    locale:
    LC_CTYPE=ja_JP.UTF-8;
     LC_NUMERIC=C;
     LC_TIME=ja_JP.UTF-8;
     LC_COLLATE=ja_JP.UTF-8;
     LC_MONETARY=ja_JP.UTF-8;
     LC_MESSAGES=ja_JP.UTF-8;
     LC_PAPER=ja_JP.UTF-8;
     LC_NAME=C;LC_ADDRESS=C;
     LC_TELEPHONE=C;
     LC_MEASUREMENT=ja_JP.UTF-8;
     LC_IDENTIFICATION=C
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    loaded via a namespace (and not attached):
    [1] rcompgen_0.1-17
    家のPCが8.04&R2.7.1だった(でもdual bootでない)と思いますので、確認してみます。 -- akira? 2008-08-04 (月) 20:48:51
  • 私の環境では問題ないです。
    > sessionInfo()
    R version 2.7.1 (2008-06-23) 
    i486-pc-linux-gnu 
    locale:
    LC_CTYPE=ja_JP.UTF-8;
     LC_NUMERIC=C;
     LC_TIME=ja_JP.UTF-8;
     LC_COLLATE=ja_JP.UTF-8;
     LC_MONETARY=C;
     LC_MESSAGES=ja_JP.UTF-8;
     LC_PAPER=ja_JP.UTF-8;
     LC_NAME=C;
     LC_ADDRESS=C;
     LC_TELEPHONE=C;
     LC_MEASUREMENT=ja_JP.UTF-8;
     LC_IDENTIFICATION=C
    attached base packages:
    [1] stats     graphics  grDevices utils     datasets  methods   base     
    ubuntu8.10です。 -- akira? 2008-08-05 (火) 00:35:59
  • 有用な情報ありがとうございます。う〜ん、なぜすんなりいかないでんしょうか・・・気になるので、再度試してみます。 -- myuhe? 2008-08-05 (火) 09:41:40
  • 他のデバイス(pdfとか、bmpとか)もダメですか?もしかして、Rの再インストールで解決したりしませんか? -- akira? 2008-08-06 (水) 00:00:24

WIN版Rで、RCMD BATCHのoutfileの文字コード変更

okinawa (2008-08-01 (金) 13:28:17)

いつもお世話になってます。okianwaです。
windowsXPSP2、R2.5.1でRCMD BATCH infile.r outfile.txtを実行した場合、SJISでoutfile.txtが吐き出されます。これを、UTF-8でoutfile.txtを吐き出そうと思い、--encoding="utf-8" の指定をしたのですが、SJISのままでした。
なにか良い方法はありませんでしょうか?よろしくお願いいたします。

  • encodingはstdinの指示だけです. sink(...,encoding="UTF-8")とか, nkfやiconvとか, そもそも, なんで"UTF-8"で出したいのかとか. -- なかま 2008-08-01 (金) 17:52:24
  • やはりstdinだけでしたか・・・。なぜUTF-8で出したいかというと、仕事でWebからRを利用する(batchで)プログラム作ってまして、web側の開発者から「UTF-8ではけないの?Rって色々できるけど結構しょぼいね・・・」みたいに言われてムキー!となった次第です。取り乱してすみません。(^_^;) -- okinawa 2008-08-02 (土) 08:38:27
  • 設計に無理があると思いますが.... -- なかま 2008-08-02 (土) 10:49:22

グラフの背景色の設定について

99? (2008-08-01 (金) 06:45:49)

グラフ作成時にグラフの背景色を好きな色に塗りつぶすにはどうしたらいいのでしょうか?枠や値のプロットは好きな色に設定できるのですが、背景色も設定できるのでしょうか?

  • ?windowsとかした? -- akira? 2008-08-01 (金) 09:23:40
  • windows?といいますと??? -- 99? 2008-08-01 (金) 12:34:53
  • 貴方の動作環境がMacOSXならば,?windowsは機能しないでしょう。?quartzとしてみてください。 -- 2008-08-01 (金) 15:35:17
  • 各デバイスの作成時に決まりますので, plot.newでsetHookさせて, parにbgを渡すと上手なプログラムが書けるでしょう. あなたの環境がわからないので, なんですが, みなさんは貴方に ``help(options()$device)'' を実行しろと言っています. -- なかま 2008-08-01 (金) 18:02:49
  • ありがとうございます。できました。御迷惑お掛けしました。 -- 99? 2008-08-01 (金) 18:32:45

read.tableでの不具合

basel? (2008-07-31 (木) 12:53:10)

csvファイルをread.tableで読み込んだあと、fixで内容を確認するとデータの全てが1列目にデータ読みこまれてしまいます。
どのようにしたら良いのでしょうか?

  • csvはread.csv()じゃないの? -- 2008-07-31 (木) 14:01:39
  • read.csv は read.table のシュガーコートなんだから,オプションをちゃんと設定すれば問題ない -- 一言居士 2008-07-31 (木) 14:24:44
    > read.csv
    function (file, header = TRUE, sep = ",", quote = "\"", dec = ".", 
        fill = TRUE, comment.char = "", ...) 
    read.table(file = file, header = header, sep = sep, quote = quote, 
        dec = dec, fill = fill, comment.char = comment.char, ...)
    <environment: namespace:utils>
  • 質問したら,結果について反応をするのは礼儀でしょう。どうでもよい質問ならしないこと。色々な事情で回答が遅れたというのは,いいわけでしょう。すぐにも答えが知りたいなら,それこそ,10分おきにでも回答があるか見るはず。 -- 一言居士 2008-07-31 (木) 22:14:07

fileでのエラー

basel? (2008-07-29 (火) 12:54:02)

a <- file("ファイル名", open="r" encoding="cp932")
を実行すると、
「以下にエラーfile("c/:ファイル名", open="r" encoding="cp932"):
    コネクションを開くことができません
追加情報:Warning message:
ファイル"c/:ファイル名"を開くことができません。理由は'Invalid argument"です in:file("c/:ファイル名", open="r" encoding="cp932")

というエラーが出てしまいます。

単純に
a <- read.table("c/:ファイル名")
ですと、
「以下にエラーfile(file, "r"):コネクションを開くことができません
追加情報:Warning message:
ファイル"c/:ファイル名"を開くことができません。理由は'Invalid argument"です in:file(file, "r" )
というエラーが出てします。

単純な質問ですが、よろしくご教授願いいたします。

  • x c/: o c:/ -- 2008-07-29 (火) 13:01:32
  • ありがとうございました. -- basel? 2008-07-29 (火) 16:22:40
  • ところで Invalid argument とはどのようなエラーなんでしょうか? -- basel? 2008-07-29 (火) 16:24:17
  • 引数 argument が,妥当でない invalid ということ。"c/:ファイル名" というのは,*W*i*n*d*o*w*s*で*は*パス名として認められない(不適切である)ということ。 -- 一言居士 2008-07-29 (火) 16:51:07

一部の全角記号がクリップボード経由でメタファイルコピーすると化ける

せーだ? (2008-07-24 (木) 13:59:09)

WinXP Pro で R-2.7.1 を使っており、
以前から C:/Program Files/R/R-2.x.x/etc の中で
Rconsole の Font セクション(19行目付近)を

font = TT MS Gothic


に、Rdevga の TT Arial の部分を全て TT MS Gothic に修正しています。

この状態で『〜』(から)や『−』(全角マイナス)など一部の全角記号を
含むグラフを作成し、クリップボードにメタファイルでコピーしたものを
パワーポイントに貼ると、その記号だけ『?』に化けます。
例えば以下のようなコードです。

plot(sin, main="ほげ〜−ふが")


このような現象は R-2.6.2 までは発生しませんでした。
なお、メタファイルを別ファイルとして保存したものはパワーポイントに
問題なく取り込めます。
解決策をご存知の方がいらっしゃれば、どうか御教示下さい。宜しくお願いします。

  • パワーポイントで、編集 - 形式を選択して貼り付け - 拡張メタファイル でどうですか? -- 2008-07-24 (木) 15:18:56
  • あ、できた…。2.7系に上げたら問題が発生したという部分は気になりますが、当面この方法で対処します。ありがとうございました。 -- せーだ? 2008-07-24 (木) 15:27:22
  • Unicode化の過程で現在部分的な拡張を行っているので当分の間、不具合は多いと思います. 非常に地味な作業になるので,まとまった時間がとれれば良いのですがなかなかそうもいきません..., -- なかま 2008-07-24 (木) 16:17:42
  • 2.9.0では解決されているようです。CHANGES IN R VERSION 2.9.0のWindows-specific changes to Rによると次の記述があります。-- せーだ? 2009-04-20 (月) 11:28:21
o iconv() is now done by a version of Yukihiro Nakadaira's
  win_iconv rather than by libiconv.  This version is based on
  Windows' codepages and is not quite as comprehensive as
  libiconv: it is however much smaller and easier to maintain.
  The implementation here is 100% compatible: you can drop in
  libiconv's iconv.dll as a replacement if you need it, from
  http://www.stats.ox.ac.uk/pub/Rtools/Riconv.dll.

pdf( ) で右寄せがずれます

吉原? (2008-07-24 (木) 02:17:25)

Windows XP で R version 2.7.0 を使っています。
図の中に text() を使って注釈を書き、右端でそろえようとしたのですが、若干ずれが生じます。
いろいろ試したところ、次のようなことがわかりました。

pdf() を使うと問題が生じる。
大文字の Y を使うと問題が生じる。(他にもあるかもしれません)

例えば You という単語が入ると症状が顕著です。

pdf('You.pdf', width=11, height=8.5)
plot(0,0,xlim=c(0,1),ylim=c(0,1),type='n')
abline(v=.5)
text(0.5,0.9, 'You', pos=2)
text(0.5,0.8, 'You You', pos=2)
text(0.5,0.7, 'You You You', pos=2)
text(0.5,0.6, 'You You You You', pos=2)
text(0.5,0.5, 'You You You You You', pos=2)
text(0.5,0.4, 'You You You You You You', pos=2)
text(0.5,0.3, 'You You You You You You You You', pos=2)
dev.off()


postscript() では同様の問題は見られませんでしたので、.ps ファイルを .pdf に変換するなどの解決法はありますが、根本的に何が問題なのかが気になります。
よろしくお願いします。

  • あなたが, もしAcrobatをお使いなら[ファイル]-[プロパティ]を開いて[フォント]タブを見てみてください. 代替フォントが使われているために位置がずれているだけです. 必要なフォントをインストールするか, PDF作成時にフォントを指定する事で問題は無くなると思います. postscriptで問題が無かったのは, そのフォントを認識したビュワーが表示してくれただけです. フォントに関しては本当に緻密な作業が行われているので, 自由になるフォントが無くていいかげんな(欧文に比べて)実装しか提供出来なかったのを酷く残念に思っています. CIDフォントを使う場合は私が決めた半角幅に強制されるので, fixedフォント替わりにもなるので嬉しいかもしれません. 普通の欧文フォントなら, MやYは幅が広くIは狭いです. -- なかま 2008-07-24 (木) 11:20:59
  • なかま様。早速のご回答どうもありがとうございました。Acrobat の設定などをふくめていろいろ試してみます。 -- 吉原? 2008-07-24 (木) 14:16:25
  • これは困った問題ですね。dvipdfmxでPDF化する際には図もPDFで読み込むほうがGhostscriptを呼び出さないのでずっと速いのですが,現状では右揃えや中央揃えがうまくいかないということですね -- 奥村? 2008-09-15 (月) 22:48:22
  • いえ, pdf('You.pdf', family="Courier") で作れば Acroread8では "CourierStd?" を使いますので, ずれません. CID(family="Japan1GothicBBB"とか)も幅を固定しているので, ずれることは無いと思います. デフォルトのフォントの問題と言うのは解決出来ないと思うのですが... -- なかま 2008-09-17 (水) 21:53:08
  • Courierのような等幅フォントにしか対応していないということですね。できればHelveticaのようなプロポーショナルフォントにも対応していただければEPSを経由しないPDFオンリーのワークフローが可能なのですが。 -- 2008-09-18 (木) 05:17:47
  • Resource/Font/Z[XY]______.PFB(AdobeSansMM,AdobeSerifMM)から, その配下のPFMを元(拡張子は小文字に直して)に pf2afmで AFMを作成して, -- なかま 2008-09-18 (木) 13:11:20
    pdfFonts(AdobeSansMM=Type1Font("AdobeSansMM",rep("/tmp/ZX______.afm",4)))
    pdf("hoge.pdf", family="AdobeSansMM")
    等とすれば, 等幅では無い物で, 何処に持っていっても問題の無いPDFにはなると思います.
  • 2.8.0以降ではこの問題は発生しません. -- なかま 2008-10-01 (水) 10:03:23
  • なかま様,ありがとうございます m(__)m -- 奥村? 2008-10-04 (土) 10:46:36
  • あれ,2.8.0には入らなかったのでしょうか -- 奥村? 2008-10-23 (木) 13:26:38

誤植でしょうか?

匿名? (2008-07-23 (水) 13:20:31)

五章P106の一行目に表示されているコマンド

jp.ar<-ar(djpMacro, method="ols")

これを打ち込んだところ、以下のエラーが発生しました。

以下にエラー if ((dimension < 1) | (dimension > n)) stop("wrong embedding dimension") : 
  引数の長さが0です 
追加情報:  Warning messages:

1: In log(det(varEm - order.min + 1?)) : 計算結果が NaN になりました
2: In ar.ols(x, aic = aic, order.max = order.max, na.action = na.action, :

  モデルの次数:  18 特異値が射影行列の計算中に生じました。  結果はモデル次数までしか適正ではありません: 17

誤植でしょうか?

http://d.hatena.ne.jp/haruosuz/

ここでは、誤植と紹介されているのですが…

  • 見ればわかるとお思いかも知れないが,本の名前くらい書いておいたら?
    それと,自分の環境もね(OS と R のバージョン) -- 一言居士 2008-07-23 (水) 13:26:01
  • たしかに…申し訳ありません。OSはXPでRのバージョンは2.7.1、本の種類はtheRbook(岡田昌史著)です。よろしくおねがいします。 -- 匿名? 2008-07-23 (水) 14:21:28
  • jp.ar = ar(djpMacro) で正常に動作しませんか? -- 2008-07-26 (土) 15:46:45

オブジェクトの名前を得る関数

karat? (2008-07-18 (金) 01:03:54)

関数に因数としてオブジェクト(例えばデータフレーム)を渡し、
そのオブジェクトの名前を得たいとき、どのような関数を使えばいいのでしょうか?
例えばfoobarがデータフレームだとして、nantarakansu(foobar)と渡し、
nantarakansuの中で"foobar"が欲しいのですが。超初心者質問で恐縮です。

  • deparse(substitute(x)) # programmed by 一言居士 -- 一言居士 2008-07-18 (金) 09:34:15
  • データフレームにcomment付けてごまかしていた自分が恥ずかしいです。。深謝します! -- karat? 2008-07-18 (金) 10:18:45
  • データフレームにcomment付けてごまかしていた自分が恥ずかしいです。。深謝します! -- karat? 2008-07-18 (金) 12:44:10

無題

山田? (2008-07-16 (水) 16:55:08)

相互相関関数のそれぞれのラグにおけるACFの値を知るにはどうすればよいですか?

  • 警告!あなたの行為はマルチポストと呼ばれ「嫌われる行為」です。 -- 一言居士 2008-07-18 (金) 09:43:13

リスト要素を横方向へ出力する方法

Neo? (2008-07-12 (土) 01:41:10)

こんにちは。
 A B
 1 2
 4 5
というa.txtというファイルと

A	B	C
qw	2	3
we	5	6
se	8	9

というb.txtというファイルがあるとします。

c <- as.list(NULL)
c[[1]] <- a
c[[2]] <- b

としてリストcを

 A	B     A	        B	C
 1	2     qw	2	3
 4	5     we	5	6
             se	8	9

このように横方向にファイルに保存したいのですが、どのようにすればよいでしょうか?write()やlapply()をうまく使えばできそうだなとは思うのですが、なかなか良い方法が思いつきません。
どうかよろしくお願いします。

  • nrowが違うとエラーになることで困っているのですか?冗長でも良いなら難しくないですよ。
    write.table(cbind(rbind(x,NA),y),file="hoge",row.names=FALSE)#足りない分はNAで継ぎ足す
    nrowがリスとの要素ごとに違うなら、nrowの最大値を予め調べておいて、
    nr <- max(sapply(c,nrow))
    x <- matrix()
    for(i in seq(c)){
     if(nrow(c[[i]])<nr) c[[i]][seq(nrow(c[[i]])+1,nr),] <- NA
     x <- cbind(x,c[[i]])
    }
    write.table(x[,-1], file="hoge",row.names=FALSE)
    とか。上手い方法は他にあると思いますが。 -- akira? 2008-07-12 (土) 09:25:34
  • cc<-unlist(c, recursive=F);lmax<-max(unlist(lapply(cc,length))); ccc<-data.frame(lapply(cc,`length<-`,lmax)) -- なかま 2008-07-12 (土) 11:32:39
  • なるほど!lapply(cc,`length<-`,lmax)ですか。私は未だに'<-'を使いこなせてないですね。 -- akira? 2008-07-12 (土) 17:42:49
  • いえ, lapply(cc,function(x){length(x)<-lmax;x}) と普通に書いた方がいいんですよ. トリックはイカレタオヤジの罠ですから. 普通なら「何?これ?」って思うでしょう? Rはパズルですから. -- なかま 2008-07-12 (土) 22:47:50
  • すばらしい方法ありがとうございます。しかしakira様の方法は理解できるのですが、なかま様の`length<-`というのは何を意味しているのでしょうか?初めて見る方法なので、よろしければご説明していただけないでしょうか? -- Neo? 2008-07-13 (日) 02:27:47
  • すばらしい方法ありがとうございます。しかしakira様の方法は理解できるのですが、なかま様の`length<-`というのは何を意味しているのでしょうか?初めて見る方法なので、よろしければご説明していただけないでしょうか? -- Neo? 2008-07-13 (日) 08:51:13
  • `length<-`(x,value) は length(x)<-value と等価なんです. 実際, `length<-`と言う関数が作成されています. さらに実行する環境(function(x){})分の節約を行っています. -- なかま 2008-07-13 (日) 10:06:09
  • なるほど。<-にそういう使用法もあるのですか。勉強になりました。ところでもとのデータフレームa,bのなかにNAが含まれている場合、リストを結合する際に補われたNAと見分けがつきにくくなってしまいますよね?NAではなくて空文字で補って結合することは不可能なのでしょうか?akira様のプログラム中の”NA ”を""や ”NULL"に置き換えてみたけれどできませんでした。また、なかま様の方法では自動的にNAが補われているようですが、それを空文字に指定することは可能でしょうか?たびたびすみませんが、ご回答をよろしくお願いします。 -- Neo? 2008-07-13 (日) 14:50:01
  • 数値(double)ベクトルにおいてはInf,NaN,-Inf,数値,NA以外は扱えません. 数値(integer)の場合は数値,NA以外は扱えません. 変換規則では, ""を数値に変換するとNAになります. R曰く「我々はデータフレームだ, お前たちを同化する, 欠損値はNAにする, 抵抗は無意味だ.」と申しております. -- なかま 2008-07-15 (火) 09:22:12
  • 元データのNAと区別したい状況がわかりにくいのですが、空欄を空文字("")で補完するとデータがnumericからcharacterになりませんか?それでも良いなら元のNAをcharacterで補完してしまえばどうですか?でも、小数点とか変わるでしょうし、区別する必要がないなら、出力でna=""にした方が良いのでは? -- akira? 2008-07-16 (水) 07:35:34

Mac版R.app GUIでのキーボードショートカット

ara? (2008-07-08 (火) 15:46:53)

Mac版RをMac OS X 10.4.11(PowerBook? G4)で使用しています。
R.app GUIで、これまでコマンドラインでの行頭・行末への移動はコマンド(アップル)キー+左右カーソルで行っていましたが、R2.7.0以降(2.7.1も)では一旦Quartzデバイスを開くとこのコンビネーションが効かなくなってしまいます。言語設定を英語に切り替えても同様の症状が出てしまいます。ctrlキー+左右カーソルやctrl+A or Eでもジャンプできるのですが、慣れてしまっているもので・・

どなたか対処方法をご存じないでしょうか?

  • Mac OS X 10.5.4 だとできますけど? -- 2008-07-08 (火) 16:44:54
  • 情報ありがとうございます。MacでRを使っている人が身近にいないので、ほかのMacでも同じ現象が表れるかどうか知りたかったのですが、OSのバージョンのせいかもしれませんね。 -- ara? 2008-07-11 (金) 17:56:26
  • 同じくIntel版Max OS X10.4.11でR2.7.1です。確かにQuartzデバイスを起動後コマンド+左右が効かなくなりました。10.4.11特有なのでしょうか。 -- TAG? 2008-07-17 (木) 14:43:20

行明と列名の変更・削除方法について

kokko? (2008-07-06 (日) 22:15:54)

行名と列名の変更・削除方法について教えてください。
以下のようなデータフレームが変数aに格納されているとします。

   A  B  C
a  1  2  3
b  4  5  6
c  7  8  9


ここでa,b,cは行名、A,B,Cは列名です。
これらの行・列名を変更するにはどうすればよいのでしょうか?

たとえば

   D  E  F
d  1  2  3
e  4  5  6
f  7  8  9


のようにしたいです。また、特定の行・列名だけを削除して

   A  B   
a  1  2  3
   4  5  6
c  7  8  9


のようなデータフレームを作成することはできるでしょうか?
よろしくお願いします。

使用環境 Mac OS X 10.5.4、R 2.7.0

  • colnames(a) <- c("A","B","") ; rownames(a) <- c("a","","c") #これでいけると思います。 -- keiji? 2008-07-07 (月) 08:28:36
  • colnames(a) <- c("A","B","") ; rownames(a) <- c("a","","c") #これでいけると思います。 -- keiji? 2008-07-07 (月) 08:28:57
  • ここを勉強されるのが良いと思います。 -- akira? 2008-07-07 (月) 08:32:04
  • 上記されてますが、rownames(),colnames()で「文字のベクトル」をdfに与えるだけです -- okinawa 2008-07-07 (月) 08:33:38
  • ありがとうございます。こんなに簡単な話だったんですね。rownames(),colnames()は関数なので、データフレームaの戻り値に対して代入しても無意味だと思い込んでいました。お手数おかけしました。 -- kokko? 2008-07-07 (月) 18:46:43
  • すみませんが、もう一つ質問させてください。教えてくださった方法だと、変更したくない行・列にも文字ベクトルを与えていますが、変更したい部分だけに行・列名を上書きすることはできないのでしょうか?colnames(a[,2]) <- c("A") とすれば2列目の列名"B"が"A"になると考えたのですが、なりませんでした。何か良い方法は無いでしょうか? -- kokko? 2008-07-07 (月) 22:03:56
  • colnames(a)[2] <- "A" -- 2008-07-07 (月) 22:21:06
  • 「関数なので、データフレームaの戻り値に対して代入しても無意味だと思い込んでいました」あぁそうか、言われてみればそうですね。これが「単なる変数」ではなく「オブジェクト」ということなんですね。いまさらながらに気づきましたよ。 -- okinawa 2008-07-08 (火) 08:27:57
  • colnames(a[,2]) ではだめで colnames(a)[2] としなければならないのですか・・・なかなか難しいですね。bennkyousimasu. -- 2008-07-08 (火) 21:29:22
  • colnames(a) がベクトルで,その2番目の要素が [2] ということですよ。その対象にある値を代入するというのですから分かりやすい。操作を実現している仕組みは複雑で我々には理解が難しいかも知れないけど,我々利用者にとっては,当たり前の操作をできるような実装になっているでしょう? -- 2008-07-08 (火) 21:38:08
  • a[,2]となった時点でベクトルになっているから、colnameを持たないのです。
    > x <- matrix(1:20,ncol=4,dimnames=list(1:5,1:4))
    > x
      1  2  3  4
    1 1  6 11 16
    2 2  7 12 17
    3 3  8 13 18
    4 4  9 14 19
    5 5 10 15 20
    > colnames(x)[2]
    [1] "2"
    > colnames(x[,2])
    NULL
    > x[,2]
     1  2  3  4  5 
     6  7  8  9 10 
    > names(x[,2])
    [1] "1" "2" "3" "4" "5"
    つまり、colnames()でなく、names()で出てきます。 -- akira? 2008-07-08 (火) 22:35:58

nls.control()について質問

森林? (2008-07-04 (金) 18:40:26)

非線形最小自乗当てはめの制御 nls.control()について質問です。
nls() 関数による非線形最小自乗法アルゴリズムの幾つかの特性をユーザが設定できるようですが、うまくいきません。
次のようにRコンソールで打ち込むと、

nls.control(maxiter=500)
$maxiter
[1] 500
$tol
[1] 1e-05
・・・・
と表示されるのに、nls( 式、data, star=・・・)を実行したとき、50回でとまります。
すなわち、maxiter=50のままです。いろいろ試したのですが、具体的な変更方法がわかりません。
どなたか、ご教示のほどお願いします。

  • ? nls の control の説明が an optional list of control settings. See nls.control for the names of the settable control values and their effect. となっていますので,ここで使うんですよ。つまり,
    nls(なんだら, control=nlscontrol(かんだら))
    つまり,control 引数が要求するリストを nls.control が返すので,それを引数に設定すると言うことです。 -- 一言居士 2008-07-04 (金) 18:51:38
  • 早速に有り難うございました。試したとき、指定通りに使いましたが、動かなかったので質問しましたが、やり直したら間違いなく変更できていました。 -- 森林? 2008-07-04 (金) 19:12:01
  • 早速に有り難うございました。最初に試したとき、指定の通りに使いましたが、動かなかったので質問しましたが、やり直したら間違いなく変更できました。何かが不具合だったのでしょう。すみませんでした。 -- 森林? 2008-07-04 (金) 19:13:24

文字列を数値に変換

masaki? (2008-07-03 (木) 17:38:59)

WindowsXPでR2.6.2を使用している者です。
JavaのpsrseIntメソッドのように、文字列を数値に変換する方法はありませんでしょうか?

具体的には、ある文字列(例:abc105)から正規表現を用いて、

x <- gsub(":lower:?+(:digit:?+)", "\\1", "abc105")

数値だけの文字列に置き換えます。このxを表示すると、

[1] "105"

となります。これを、ループで

for(i in 1:x){ 処理 }

のように用いたいのですが、文字列のため用いることができません。

正規表現の段階で数値型にする、xを文字列型から数値型に変換する、あるいは他の方法でもかまいませんのでお願いいたします。

  • as.integerとかas.numericとか -- 2008-07-03 (木) 17:54:06
  • 素早い回答ありがとうございます。うまくいきました。 -- masaki? 2008-07-04 (金) 08:56:23

複数のベクトルを1つにベクトルに合体させるには

田中? (2008-07-03 (木) 13:49:33)

n1<-c(1,2,3) n2<-c(4,5,6) n3<-c(7,8,9) →n<-c(1,2,3,4,5,6,7,8,9)のように複数のベクトルを1つのベクトルに合体させる方法を教えてください。

  • ↓で質問した者です。n <- c(n1, n2, n3); でどうぞ。 -- 2008-07-03 (木) 14:45:48
  • 基本的な質問ですみませんでした。初心者で助かりました。 -- -0.889? 2008-07-03 (木) 15:17:09

日本語(2バイト文字)が含まれた PDF ファイルの生成(Windows 版 R 2.7.1)

初心者? (2008-07-03 (木) 09:56:49)

Windows 版 R 2.7.1 を使用しているものです。以下の諸設定をして、日本語(2バイト文字)
が含まれた PDF ファイルを生成しようとしているのですが、上手く表示されません。

<C:\Program Files\R\R-2.7.1\etc>

Rdevga:12〜15行目を以下のように修正しました
TT MS Gothic : plain
TT MS Gothic : bold
TT MS Gothic : italic
TT MS Gothic : bold&italic

Rconsole:19行目を以下のように修正しました
font = TT MS Gothic

Rprofile.site:以下を追記しました
setHook(packageEvent("grDevices", "onLoad"),
        function(...) grDevices::ps.options(family="Japan1"))


もしよろしければご教授いただけませんでしょうか。

  • ps.optionsはPostScript?にフォントを設定しています. pdf.optionsを見てください. -- なかま 2008-07-03 (木) 10:34:00
  • 「上手く表示されません」だと具体的にどうなっているかわからないので的確な答えでないかもしれませんが,Rprofileの中でfunction(...)の後を{ }でくくってps.optionsと同様にpdf.optionsの行も加え,かつfamily="Japan1GothicBBB"に変えてみてください。それでも駄目なら高とか鴎の異体字(EUC-JPに無い文字)が出力できない問題だと思われますので,http://phi.med.gunma-u.ac.jp/memo2/20080623.htmlへのなかまさんのコメントにある対処をされると出力できると思います。 -- 中澤? 2008-07-03 (木) 10:36:25
  • ありがとうございます。下記命令で無事、文字化けしない出力がえられました。 -- 2008-07-03 (木) 12:44:33
    <C:\Program Files\R\R-2.7.1\etc>
    
    Rdevga:12〜15行目を以下のように修正しました
    TT MS Gothic : plain
    TT MS Gothic : bold
    TT MS Gothic : italic
    TT MS Gothic : bold&italic
    
    Rconsole:19行目を以下のように修正しました
    font = TT MS Gothic
    
    Rprofile.site:以下を追記しました(←ここを修正)
    setHook(packageEvent("grDevices", "onLoad"),
           function(...) { grDevices::ps.options(family="Japan1GothicBBB"); grDevices::pdf.options(family="Japan1GothicBBB") })


barplotのy軸と棒の下限の変更

sh? (2008-07-03 (木) 09:10:15)

barplot(2:10, ylim=c(1,10))

棒グラフのy軸の下限を1にしたのですが、棒は下限が1にならずに図の外にはみ出してしまいます。アドバイスをよろしくお願いします。

  • barplot(2:10, ylim=c(1,10), xpd=F) , try ?barplot, でもしないほうがよいのでは? -- なかま 2008-07-03 (木) 09:33:52
  • 期待通りに表示されました。ありがとうございました。 -- sh? 2008-07-03 (木) 10:48:02
  • なぜにして,c(1,10) ? おかしなことだ。 c(0,10) とするのが自然だし,正しいグラフを描くお約束。そうやればちゃんと描ける。 -- 一言居士 2008-07-03 (木) 12:42:26
  • *わざわざ*, はみ出すように作ってあるのが素敵なのに... -- なかま 2008-07-03 (木) 16:51:32
  • barplot の上の方だけ表示すると、本当は小さな差を大きく見せるのに使えますね。 -- 2008-07-03 (木) 22:44:11
    barplot(c(.89,.91,.92,.95), ylim=c(.88,.95),xpd=F,yaxt='n')
    axis(2,at=seq(.88,.95,.01),label=NA)
  • (参考)日本図表審査機構 [JGRO], 日常化するNHKの捏造棒グラフ, NHKの棒グラフ描画システムが機械的に世論を狂わせている可能性, 『正しい統計データ』を使ってウソをつく方法 -- 2008-07-04 (金) 01:57:09
  • ↑x2 その差が「小さい」という根拠はどこに??? 恣意的な印象操作は論外だと思うけど、意味のある差を意味のあるように見せることに問題はないと思うんですけどね。まあ、これはほとんど宗教戦争に近いものだと思うので、別ページを作って議論してみたいところ。 -- 2008-07-04 (金) 02:19:21
  • 差があるという基準はどういう風に決める?差があるとして,実際以上に差があるように見せるのも問題はないのか?原質問者のコメントを聞きたい。 -- 2008-07-04 (金) 11:02:32

ベクトル要素の総当たりの結合

田中? (2008-06-27 (金) 17:17:20)

x<-c(1,2,3)とy<-c(6,7,8)の要素の数字を総当たりで結合してz<-(16,17,18,26,27,28,36,37,38)のベクトルを作成したいのですが?

  • as.vector(t(outer(x*10, y, FUN="+"))) -- 2008-06-27 (金) 17:41:08
  • あえて,outer を使わない方法 rep(x*10, each=length(y))+y -- 2008-06-27 (金) 17:56:29
  • ありがとうございます。x*10no -- 2008-06-27 (金) 20:38:07
  • ありがとうございます。x*10の10は何を意味するのでしょうか?初心者ですみません。 -- 2008-06-27 (金) 20:40:32
  • xを10倍したものとyを足すと言うことですよ。rep(x*10, each=length(y)) は,(10, 10, 10, 20, 20, 20, 30, 30, 30) というベクトルを作りますので,それに (6, 7, 8) というベクトルを足します。足されるベクトルが短いので,リサイクルされて(頭から繰り返されて)結局は,(6, 7, 8, 6, 7, 8, 6, 7, 8) というベクトルを足します。ベクトルの足し算は,対応する要素ごとの足し算になるので,結局は求めたいものが求まりますね。-- 2008-06-28 (土) 00:28:11
  • 本当に親切に説明いただき、感謝いたします。 -- 2008-06-28 (土) 10:09:43

sspirの使い方について

ichigo? (2008-06-25 (水) 12:26:50)

Rのパッケージ「sspir」を使って状態空間モデルを扱いたいのですが
(株価などで)
どうも使い方がいまひとつわかりません.
このサイト内を検索したところ恐ろしいらしいページに一件記事がありましたが
特に話題が広がるわけでもなく、終わっていました.
詳しく書いてあるサイトなどご存知でしたら、教えていただけませんでしょうか.
よろしくお願いいたします.

  • ググってみましたか? sspir と R の二語でググったら,
    http://hosho.ees.hokudai.ac.jp/~kubo/ce/TimeSeriesData.html というのもあり(ああ,久保さんの所だ),そこに,
    Journal of Statistical Software にこの package のくわしい 論文 も掲載されてる.
    とあり,「論文」へのリンクまで貼ってくれていますね。
    それをクリックすると,おおありがたや,その論文(PDF,15ページもあるよ)をダウンロードできるようになっているじゃ,あーりませんか。 -- 2008-06-25 (水) 18:35:29
  • あなたのやりたいことに合うかどうかわからないけれども、こんなサイトもみつかりましたよ.いかが? -- 2008-06-26 (木) 10:17:05
  • ありがとうございます.紹介いただいたサイトをみて、勉強してみます! -- ichigo? 2008-06-26 (木) 12:03:13

パッケージe1071内の関数svmの使用について

kei? (2008-06-24 (火) 05:52:51)

パッケージe1071内の関数svmについて教えて下さい。
関数svmを使って分類問題の学習をさせるために
以下のようなプログラムを組んだのですが

library(e1071)
dat <- iris
dat.col <- ncol(dat)
dat[,5] <- as.integer(dat[,5])
dat.tr <- dat[c(1:40,51:90,101:140),]
dat.tr.row <- nrow(dat.tr) 

dat.tr.u <- dat.tr
for (j in 1:dat.tr.row){ 
	if (dat.tr.u[j,5] == 1){
		dat.tr.u[j,5] <- "A"
	} else {
		dat.tr.u[j,5] <- "B"
	}
}
x <- (dat.tr.u[,1:dat.col-1])
y <- dat.tr.u[,5]
model <- svm(x,y)



実行すると svm.default(x, y) : Need numeric dependent variable for regression.
というエラーが出ます。x,yのmodeが問題ではと思い、色々な組み合わせを試したみたのですが同じエラーが出ます。解決方法を教えて下さい。
よろしくお願いします。

  • y <- factor(dat.tr.u[,5])とすることで解決しました。すみませんでした。 -- kei? 2008-06-24 (火) 06:16:12

Tukeyの多重検定をしたいのですができません。

A? (2008-06-20 (金) 17:08:13)

Tukeyの多重検定をしたいのですができません。
青木先生のサイト(http://aoki2.si.gunma-u.ac.jp/R/m_multi_comp.html)等を参考にして、

m.multi.comp(・・・

tukey(data, group)
などやってみましたが、 「エラー:関数 "m.multi.comp" を見つけることができませんでした 」「エラー:関数 "tukey" を見つけることができませんでした」というメッセージが出てしまいます。
どうしたらよいのでしょうか?
使用環境はWindowsXPでR version 2.7.0を使ってます。
よろしくお願いします。

  • 単にm.multi.comp関数がRに読み込まれていないのでは?青木先生のサイトに出ているm.multi.comp <- function( から }までの関数のプログラムをRに読み込ませないと動きませんよ。tukey()も同じ。この2つは青木先生の自作関数なので、関数のプログラムを読み込ませることが必要。 -- okinawa 2008-06-20 (金) 17:18:04
  • ありがとうございます!解決しました。 -- A? 2008-06-24 (火) 11:19:18

median()のエラーについて

apple? (2008-06-15 (日) 18:05:00)

よろしくお願いします。

  V1 V2 V3
1  1  2  3
2  4  5  6
3  7  8  9


このようなデータフレームを変数aに入れたとします。
1列目のmedianを計算しようと思い median(a[1])としたところ

以下にエラー median.default(a[1]) :  数値データが必要です


と言われました。
しかしmean(a[1])とすると1列目の平均値を計算できます。
これはどうしてでしょうか?mean()とmedian()には書式に違いがあるのでしょうか?

使用環境 Mac OS X 10.5.3、R 2.7.0

  • median(a[,1]) -- akira? 2008-06-15 (日) 18:22:09
  • まあ,実装のミスといえばミス,不完全といえば不完全かなあ -- 2008-06-15 (日) 22:22:26
    > class(a[1])
    [1] "data.frame"
    > class(a[,1])
    [1] "integer"
    median.default の定義の最初の方には,
        if (is.factor(x) || mode(x) != "numeric") 
            stop("need numeric data")
    とあります。
    同じく,mean.default の定義の最初の方は,
        if (!is.numeric(x) && !is.complex(x) && !is.logical(x)) {
            warning("argument is not numeric or logical: returning NA")
            return(NA_real_)
        }
    くらいしかありません。
    しかし,引数が data.frame のときには,mean は,実際には
    > mean.data.frame
    function (x, ...) 
    sapply(x, mean, ...)
    をよんでいるので,この mean.data.frame の定義に習って,median.data.frame を定義してやると,
    > median.data.frame <- function(x, ...) sapply(x, median, ...)
    > median.data.frame
    function(x, ...) sapply(x, median, ...)
    定義後は,
    > median(a[1])
    V1 
     4 
    というように,ちゃんと計算してくれるようになります(最初からそういうふうにしといてよってか?)
    なお,この定義後(定義しなくても)median(ベクトル) としたときはどうなるか,分かる人?
    はい,圃下圃下君答えて!なに?わからない?
    > median(a[,1])
    [1] 4
    となりますよね。出力形式が異なりますね。分かりましたか?圃下圃下君。
    ユーザと R どっちが悪いかと言えば,どっちもどっちか。
    賢い対処法は,上のようなことを喝破して,適切な使用をすることか。
    あ〜,疲れた。
  • 初歩的な関数でもこういうことがあるんですね。いままでモヤモヤしていましたが、これですっきりしました。ありがとうございました。 -- apple? 2008-06-16 (月) 00:35:11

オームの法則

-0.889? (2008-06-12 (木) 00:39:03)

たとえば、xデータに電圧値(v)をプロット、yデータに電流値(i)をプロットしてグラフにしたとします。グラフにあるデータで第2軸をたどれば抵抗値(r)が分かると言った具合にしてみたいのですが、可能でしょうか。質問内容のように全くの初心者です。

  • 第2軸って何ですか? -- 2008-06-12 (木) 04:56:34
  • なんだか学校の宿題のような気が・・・とりあえず、デモデータをアップして、"ちゃんと分かりやすく"説明してください。 -- akira? 2008-06-12 (木) 10:43:58
  • 単に関数の作り方を聞きたいだけなのでしょうかね?それともグラフ(triplot)を作りたいのか? -- okinawa 2008-06-15 (日) 10:04:35
    ohm<-function(e,i){
    r<-e/i
    return(r)
    }
    > ohm(2,2)
    [1] 1
  • なんの音沙汰もないというのは、解決したということか? -- okinawa 2008-06-19 (木) 14:12:28

データフレームへのアクセス(複数条件つき抽出)

寿司? (2008-06-11 (水) 09:39:40)

度々、恐れ入ります。
データフレームで、条件付の抽出を行いたいのですが、
複数の条件を設定した場合、うまく抽出できませんでした。
ひとつの条件であれば、問題なく機能するのですが、以下D3の記法は何がおかしいのでしょうか?
お手数をおかけしますが、よろしくお願いいたします。

id     <- c("A","B","C","D","E")
height <- c(158,177,177,177,166)
weight <- c( 51, 56, 55, 57, 55)
age    <- c( 23, 44, 21, 39, 42) 
D      <- data.frame(ID=id, H=height, W=weight, A=age)


D2 <- D[(D$ID=="A"), ]
D3 <- D[((D$ID=="A") || (D$ID=="B")), ]
  • || じゃなくて | -- 2008-06-11 (水) 09:47:34
  • subset を使う方がよいと思う.subset(D, D$ID=="A" | D$ID=="B") で十分. 余分な括弧も時と場合により冗長. -- 2008-06-11 (水) 11:07:04
  • subsetを使うのであれば、D$IDのD$は不要。subset(D,ID%in%c("A","B"))でよい。 -- 2008-06-11 (水) 11:47:29
  • ありがとうございます。出来ました! -- 寿司? 2008-06-12 (木) 07:30:08
  • %in% ってどういうことですか? -- 2008-06-14 (土) 23:36:50
  • ?"%in%" で調べろよ。 -- 2008-06-15 (日) 12:34:54
  • ヒント 「get("%in%")」 -- 2008-06-18 (水) 13:04:29

通し番号を除いて、出力する方法

寿司? (2008-06-10 (火) 22:41:30)

たびたびの初歩的な質問で恐れ入ります。
以下のようなデータフレームを作成しましたところ、自動的に通し番号が振られますが、出力する際にこの通し番号を除く方法はありませんでしょうか?
出力しますと、通し番号のために、列名がずれてしまいます。
(使用環境 windows vista, R2.6.0)

sex    <- c("F","F","M","M","M")
height <- c(158,162,177,173,166)
weight <- c(51,55,72,57,64)
( x    <- data.frame(SEX=sex, HEIGHT=height, WEIGHT=weight) )


write.table(x, "x.csv", quote=F, col.names=T, append=F, sep="," )
  • 引数にrow.names=FALSE -- takahashi? 2008-06-10 (火) 22:45:35
  • なんで,オンラインヘルプを読まないんだろうかねぇ. ? write.table ってすればよいだけじゃんか. -- 2008-06-10 (火) 22:48:19
  • ありがとうございます。?write.tableと構文でヘルプがあるのを知らず、また、ごみtipsを増やしてしまいすみません。 -- 寿司? 2008-06-10 (火) 23:31:29

被験者内計画の分散分析

アべセ? (2008-06-10 (火) 16:11:13)

被験者間計画の分散分析のやり方は分かりやすいのですが、被験者内計画の分散分析のやり方が全くわかりません。よろしければ、その方法を教えてください。

  • [被験者間計画の分散分析のやり方は分かりやすいのですが]私には同じように難しいけど。あなたは幸せ者だ。http://mat.isc.chubu.ac.jp/R/tech.html を読んでみたら?そこに紹介されている本も買って. -- 2008-06-10 (火) 22:51:33
  • 返答してくれた方、ありがとうございました。紹介されているURLの説明(というか例)に沿って被験者内計画の分散分析をしてみたら、無事出来ました。 -- アベセ? 2008-06-11 (水) 19:21:14

OSXでR Commanderがインストールできない

ton? (2008-06-09 (月) 23:29:02)

Mac OS X 10.4.11でパッケージとデータ>パッケージインストーラーから
R Commander(Rcmdr)をインストールし、Rコンソールで「>library(sem)」と
入力してパッケージを読み込もうと思ったのですが、以下のようなエラーがでます。
全くの素人で、解決の手段がわかりません。よろしくお願いします。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

要求されたパッケージ tcltk をロード中です 

Tcl/Tkインターフェースのロード Error in dyn.load(file, DLLpath = DLLpath, ...) :

  共有ライブラリ '/Library/Frameworks/R.framework/Versions/2.7/Resources/library/tcltk/libs/i386/tcltk.so' を読み込めません 
 dlopen(/Library/Frameworks/R.framework/Versions/2.7/Resources/library/tcltk/libs/i386/tcltk.so, 10): Library not loaded: /usr/X11R6/lib/libX11.6.dylib
 Referenced from: /Library/Frameworks/R.framework/Versions/2.7/Resources/library/tcltk/libs/i386/tcltk.so
 Reason: image not found 

Error : .onLoad は 'tcltk' のための 'loadNamespace' で失敗しました

エラー:  パッケージ 'tcltk' をロードできませんでした 
  • たぶん何度も質問に出ているやつだと思いますが、X11起動してますか? -- okinawa 2008-06-10 (火) 08:37:20
  • 「その他>X11サーバを起動」でX11を起動すればいいのですよね?それでやっても、インストールできませんでした。 -- ton? 2008-06-10 (火) 23:40:49
  • まず以下のことをやってみてください。 -- okinawa 2008-06-11 (水) 08:03:06
    (1)パッケージとデータ>パッケージインストーラーから、Rcmdrを選び「パッケージの依存関係を解決」にチェックを入れ、選択をインストールをクリックする。*「パッケージの依存関係を解決」を常にチェックすること。*
    (2)インストール終了後、library(Rcmdr)を実行し、Rcmdrが起動するかをチェック
    (3)Rcmdrが起動したら、Rcmdrのコンソール内で、library(sem)を実行する。
    パッケージのインストールは常にパッケージインストーラーから行います。エラーを見てわかるようにsemが呼び込まれていないエラーではなく、tcltkのエラー(たぶんRcmdrが起動していないはずです)なわけです。Rcmdrはいくつものパッケージを利用するので、「パッケージの依存関係を解決」していないと、必要なパッケージが足りなくてエラーが多発します。(Winでは依存関係を解決がデフォルトなんだけどMacではなんでデフォルトでないのかな?)
  • X11はインストールしましたか? -- なかま 2008-06-11 (水) 12:46:17
  • X11を起動しようとしたとき「2008-06-15 21:38:21.911 open[198] Couldn't launch application: X11.app」と表示されるということは、X11がインストールされていないと言うことでしょうか?RをインストールしたらX11もインストールされるのではないのですか?初歩的な質問ばかりでスミマセン。 -- ton? 2008-06-15 (日) 21:44:09
  • X11はMac側のアプリなので、Rとは関係ないです。もし、Macの[アプリケーション][ユーティリティ]内に入ってなければ、別途Appleのサイトからダウンロードするか、OSXのDVDからインストールしないといけませんね。 -- okinawa 2008-06-16 (月) 14:00:20
  • なんとかX11をインストールし、無事、R Commanderをインストールできました。X11のインストールに苦戦して、時間がかかってしまい、返答が遅れましたがありがとうございました。 -- ton? 2008-07-20 (日) 02:12:23

多変量自己回帰分析VAR

tarai? (2008-06-07 (土) 11:39:59)

Rで多変量自己回帰分析する際のパワー寄与率を計算するにはどうしたらよいでしょうか?どなたかお教え願えれば幸いです。

  • 統計数理研究所のTIMSACのR用パッケージが出ていてその中にノイズ寄与率(パワー寄与率)を計算する関数も含まれていたと思います。 -- takahashi? 2008-06-10 (火) 01:30:55

n*3行列データで等高図

初心者? (2008-06-06 (金) 14:01:42)

簡単な質問申し訳ないのですが、
n*3の行列データで等高線を書きたいと思っています。
データは
x1 y1 z1
x1 y2 z2
x1 y3 z3
x2 y1 z4
x2 y2 z5
x3 y3 z6
........
という形式で並んでいるのですが、
これを
d<-read.table("data")で読み込んで、
contour(data$V1,data$V2,data$V3)でプロットしようとしても
'x'と'y'の値は昇順であることが期待されます
と出てプロットできません。persp()を用いても同様に表示されます。
ご回答お願いします。

使用環境は
Ver.2.7.0
win vistaです

  • データの6行目間違い->x2 y3 z6でした -- 初心者? 2008-06-06 (金) 14:03:10
  • ライブラリ akima を参照 -- 2008-06-06 (金) 14:33:28
  • プログラム自体が変ですよ。dに入れたのに、contour(*,*,*)ではdataになってる? -- okinawa 2008-06-06 (金) 15:29:41
  • dataはdの間違いでした。 -- 初心者? 2008-06-06 (金) 16:05:48
  • akimaをインストールしました。ロードしてcontourプロットを行ってみたのですが、エラーはまだでます。どのような設定を行えばいいのでしょうか。 -- 初心者? 2008-06-06 (金) 16:06:43
  • contour のオンラインヘルプは見ましたか?また,example(contour)はやってみましたか?任意の(x, y, z) の三つ組データを複数用意しても,等高線は書いてくれませんよ。 -- 2008-06-06 (金) 17:14:14
  • グラフィックス参考実例集:イメージ図にある不等間隔データをスプライン補間して image 関数で出力の例ですと、変数の部分は行列のメッシュデータ(グリッドデータ)になっていますね。x,y,zをメッシュデータにするには・・・。 -- okinawa 2008-06-06 (金) 18:54:20
  • ヘルプをみましたが複雑でよくわかりません.zのデータもn*nの行列にしないといけないのでしょうか? -- 初心者? 2008-06-06 (金) 19:11:48
  • interp(x,y,z)でメッシュデータにしたあとに、contourを使うのでは?参考事例集のサンプルを見て勉強してください。 -- okinawa 2008-06-06 (金) 19:17:26
  • 参考実例集を参考に少し考えてみます.今気づいたのですが、はじめの投稿のn*3行列は間違いで、n*n行列のほうが正しかったです. -- 初心者? 2008-06-06 (金) 19:20:46
  • 1つ伺いたいのですが,参考例は付属のデータを用いるためだけにakimaライブラリを呼び出しているのでしょうか? -- 初心者? 2008-06-06 (金) 19:24:18
  • いろいろ試したのですが、interp(x,y,z)では軸の中に同じ値があると(たとえば(1,2,3)と(1,3,4))ダメなのではないでしょうか。duplicate data points: need to set 'duplicate = ..'とエラーが出てしまいます。 -- 初心者? 2008-06-07 (土) 03:52:53
  • えーと。エラーメッセージが答えと思うんですが・・・okinawaさんの「参考事例集のサンプルを見て勉強してください」を理解されましたか?エラーを理解できないと同じ所で躓きますよ。?interpすると、
    duplicate 	character string indicating how to handle duplicate data points. Possible values are
                   "error"    produces an error message,
                   "strip"    remove duplicate z values,
                   "mean","median","user"    calculate mean , median or user defined function (dupfun) of duplicate z values. 
    と出てきますよ. -- akira? 2008-06-07 (土) 05:31:29
  • データ自体にすこし問題がありました。なんとか作図までこぎつけましたが、xとyのレンジが大きすぎる場合のエラー対処方法がわかりませんでした。結局x、yのデータをリスケールすることで対応しました。 -- 初心者? 2008-06-07 (土) 06:49:30
  • ありがとうございます -- 初心者? 2008-06-07 (土) 06:49:46
  • akimaのhelp読みましたか?英語だから、難しいからと読まないでいると、先には進めませんよ。akimaはdataだけでなくinterp関数を利用できるようにします。後、あなたのデータが提示されてればもっと早く解決できたはずです。あなたのデータに問題がある場合は、こちらでは対応のしようがないので、質問に答えることができませんよ。 -- okinawa 2008-06-07 (土) 08:14:12
  • 英語を読むのが大変というよりは、R独自の文法に慣れるのに手間取りました。データは数Mのかなり膨大なものなので最初に形式を書いたのですが、少しわかりにくかったかもしれません。けれど今回のことで大変勉強になりました。 -- 初心者? 2008-06-07 (土) 08:58:59
  • Rは所詮言語なので、ちょっとお試し的に利用するには敷居が高いと思います。でもなれるととても使いやすいですよ。私は他の言語も使っていますが、Rだったら・・・と何回思ったことか。 -- okinawa 2008-06-07 (土) 09:28:02

ソートについて

寿司? (2008-06-05 (木) 00:18:35)

昇順、降順を織り交ぜたソートを行いたいのですが、思ったように機能してくれません。以下の例では、例えば、Hについては昇順、Wについては降順、Aについては昇順としたいのですが、コマンドはどのように書けばよいでしょうか?すべて昇順であれば、orderで順に並べればよいのですが…。初歩的な質問で申し訳ありませんが、よろしくお願いいたします。


> id     <- c("A","B","C","D","E")
> height <- c(158,177,177,177,177)
> weight <- c( 51, 56, 56, 57, 55)
> age    <- c( 23, 43, 44, 39, 42) 
> D      <- data.frame(ID=id, H=height, W=weight, A=age)
> D 
 ID   H  W  A
1  A 158 51 23
2  B 177 56 43
3  C 177 56 44
4  D 177 57 39
5  E 177 55 42
  • D[order(D$H,-D$W,D$A),] -- takahashi? 2008-06-05 (木) 01:03:56
  • まずHが昇順になるように並べ、Hが同順な各グループ内ではWで降順に並べ、それでも同順なもの同士をAで昇順で並び替えるという意味ですか? もしそうなら次のようなやり方ではいかが? order(x,y,z) の意味は ?order で確認してください。-D$W としたのはすべてを昇順にするトリック。-- 2008-06-05 (木) 00:28:36
    > D
      ID   H  W  A
    1  A 158 51 23
    2  B 177 56 43
    3  C 177 56 44
    4  D 177 57 39
    5  E 177 55 42
    > (o <- order(D$H,-D$W,D$A))
    [1] 1 4 2 3 5
    > D[o,]
      ID   H  W  A
    1  A 158 51 23
    4  D 177 57 39
    2  B 177 56 43
    3  C 177 56 44
    5  E 177 55 42
  • かぶりましたね。order(x,y,z) は要するに辞書式順序でソートするという意味です。 -- 2008-06-05 (木) 09:46:16
  • ありがとうございます。誤解をしていた箇所があり、立ち往生してました。 -- 寿司? 2008-06-05 (木) 16:12:21

UNDO機能ってありますか?

LINUX初心者? (2008-06-03 (火) 20:33:38)

コマンドライン(FEDORA7)で作業していて操作を間違えてしまった時に
一個前の状態に戻れるような機能はないのでしょうか?
RSiteSearch?やサイト内検索は試みましたが見つけられませんでした。
現在金先生の本を教科書に勉強始めたとこなので
「そんなことも分からんのか!!」と言われそうですが宜しくお願いします。
R は version 2.7.0 (2008-04-22)

  • そのようなものもあるかとは思いますが,操作手順をまえもってファイルに記録しておき,ファイルに記述されたことを実行するというようになさるのはいかがでしょうか。Linux のことはよく分かりませんが,他のプラットフォームでは,エディタのようなものにプログラムを書き足しながら,それまでのプログラムを実行するというようなやり方ができるのですけど。どこか不都合なことがあれば,その部分を修正して(必ずしも,直前と言うことではない)再度最初から実行するということです。大規模なデータで複雑なプログラムだと,ちょっと直しては再実行というのはプログラムの実行時間から見て現実的でない場合もあるでしょうけど,多くの場合は,何回実行し直しても許容限度内の時間で再実行できるのではないかなとは思いますがどうでどうでしょう。 2008-06-03 (火) 21:47:50
  • 端末からは入力命令の履歴機能を使い、上下矢印キーで過去の入力を行単位で遡って再現できますね。それとマウスによるC&P。これだけでも普通充分。それ以上複雑なら直前のコメントのように一連の手順をファイル xxx.R に書き込み編集して、source("xxx.R") で読み込み実行するのがベスト。 -- 2008-06-03 (火) 22:56:54
  • > > 端末からは入力命令の履歴機能を使い、上下矢印キーで過去の入力を行単位で遡って再現できますね。
    その通りですが,それを書かなかったのは,例えば,これは単純な例なので,前の方に戻ってやり直すということもできるわけですが,
    x <- 4
    x <- x+4
    x <- x*5+8
    なんていうような場合に,何段階か元の状態に戻るには,↑で何段階も前に戻って,その次には「何段階-1」に戻ってというような面倒なことが必要なためです(いわずもがな)
    要するに,質問のような場合には,一般のプログラミング言語と同じように,一連の手順をスクリプトとして記録しておき,それを修正しながら(最初から)実行するというのが順当な方法であろうということです。 -- 2008-06-03 (火) 23:13:02
  • もう一つの方法はEmacsのシェルモード(もしくは専用のESSモード)でEmacs内からRを実行すること。入力と出力がEmacsテキストで記録されますから、スクロールで過去に戻って再編集、実行ができます。私自身は使い勝手が悪くて嫌いですが(笑), -- 2008-06-03 (火) 23:59:49
  • 皆さんと同意見です。ただ、長いスクリプトをやり直すのも結構面倒ですよね。おそらくオブジェクトを上書きしているんじゃないでしょうか?2つ前の方の例を引用しますと
    x <- 4
    x1 <- x1+4
    x2 <- x2*5+8
    とすれば古いオブジェクトは残りますよね。慣れるまではエディター、save(list=ls(),file="tmp.Rdata")と「オブジェクトの大量発生」でやり過ごしてはいかが? -- akira? 2008-06-04 (水) 07:58:18
  • オブジェクトの大量発生は,x <- 4; x1 <- x1+4; x2 <- x2*5+8 こんな風に,間違いやすい -- 2008-06-04 (水) 11:35:15
  • 皆様、ご指導ありがとうございます。 -- LINUX初心者? 2008-06-04 (水) 12:04:22
  • 誤ってEnter押してしまいました。色々あるみたいですので皆様のご指摘を参考にしながら自分なりに試していきたいと思います。 -- LINUX初心者? 2008-06-04 (水) 12:09:48

データハンドリングについて(ソート、分位、行ずらし、重複列削除)

寿司? (2008-06-03 (火) 12:17:18)

以前SASを使っておりまして、Rでも同じようにデータハンドリングしようとすると、意外に手間取っております。一通り、探してみたのですが、適当なものは見つからず、以下の点につきまして、関数やパッケージをご存知でしたら、紹介頂けませんでしょうか?

・ソートについて
複数の項目のソートを行いたいのですが、昇順、降順が混ざっており、単純には並び替えできませんでした。
現在の私のプログラムでは、ファイルを適宜分割した後、何度かソートをかけて、またくっつけるという、非常に面倒で遅い処理をしております。

・分位について
SASであれば、rankを使って簡単に分位に分けられたのですが、Rには相当する関数がありますでしょうか?

・行ずらし
ある項目について、前レコードとの比較を行いたいのですが、現在の私のプログラム:(列を追加&前レコード値を代入)の反復、では遅すぎてデータ処理が滞っています。

・重複列削除
まったく同じ行が現れたとき、その行を削除したいのですが、項目を逐一照会して、判断するほか無いのでしょうか?

  • 簡単でいいからやりたい事のイメージが分かるような例をつけること。対象はデータフレームですか、行列ですか。 -- 2008-06-03 (火) 12:58:01
  • 項目 1, 2 に付いては sort() と rank() 関数の使い方を一様調べた上での質問ですか。Q&Aの過去記事をみると解答は既にあるような気がしますが。 -- 2008-06-03 (火) 13:00:55
  • 寿司さんはスクリプトを書ける方なので、モデルデータ、上手くいかないRスクリプト、理想とするSASスクリプト(あれば)、なんか載せると一発で解決しちゃうと思います。
    ソート -> たぶんソート順をorderに組み込めていないだけ
    分位 -> quanntile?
    行ずらし -> よーわからん
    重複列削除 -> duplicate?
    見当違いかもしれませんが -- akira? 2008-06-03 (火) 14:27:03
  • http://oit.utk.edu/scc/RforSAS&SPSSusers.pdf を参考にすると意外に役立つかも。 -- 2008-06-03 (火) 16:22:37
  • 出先で急いで書いたもので、例が載せられておりませんでした。帰りましたら、やりたいことのイメージを載せるつもりです。dupulicate、quanntileはテストしてみます。 -- 寿司? 2008-06-03 (火) 18:46:40
  • ありがとうございます。家に戻りましたら、イメージが分かるような例をつけてみます。また、quanntile、duplicateについても調べてみます。 -- 寿司? 2008-06-03 (火) 18:47:48
  • ありがとうございます。家に戻りましたら、イメージが分かるような例をつけてみます。また、quanntile、duplicateについても調べてみます。 -- 寿司? 2008-06-03 (火) 18:47:54
  • 何度も重複しており、恥ずかしい限りです。行が長くなってしまいましたので、個別に質問させて頂きたく思います。 -- 寿司? 2008-06-05 (木) 00:01:32

列名の強制変換

sh? (2008-05-30 (金) 03:51:32)

以下のようなタブ区切りのデータファイル("file.txt")を関数read.delim()で読みこむときに、列名の一部(" ","-","|",":")が"."に強制返還されないようにする方法を教えてください。

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
> sessionInfo()
R version 2.6.1 (2007-11-26) 
i386-apple-darwin8.10.1
> ( x <- read.delim("file.txt") )
  a.b a.b.1 a.b.2 a.b.3 a_b
1 a b   a-b   a|b   a:b a_b
2 a b   a-b   a|b   a:b a_b
Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
   'file.txt' の readTableHeader で不完全な最終行が見つかりました 
> colnames(x)
[1] "a.b"   "a.b.1" "a.b.2" "a.b.3" "a_b"  
  • read.delimのHELP内に書いてあります。header=FALSE。 -- okinawa 2008-05-30 (金) 08:08:29
  • check.names=FALSE -- takahashi? 2008-05-30 (金) 09:03:33
  • ( x <- read.delim("file.txt", check.names=FALSE) ) で解決しました。make.names関数の存在も知りました。ありがとうございました。 -- sh? 2008-05-30 (金) 12:03:32

全オブジェクトの列数の連続取得

nrow?? (2008-05-29 (木) 13:38:34)

いつも、拝見させていただいております。
計算する際に、オブジェクトがa〜zまでできます。
この全オブジェクトの列数が、書き込まれたデータフレームを作成したいのですが、うまくいきません。

例えば

a1 <- data.frame(ls(), nrow(get(ls())))

とすると一列目には全オブジェクトの名前が入るのですが
二列目には一番初めに来るオブジェクトの列数が入ってしまいます。

二列目には一列目のオブジェクトに対応した列数を入れるためにはどうしたらよいでしょうか。

ご教授願います。

  • 計算する途中で,作ったオブジェクトの列数を記録(蓄積)していく方がよいでしょう。ls()なんか使うと,無関係のオブジェクトも走査してしまい困るんじゃないですか。(やりたいことが今ひとつわからない) -- 2008-05-29 (木) 13:54:51
  • unlist(sapply(ls(), function(i) nrow(get(i)))) で(ファイル名を名前ラベルに持つ)ベクトルにはなるが、「データフレームに」というのは? もちろん ls() の代わりに対象オブジェクト名の文字列リストをおいても良いわけです。-- 2008-05-29 (木) 14:16:52
  • ありがとうございます。文字列リストの作成も検討してみます。 -- nrow? 2008-05-29 (木) 15:06:07
  • たとえばこんな風かな -- 2008-05-30 (金) 01:40:33
    > abc <- matrix(0,2,2)
    > abc.def <- matrix(0,3,2)
    > Obj <- c("abc","abc.def")
    > ( x <- sapply(Obj, function(i) nrow(get(i))) )
        abc abc.def 
          2       3 
    > names(x) <- NULL
    > x
    [1] 2 3
    > data.frame(Obj, x)
          Obj x
    1     abc 2
    2 abc.def 3

読み込んだCSVファイルを、日付を条件に検索したい

寿司? (2008-05-28 (水) 09:27:13)

R 2.6.0 をWindows Vistaで使用しています。
日付データを含んだcsvファイルを読み込み、Rで今日の日付で検索しようと考えております。
Rでは、

today <- Sys.Date()

today
[1] "2008-05-28"
となりますので、csvファイルには文字列で"YYYY-MM-DD"となる列を作ったのですが、これでは型が対応していないのか、エラーとなってしまいました。
R側、csv側どちらでも良いので、検索が機能するような方法ありませんでしょうか?
プログラムは以下のとおりです。(csvの代わりにデータフレームに直接入力しています)

d <- c("2008-05-28","2008-05-29","2008-05-30")

a <- c(1,2,3)

( x <- data.frame(D=d, A=a) )

          D A

1 2008-05-28 1
2 2008-05-29 2
3 2008-05-30 3

(today <- Sys.Date())
[1] "2008-05-28"

x[x$s==today, ]
[1] D A

0 rows> (or 0-length row.names)

x[x$D==today, ]
[1] D A

0 rows> (or 0-length row.names)
Warning message:
In `[.data.frame`(x, x$D == today, ) :

  メソッド ("Ops.factor", "Ops.Date") は "==" に対しては矛盾しています
  • Sys.DateはClass `Date' を返します, str(Sys.Date())や?Sys.Dateを御覧下さい. データーフレームは文字列を因子として扱います. この場合, d <- c("2008-05-28","2008-05-29","2008-05-30") を d <- as.Date(c("2008-05-28","2008-05-29","2008-05-30")) にするのが良いでしょう. もちろん, x[as.character(x$D) == today, ] でもかまいませんが, 因子に関する日付型のメソッドが無いと言ってる訳です. 扱うパッケージによっては, 日付の持ちかたが難しい場合があるので, なれて下さい... -- なかま 2008-05-28 (水) 10:31:40
  • ありがとうございます。x[as.character(x$D) == today, ]の方式で、欲しいデータを取り出すことができました。csvからData型で読み込む前者につきましては、もう少し格闘してみます。 -- 寿司? 2008-05-29 (木) 01:13:15

Y軸の目盛り間隔をグラフ間で同一に

ICA? (2008-05-26 (月) 23:57:06)

複数のboxplotを縦に並べようとしています。グラフAは縦軸の最大値―最小値が0-20で、グラフBは0-100です。二つのグラフを描く際に、Aのグラフの縦軸の目盛り間隔がBのグラフの縦軸の目盛り間隔と一致するようにしたいのです。つまり、Aの0-20の長さは、Bの0-20の長さと同一にしたいです。
 縦軸の最大値の指定は、ylimで出来ることがわかりましたが、間隔をそろえるのは、x,y軸をそろえるというaspという記述しか見つけられませんでした。
 おそらく、boxplotに限らず、どのようなグラフでも同じやり方があると思うのですが、その方法を教えていただきたいと思います。

  • 単にデータを boxplot(x, y) 等と並べるだけの事では。 -- 2008-05-27 (火) 00:02:40
  • 追伸です。私は5つのグラフを縦に並べようとしていますが、まとめて書き出すような技術はありません。一つ一つのグラフで目盛り間隔を指定(例えば一目盛りあたりのピクセル数を指定)できるような方法があれば良いなと考えています。チョロですみません。 -- ICA? 2008-05-27 (火) 00:11:27
  • boxplot(x, y) の場合、データセットを変えると、最大値に合わせて縦軸が変化するので、困ります。 -- ICA? 2008-05-27 (火) 00:16:00
  • もしかして次のように二つの箱型図を描きたい? ただし相互比較が目的なら一つの図に平行箱型図を描かないと意味が無いような気がする。-- 2008-05-27 (火) 09:21:48
    > x <- rpois(100, 80)
    > max(x)
    [1] 99
    > boxplot(x, yaxp=c(0,100,1), ylim=c(0,100))
    > x <- rpois(100, 30)
    > boxplot(x, yaxp=c(0,100,1), ylim=c(0,100))
  • この例の場合、二つ目のグラフの縦軸範囲を0-50にして高さも半分にしたいということです。 -- ICA? 2008-05-27 (火) 16:17:12
  • どんなグラフを描きたいと思っているのか今ひとつはっきりしない。個別に描いたグラフを横に並べても余り意味がない。「まとめて書き出すような技術はありません」などといっていないで,チャレンジしてみれば?例えば,boxplot(iris[,1]~iris[,5]) をやってみたらいかが?boxplot のオンラインヘルプは見ましたか?example(boxplot)もやってみればよいのに。 -- 2008-05-28 (水) 01:13:26
  • スクリプトでなくていいから、やってみたいイメージ図をアップしてもらえませんか?言葉だと何か分かりにくいです。layoutとxlim,ylimでなんとかなりそうな気がしますが…それでもダメならrectをつかうとか -- akira? 2008-05-28 (水) 07:58:19
  • お手数おかけしています。以下を行うと一つ目と二つ目のグラフで、目盛りの間隔を何となく同じに出来ますが、何となくです。0以下と4または8より上にスペースがあり、そのスペースの大きさがグラフによって変わるので、実際の目盛り間隔はずれてしまいます。 -- ICA? 2008-05-28 (水)
    > par(pin=c(3,1))
    > boxplot(Petal.Width~Species, iris, ylim=c(0,4))  
    > par(pin=c(3,2))
    > boxplot(Sepal.Length~Species, iris, ylim=c(0,8))
  • なぜ、そうしたいのか、というのはとりあえず訊かずに...
    par(mfrow=c(1,2))
    boxplot(Petal.Width~Species, iris, ylim=c(0,4), yaxs='i')
    boxplot(Sepal.Width~Species, iris, ylim=c(0,8), yaxs='i')
    こういうこと? -- 2008-05-28 (水) 20:57:08
  • それでは駄目なんだといっているような。要するに,2つのグラフで,縦軸の1単位の長さを同じにしたいんだというようなことをいっておられるのでは?
    結局の所は,一つの boxplot で全部を描くようにしないと,要求は満たせないのでは? -- 2008-05-28 (水) 21:35:10
    boxplot(c(Petal.Width, Sepal.Width, Petal.Length, Sepal.Length)~
        rep(1:12, each=50), iris, xaxt="n", col=rep(2:5, each=3))
    axis(1, 1:12,abbreviate(rep(levels(iris$Species), 4)))
    legend("topleft", legend=c("Petal.Width", "Sepal.Width", "Petal.Length",
           "Sepal.Length"), fill=2:5, yjust=1, bty="n")
    boxplot.png
  • 21:35の方が私の欲求を正しく理解してくださいました。が、20:57の方の"yaxs = "i""でなんとかなりそうです。Helpといくつかのwebでyaxsの説明を見ましたが、理解していませんでした。ありがとうございました。  やりたいことは、exmaple(boxplot)にでてくる、Orange juiceの例のようなことですが、横に並べ続けられないので、2要因を縦横に並べて見せたいのです。もちろん興味が強いほうを横並べにします。 -- ICA? 2008-05-28 (水) 23:26:19

R2.7.0 on MacBookPro?: legend()でエラー

松田紀之? (2008-05-21 (水) 19:36:41)

R2.7.0 on MacBookPro? (OSX 10.5.2) でplot()し,legend()を実行するとエラーがでます.下記のプログラムは,R2.7.0 on PowerBookG4 (OSX 10.4.11)なら問題はありません.対処方法を教えて下さい.

plot(1:5,1:5)

legend("bottomright",legend=c("a","b"),lwd=1,col=1:2)

*** caught bus error ***

address 0x10, cause 'non-existent physical address'

Traceback:

1: strwidth(legend, units = "user", cex = cex)
2: legend("bottomright", legend = c("a", "b"), lwd = 1, col = 1:2)
  • 日本語に関する設定を外してください. 2.7.0のQuartzの日本語は旨くありません. 日本語が必要ならIPAフォントを導入してX11を使うとか... -- なかま 2008-05-21 (水) 22:06:18
  • Q&A "R2.7.0,Macintosh版でのグラフィック表示における日本語"に関する,Rprofileの追加命令が障害だったのでしょうか. -- 松田紀之? 2008-05-22 (木) 10:13:25
  • いえ, 本当にたまたまです. ものすごくいいかげんな超対処療法的温泉旅館渡り廊下造営パッチでとりあえずは処理できるようにはなりますが, だれかR-SIG-Macに投げてくれますか?(R-SIG-Mac入ってない...) -- なかま 2008-05-22 (木) 13:40:02
    日本人は苦しみます.
    # .Rprofile
    setHook(packageEvent("grDevices", "onLoad"),
                         function(...){
                           grDevices::quartzFonts(sans=grDevices::quartzFont(
                             c("Hiragino Kaku Gothic Pro W3",
                               "Hiragino Kaku Gothic Pro W6",
                               "Hiragino Kaku Gothic Pro W3",
                               "Hiragino Kaku Gothic Pro W6")))
                           grDevices::quartz.options(family="sans")
    )
    
    しかし, grDevices::quartz.options(family="sans") は有効になりません.
    そこでさらに以下を加えます.
    attach(NULL, name = "MacJapanEnv")
    assign("familyset_hook",
            function() { if(names(dev.cur())=="quartz") par(family="sans")},
            pos="MacJapanEnv")
    setHook("plot.new", get("familyset_hook", pos="MacJapanEnv"))
    
    ところが...
    > plot(1:5,1:5)
    > legend("bottomright",legend=c("a","b"),lwd=1,col=1:2)
    
    Program received signal EXC_BAD_ACCESS, Could not access memory.
    Reason: KERN_PROTECTION_FAILURE at address: 0x00000014
    0x900031c8 in strlen ()
    (gdb) bt
    #0  0x900031c8 in strlen ()
    #1  0x907bf19c in CFStringCreateWithCString ()
    #2  0x0221bc58 in RQuartz_FindFont (fontface=-2147483648, fontfamily=0xbfffc3c0 "sans") at devQuartz.c:533
    #3  0x0221bd0c in RQuartz_Font (gc=0xbfffc378, dd=0x17) at devQuartz.c:548
    #4  0x0221c184 in RQuartz_Set (ctx=0x2155eb0, gc=0xbfffc378, flags=8) at devQuartz.c:623
    #5  0x0221cc3c in RQuartz_StrWidth (text=0x1ff7e20 "a", gc=0xbfffc378, dd=0x212cd60) at devQuartz.c:736
    
    gc->fontfaceは設定されてません. 以下は場当たり的に対処したものですが,
    動作はしました.
    
    # 超対処療法的温泉旅館渡り廊下造営パッチ
    --- R-patched.orig/src/library/grDevices/src/devQuartz.c        2008-05-01 00:45:39.000000000 +0900
    +++ R-patched/src/library/grDevices/src/devQuartz.c     2008-05-22 13:16:46.000000000 +0900
    @@ -529,7 +529,7 @@
             int i;
             for(i = 0; i < length(names); i++)
                 if(0 == strcmp(fontfamily, CHAR(STRING_ELT(names, i)))) break;
    -        if(i < length(names))
    +        if(i < length(names) && fontface > 0)
                 fontName = CFStringCreateWithCString(kCFAllocatorDefault,
                                                     CHAR(STRING_ELT(VECTOR_ELT(db, i), fontface - 1)),
                                                     kCFStringEncodingUTF8);
  • R-develに投げてみます -- なかま 2008-05-23 (金) 14:26:27

連続でxtabsを行いたい。

ともぞう? (2008-05-19 (月) 17:00:30)

  A	B	a	b	c
  2	2	2	2	1
  2	2	2	2	0
  1	2	2	1	1
  2	2	0	2	0
  0	2	2	1	2
  0	2	2	2	0
  0	2	0	2	1
  2	1	1	1	2
  2	0	2	2	0
  0	1	1	0	2

このようなデータから下のような集計を行う方法はありますでしょうか?

               a       a       a       b       b       b       c       c       c
               0       1       2       0       1       2       0       1       2
   A   0       1       1       2       1       1       2       1       1       2
       1       0       0       1       0       1       0       0       1       0
       2       1       1       3       0       1       4       3       1       1
   B   0       0       0       1       0       0       1       1       0       0
       1       0       2       0       1       1       0       0       0       2
       2       2       0       5       0       2       5       3       3       1

集計は、Aが2のとき、b=2が4つという感じで行っています。

ちなみに、個別でAとaに関するテーブルというのはxtabsでできるのですが、実際のデータでは、列数が非常に多いので、全部まとめた集計表は作れないものかということで質問させていただきました。
何か良い知恵がございましたらよろしくお願いします。

  • この質問ね,「クロス集計時に起きるエラーについて」と同じ人の質問じゃない?だって,そっくりだもの。同じ人でないとしたら,同じレポート課題に対する回答を求めているのかなあ。前の人は,投げ出したみたいだけど。以下のような解を求めるというのもトリッキーというか,こんな解を求めても,あんまり見やすくもないしうれしくもないと思うんだけどなあ。
    まあ,名前を付けるのはご自由に。 -- 2008-05-19 (月) 22:43:44
    > array(sapply(1:2, function(i) sapply(1:3, function(j) xtabs(~tmp[,i]+tmp[,2+j]))), dim=c(3, 9,2))
    , , 1
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    [1,]    1    1    2    1    1    2    1    1    2
    [2,]    0    0    1    0    1    0    0    1    0
    [3,]    1    1    3    0    1    4    3    1    1 
    
    , , 2
    
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
    [1,]    0    0    1    0    0    1    1    0    0
    [2,]    0    2    0    1    1    0    0    0    2
    [3,]    2    0    5    0    2    5    3    3    1
  • 勉強になりました。ありがとう御座いました。 -- ともぞう? 2008-05-20 (火) 00:11:45

R 2.7.0 Windows版での2byte文字について。

goof? (2008-05-17 (土) 22:21:10)

Windows XPを使用しております。

sessionInfo()
R version 2.7.0 (2008-04-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

です。

Rエディタで2byte文字を含むコードをR consoleに"カーソル行または選択中のRコードを実行"から送ると、R console上では文字化けが起こってしまい、正しく処理されません。R console上で直接入力する際は問題ないのですが・・・。全角の数字"#123"を試してみますと、

#ツPツQツR

となります。
options(encoding="UTF8")としてもoptions(encoding="SJIS")としても変化はありませんでした。Windows 2000、vistaでも試してみましたが、同じ問題が生じてました。R 2.6.2まではこの問題はありませんでした。

どうぞ原因と解決策のご教示をよろしくお願いいたします。

  • 原因は中の問題で, 解決はちっとまってね. SBCS環境とDBCSで分ける必要があるので... -- なかま 2008-05-18 (日) 10:19:40
  • ああそうそう, 選択したものをCtrl+Rでするのは問題が無いのでHome,Shift+↓,Ctrl+Rで体?!で覚えてください. -- なかま 2008-05-18 (日) 10:24:12
  • なかま様、ご返事ありがとうございますm(_ _)m。いつも大変お世話になっております。選択したものをCtrl+Rで実行したら上手くいきました。当面はこれでしのぎます。 -- goof? 2008-05-18 (日) 10:54:17

パッケージkohonenのxyfの使い方が分かりません

たにくん? (2008-05-15 (木) 14:55:00)

解説にはSOM(自己組織化マップ)の教師つきバージョンと書いてあるので,使ってみたのですが,その使い方がはっきり分かりませんでした.

data(wines)
set.seed(7)

training <- sample(nrow(wines), 120)
Xtraining <- scale(wines[training,])
Xtest <- scale(wines[-training,],center = attr(Xtraining, "scaled:center"),scale = attr(Xtraining, "scaled:scale"))

xyf.wines <- xyf(Xtraining,classvec2classmat(wine.classes[training]),grid = somgrid(5, 5, "hexagonal"))

xyf.prediction <- predict(xyf.wines, newdata=Xtest)
table(wine.classes[-training], xyf.prediction$prediction)

というexampleがあるのですが,はっきりと理解できません.

もし,学習データとしてdata1という200行10列の行列を用い,テストデータとしてdata2という20行10列の行列を用いたい時,xyfではどのようなコマンドを入力すればsomのユニットの特徴を表示しない散布図のようなのを表示することができるのでしょうか?

ご回答よろしくお願いします.

  • example(xyf) で動きますよね。理解できないと言われても困るんですけど。オンラインヘルプを読んでください。 -- 2008-05-15 (木) 16:06:45
  • 下のんと一緒の書き込みをしました.example(xyf)をやってみたんですが,初めの1つは実行されましたが,もう1つのwinesのデータが必要なものは実行されませんでした. -- たにくん? 2008-05-16 (金) 15:58:56
  • predict の中で使われている map 関数の指定が悪いと言うことでしょうね。自分で直すか,作者に依頼するか。 -- 2008-05-16 (金) 16:32:37
    xyf> xyf.prediction <- predict(xyf.wines, newdata=Xtest)
     以下にエラー map(object, newdata, whatmap, weights) : 
       使われていない引数 (1)
  • すみません,map関数が分かりません.
    kohonenの中のやつですよね.~確認しておきます.
    xyf.wines <- xyf(Xtraining,classvec2classmat(wine.classes[training]),grid = somgrid(5, 5, "hexagonal"))~ のclassvec2classmatは何を表しているのでしょうか?
    オンラインヘルプでは0と1の行列を用いるとか言うのを書いているのですが,
    その行につけるラベルみたいなものですか?ご解答お願いします -- たにくん? 2008-05-21 (水) 15:17:34
  • 「ヘルプを見たけどわからないので,教えて...」と,こういう質問の仕方は一番嫌われるものだと思います。example(classvec2classmat) とかもやってみて,ヘルプもちゃんと読んで,それでもわからなかったら,日本語で説明を書いてもらってもわからないのではないかな。あるいは,わかってもらうためにくどくど書くのも面倒だとか。 -- 2008-05-21 (水) 19:01:39

パッケージkohonenのwinesというデータが見つからない.

小心者? (2008-05-15 (木) 14:25:03)

研究でRを使うことになり,特に統計データによる診断関係を行っています.

library(kohonen)を開いて,xyfを使うことにしました.
その例で本来winesというデータがパッケージには含まれているはずですが,それが入っていませんでした.
wines.classesもありませんでしたので,これらはどこかでソースをダウンロードしないといけないのですか?
その場合,どこでダウンロードできるのか教えてください.
file:///E:/Program%20Files/R/R-2.7.0beta/library/kohonen/html/wines.html
にはソースが以下のHPにあると書いてますが,見つかりませんでした.
http://kdd.ics.uci.edu/

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

  • kohonen package はインストールしたのですか?上の「たにくん」もわからないと言っているのでしょうか? -- 2008-05-15 (木) 16:06:59
  • kohonenはinstall.pakages()でインストールを行いました.しかし,データが含まれていませんでした.やはり外部からのダウンロードになるんですか?? -- 小心者? 2008-05-16 (金) 15:30:30
  • 普通,あるはずなんですけど?
    > library(kohonen)
     要求されたパッケージ class をロード中です 
    
    > data(wines) # これが,必要だよ
    > head(wines)
         alcohol malic acid  ash ash alkalinity 右方省略
    [1,]   13.20       1.78 2.14           11.2 
    [2,]   13.16       2.36 2.67           18.6 
    [3,]   14.37       1.95 2.50           16.8 
    [4,]   13.24       2.59 2.87           21.0 
    [5,]   14.20       1.76 2.45           15.2 
    [6,]   14.39       1.87 2.45           14.6 
    > head(wines.classes)
     以下にエラー head(wines.classes) : 
       オブジェクト "wines.classes" は存在しません 
    wines.classes というのは,library(help=kohonen) で出てくるリストにもないので,ないのでしょうね。 -- 2008-05-16 (金) 15:45:41
  • もしかして,data(wines) ってのを,やらなかったとか? -- 2008-05-16 (金) 16:45:28
  • いいえ,data(wines)は使いましたが,いきませんでした.
    versionが2.7.0 betaなのですが,そこに何か不具合があるんでしょうか?
    僕のもので入ってないのはおかしいですからね,何か原因があるんだと思います.
    後,この質問には関係ないのですが,上のような整理されたコメント(あるいは出力値)を挿入するのはどのようにすればいいですか?
    今のコメントではどうも読みにくくなりご迷惑をかけてしまうと思いますので.-- 小心者? 2008-05-20 (火) 18:59:40

Rで組み合わせの結果を表示したい

edora? (2008-05-13 (火) 15:01:51)


Rと統計を学び始めています。
Rで組み合わせを行い、すべての組み合わせを表示させたい場合はどんなコマンドを
使えば良いのかわからずにいます。

x <- (1,2,3,4,5,6,7,8,9,10)
このxの中から2つの数字の組み合わせ45通りを表示させたいと思っています。
(1,2)(1,3)…(9,10)

またこれらの平均や分散を求めたり、度数分布表示が出来ればと思っています。

コマンドを調べる方法がよくわかっていないのですが、"Rと組み合わせ"と検索して
choose(10,2)のように組み合わせの10C2の計算方法がわかった段階で進めないでいます。
よろしくお願いします。

  • ?combn -- takahashi? 2008-05-13 (火) 15:28:02
  • 何の分散、度数分布? -- 2008-05-13 (火) 21:03:37
    > x <- 1:10
    > combn(x,2)  # すべての組み合わせ列挙
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14]
    [1,]    1    1    1    1    1    1    1    1    1     2     2     2     2     2
    [2,]    2    3    4    5    6    7    8    9   10     3     4     5     6     7
         [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25] [,26]
    [1,]     2     2     2     3     3     3     3     3     3     3     4     4
    [2,]     8     9    10     4     5     6     7     8     9    10     5     6
         [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38]
    [1,]     4     4     4     4     5     5     5     5     5     6     6     6
    [2,]     7     8     9    10     6     7     8     9    10     7     8     9
         [,39] [,40] [,41] [,42] [,43] [,44] [,45]
    [1,]     6     7     7     7     8     8     9
    [2,]    10     8     9    10     9    10    10
    > combn(x,2,FUN=mean) #それらの平均
     [1] 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5 2.5 3.0 3.5 4.0 4.5 5.0 5.5 6.0 3.5 4.0
    [20] 4.5 5.0 5.5 6.0 6.5 4.5 5.0 5.5 6.0 6.5 7.0 5.5 6.0 6.5 7.0 7.5 6.5 7.0 7.5
    [39] 8.0 7.5 8.0 8.5 8.5 9.0 9.5
  • まあたとえば,table(combn(n1+n2, n2, sum)-n2*(n2+1)/2) で二群のサンプルサイズ n1, n2 のときのマン・ホイットニーの検定統計量の分布が分かったりする。 -- 2008-05-13 (火) 23:24:33
  • gregmiscパッケージにもcombinations()があります。 -- 2008-05-13 (火) 23:32:16
  • ありがとうございます。combnのような事をやりたかったのです。Rのverが2.3.0だったので2.7.0をインストールして出来ました。2つのverがあっても不具合は無いでしょうか? -- edora? 2008-05-14 (水) 00:59:40
  • 度数分布は、combn(x,2,FUN=mean)で出たものを分布図を作って中心極限定理のような形の確認をしたかったのです。 -- edora? 2008-05-14 (水) 01:03:43
  • hist(combn(x,2,FUN=mean))でやってみました。ちょっとx軸がずれているのですが直せないでいます。 -- edora? 2008-05-14 (水) 01:26:58

クロス集計時に起きるエラーについて

初心者? (2008-05-12 (月) 17:18:45)

クロス集計を作成する際に出るエラーで困っています。
非常に難しい点が、エラーが出る条件に再現性が見いだせないところなのですが、アドバイスいただけると嬉しいです。

A B C D E F G H
0 1 0 0 0 0 0 0
0 1 0 1 1 0 0 0
0 1 0 0 0 0 0 0
0 1 0 0 1 0 0 0
1 1 1 0 1 0 0 0
1 1 1 0 1 0 1 0
1 1 1 0 1 0 0 0
1 1 1 0 0 1 0 0
1 1 1 0 0 0 1 1

 上記のようなデータをtmpとして、以下のスクリプトを実行しています。

for(i in c(1:3)){
	 tab_del <- read.table("tab_del.csv", sep = ",")#tab.csvをtab_del(白紙のcsv)に初期化
	write.table(tab_del, "tab.csv", sep = ",", row.name = F, col.name = F)
	for(j in c(1:5)){
	 	tab <-t(xtabs(tmp[,3+j]~tmp[,i], tmp))
		 write.table(tab, "tab.csv", sep = ",", row.name = F, col.name = F, append = T)
		 }
	 tab <- read.table("tab.csv", sep = ",")
	 t_tab <- t(tab)
	 write.table(t_tab, "t_tab.csv", sep = ",", row.name = F, col.name = T, append = T)
}


 上のデータではエラーが起きないのですが、実際のデータを扱った場合、「重複したrow.namesは許されません」というエラーが出ることがあります。

 エラーの原因は、ループのiで起きていることまでは突き止めました。
 具体的には、「特定のi列」(後述)を除くとエラーは発生せずにファイルが作成されるからです。
 ただ、問題なのは、同じデータで同じスクリプトを実行しても、「特定のi列」が毎回異なります。
 たとえば、一回目にi=1列目を除くことでエラーが出なくなったので、2回目にi=1行目を除いて同じスクリプトを実行すると、今度は異なるi列が原因でエラーが発生します。

 スクリプトの問題なのか、データの問題なのかもはっきりせず困り果てています。どうぞよろしくお願いします。

  • プログラムを載せるなら,動く状態のものにしてください。また,必要なファイルなどもその内容について記述してください。「tab_del(白紙のcsv)」って,どんなものなんですか?エラーのでないテストデータって,付いていても無意味。実際のデータを出すわけにはいかないのは当たり前だが,エラーを出す最小限のデータを付けるのが礼儀。プログラムを見ても,何がやりたいのかわからない。 -- 2008-05-12 (月) 17:58:36
  • 説明不足で申し訳ありません。「tab_del.csv」はまったく何も書かれていないデータです。あと、テストデータについては、おっしゃる通りなのですが、なにぶんエラーの出る条件が特定できていないので、データのどの部分をテストデータにするかもわからなかったため、こういった形で出させていただきました。 -- 初心者? 2008-05-12 (月) 18:48:20
  • 「まったく何も書かれていないデータ」?
    改行コードすら含まれない,長さ0のファイルですか?そんなことないですよね。 -- 2008-05-12 (月) 19:06:41
  • 具体的には、新規のエクセルファイルを開いて、そのままcsv形式で保存してさくせいしました。 -- 初心者? 2008-05-12 (月) 19:35:02
  • そのようにして作った tab_del.csv を読もうとすると,エラーが出るんですけど -- 2008-05-12 (月) 19:42:24
     以下にエラー read.table("tab_del.csv", sep = ",") : 
       入力中には利用可能な行がありません
  • お返事が滞っているようですが,どうも,ファイルのオープンとクローズに問題があるのではないかと思いますよ。j の for ループでwrite.table しているけど,クローズしないまま read.table しようとしていますよね。あなたが本当は何をやりたいのかまだよく分からないけど,少なくともオープン・クローズをちゃんとやれば動くんじゃないかな?それと,tab_del に関する2行はよく分からないけど不要なんじゃない?必要だとしても,何もファイルを読んで初期状態を設定する必要はないと思いますよ。 -- 2008-05-12 (月) 22:16:54
  • write.tableは普通はファイルのcloseまで行うので、そういう問題ではないでしょう。そもそもファイルを閉じる方法がない。質問者の質問には現段階で答えようがないので、自分がやっていることを正確に記述することをお勧めします。 -- 2008-05-12 (月) 23:35:41
  • エラーの原因ではないけど,xtab の formula が変ですね。xtabs(~tmp[,3+j]+tmp[,i]) でしょう。 -- 2008-05-13 (火) 18:57:54
  • 要するに,上のデータ例だと,2×2集計表をiごとにj=1~p までまとめて表示したいのかなあ。だったら,結果がリストになるけど以下のようにすればいかがか。
    sapply(1:3, function(i) matrix(sapply(1:5, function(j)
       xtabs(~tmp[,3+j]+tmp[,i])), 2))
    結果は以下のようになる
    [[1]]
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    3    5    2    2    4    4    4    3    4     4
    [2,]    1    0    2    3    0    1    0    2    0     1
    
    [[2]]
         [,1] [,2] [,3] [,4] [,5]
    [1,]    8    4    8    7    8
    [2,]    1    5    1    2    1
    
    [[3]]
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    3    5    2    2    4    4    4    3    4     4
    [2,]    1    0    2    3    0    1    0    2    0     1
    まあ,応答が途絶えたのでどうでも良いのかも知れないが。 -- 2008-05-13 (火) 23:13:34

R2.7.0 Windows版のPDFに日本語が表示されない

X Jr.? (2008-05-07 (水) 22:43:10)

Windows XP です。

> sessionInfo()
R version 2.7.0 (2008-04-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 datasets  utils     methods   base     

で、

> plot(1, main = "テスト")

として、[ファイル]→[別名で保存] から PDF で保存すると、main の部分に何も表示されません。
PDF に保存した直後に再度、同じ命令を入れると、

> plot(1, main = "テスト")
Warning messages:
1:  'PostScriptStringWidth' 中に不正な文字列  
2:  'PDF_Text' 中に不正な文字列  

というメッセージが出ます。さらにもう一度同じ命令を入れるとメッセージは出ません。
.Rprofile には

setHook(packageEvent("grDevices", "onLoad"),
        function(...) grDevices::ps.options(family="Japan1GothicBBB"))

の記述をしています。これを外して同じようにすると、PDF の main の部分に点が9個並びます。

> plot(1, main = "テスト")
> plot(1, main = "テスト")
 18 件の警告がありました (警告を見るには warnings() を使って下さい) 
> warnings()
 警告メッセージ: 
1:  'mbcsToSbcs' 中の '繝・
2:  'mbcsToSbcs' 中の '繝・
     略
17:  'mbcsToSbcs' 中の '繝・?
18:  'mbcsToSbcs' 中の '繝・?

そして、上記のようなメッセージが出ます。
よろしくお願いします。

  • ps.options は pdf.options ではない?
    実は,下の質問(Macintosh)で 「pdf ファイルに出すときにはちゃんと日本語は出るけども,」と書いたのは,
    setHook(packageEvent("grDevices", "onLoad"),function(...)  
    grDevices::pdf.options(family="Japan1"))
    に変更してファイルには出るようにできたからです。 -- 2008-05-07 (水) 23:06:06
  • コメントありがとうございます。そのようにすると、setHook の記述を外したときと同じ結果になりました。 -- X Jr.? 2008-05-07 (水) 23:49:31
  • これはWindows版2.7.0の問題(2.8.0preでも同じでした)なのではないでしょうか。setHookあるいはparでfamily="Japan1GothicBBB"にした場合,例えば「運動不足」という文字列は出力できますが「病」とか「気」は出力できなくなりました。まったく同じコードを2.6.2で実行すると出力できます。しかしどの文字がOKでどの文字がダメなのか規則性が見つかりません。何か逃げ道はないのでしょうか。とりあえず2.6.2を使っておけばいいのですが……(元質問者の方,勝手に使ってしまってすみません。たぶん同じトピックだと思うので)。 -- 中澤? 2008-05-13 (火) 14:16:25
  • 中澤さん、ありがとうございます。試してみました。「運動不足」だと出力されました(びっくり)。そして、「病」と「気」はダメでした(試している間に2.7.0が何度か落ちました)。2.6.2を使うようにしています。 -- X Jr.? 2008-05-14 (水) 00:46:41
  • r45688 で直ります. 二,三日すればpatchedでwindows版もいきわたるでしょう. -- なかま 2008-05-14 (水) 23:50:15
  • 了解です。なかまさん、ありがとうございました。 -- X Jr.? 2008-05-15 (木) 09:08:17
  • いつも大変お世話になっております>なかまさん。素早いご対応,ありがとうございました。 -- 中澤? 2008-05-15 (木) 10:46:38
  • 素早くはないです. と言うか, 修正が追いつきかねます... -- なかま 2008-05-15 (木) 16:37:08
  • patched (r45690) 入れました。問題ありませんでした。ありがとうございました。 -- X Jr.? 2008-05-17 (土) 00:10:42

R2.7.0,Macintosh版でのグラフィック表示における日本語

ご勘弁を? (2008-05-06 (火) 19:23:23)

以下のような状況,コマンドで,表示されるグラフィックにおいて,日本語が文字化けします。なお,ファイルに出力するとちゃんと日本語は表示されます(環境はR2.6.2 と同じで,R2.6.2で同じ事をやると,グラフィック表示も,ファイルでの日本語もちゃんと表示されていました)。

> sessionInfo()
R version 2.7.0 (2008-04-22) 
powerpc-apple-darwin8.10.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     
> hist(rnorm(1000), main="日本語")
  • うーん, Helveticaになってしまうトラップがわかんないけど...
    # これを ~/.Rprofile に入れて(なかったら作ってね)ね
    setHook(packageEvent("grDevices", "onLoad"),
            function(...){
                grDevices::quartzFonts(serif=grDevices::quartzFont(
                    c("Hiragino Mincho Pro W3",
                      "Hiragino Mincho Pro W6",
                      "Hiragino Mincho Pro W3",
                      "Hiragino Mincho Pro W6")))
                grDevices::quartzFonts(sans=grDevices::quartzFont(
                    c("Hiragino Kaku Gothic Pro W3",
                      "Hiragino Kaku Gothic Pro W6",
                      "Hiragino Kaku Gothic Pro W3",
                      "Hiragino Kaku Gothic Pro W6")))
                # grDevices::quartz.options(family="sans")
            }
    )
    attach(NULL, name = "MacJapanEnv")
    assign("familyset_hook",
           function() { if(names(dev.cur())=="quartz") par(family="sans")},
           pos="MacJapanEnv")
    setHook("plot.new", get("familyset_hook", pos="MacJapanEnv"))
    こんなので当面しのぐのはどうでしょうか. -- なかま 2008-05-07 (水) 19:42:04
  • ありがとうございます。助かります。やってみて,ちゃんと日本語が出ることを確認しました。これを色々弄れば,いろんなバリエーションが出るのでしょうね。やってみます。 -- 2008-05-07 (水) 20:19:35

縦に並んだデータから平均を出す方法

シチノスケ? (2008-05-01 (木) 19:15:48)

こんにちは。
次のようなデーセットがあるとします。
変数xについて,personが同じ値のもの同士で平均をとりたいのですが,どうすればいいでしょう?(この場合,4つの平均値をベクトルにして出力することになります。)

           x person
1  13.078577      1
2  13.365019      1
3   6.365492      2
4   6.287424      2
5  13.974501      3
6  12.838648      3
7  11.565927      4
8  10.240504      4


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

  • tapply, by を調べましょう。最初は目的を達するためにどの関数を使えばよいかはわからないでしょう。で,やるべき事は,一冊でも良いから入門書を最初から最後まで目を通すことです。その時点ではそれぞれの関数の使い方を完全に覚えようなどとはしなくても構いません。どんな目的を達するときにはこんな風な名前の関数があった,あのページのどの辺りに書いてあったという記憶を蓄えましょう。後でその機能・関数が必要になったら,目次ででも,索引ででも,関連しそうなところをしらみつぶしでも良いから見てみましょう。こうするだけでずいぶんと自分でできるようになると思います。最初から最後まで目を通すということを何回もやりましょう。次第に部分部分を丁寧に読んで,機能や関数を少しずつ覚えましょう。何度も繰り返すと,もう知っている部分はとばすことができますから,目を通すのに必要な時間はだんだん減っていきます。そのうち,もうその本は殆ど必要なくなるでしょう。そうなったら,もうすこし難易度の高い本を購入して,同じ事を繰り返しましょう。あなたはいつかRの達人になるでしょう。 -- 2008-05-01 (木) 19:34:27
  • データセットがdataとして、with(data,tapply(x,person,mean)) または tapply(data$x,data$person,mean) でもどっちでもよい。 -- 2008-05-01 (木) 20:31:51
  • xにNAが含まれていると「引数は同じ長さでなければなりません」のエラーがでます。na.rm=Tはどのように条件として入れるのでしょうか。割り込みの質問で、恐縮です。 -- yh? 2008-05-03 (土) 22:12:58
  • > na.rm=Tはどのように条件として入れるのでしょうか
    あなたは一体どのようにしたのでしょうか?あなたの言うようなエラーは出ませんでしたよ。
    tapply のオンラインヘルプは見ましたか?答えは書いてあると思いますよ。 -- 2008-05-03 (土) 22:22:06
  • 失礼しました。自分のデータで記述を間違ったためでした。ちょうどこの例では、tapply(data,data$peason, sum,na.rm=T)というように記述したためでしたが、これもうまく行きます。わかってしまうと簡単でした。どうも有り難うございました。 -- yh? 2008-05-04 (日) 00:31:29

テーブルの要素から上位のものを抽出

yuta? (2008-05-01 (木) 14:29:36)

次のようなテーブル(またはデータフレーム)があるとします

   A B C D
1  1 4 0 2
2  0 1 5 3
3  3 2 1 1
4  4 2 4 1
5  5 9 3 0

このテーブルの、例えば各列の上位2つの要素だけを抽出し集計し直したテーブル(すなわち下のようなもの)を新たに定義するべく、列ベクトルのソートとmerge()を組み合わせてみたのですが、うまくいきません。うまい方法をご存じの方、ご教示いただければと思います。

こんな結果が得たい>

   A B C D
1  0 4 0 2
2  0 0 5 3
4  4 0 4 0
5  5 9 0 0
  • データフレームがxだとして、 x2<-x*ifelse(apply(-x,2,rank)<=2,1,0);x2[apply(x2,1,any),] 一時変数を作らずに済ます方法はないものかなあ -- takahashi? 2008-05-01 (木) 14:52:41
  • 最大値もしくは二番目に大きな値が複数ある時はどうしたいんですか?それにより答えの難易度がかなり変わる。 -- 2008-05-01 (木) 15:02:06
  • タイの扱いは悩ましいところなのですが、複数の値をいずれも採用するのが当初仕様です -- yuta? 2008-05-01 (木) 15:30:46

NAを含むデータフレームの列別の合計や平均値を求める方法は?

yh? (2008-04-29 (火) 00:43:59)

Rの初心者です。xのdata.frameにNAが含まれていると、列の合計値や平均値が求められませんが、何か簡単に求める方法はないのでしょうか。
例えば、xの内容が次の場合、

 A  B  C
1 1  2 NA
2 2  3  4
3 3 NA  5
4 4  5  6
5 5  6  7

次のように書けば、

for(i in 1:3){y<-append(y,sum(x[,i][!is.na(x[,i])]))}
> y
[1] 15 16 22

で求められることがわかりましたが、これでは記述が煩雑で長くなり、Rの簡便な表記方法で演算できるすばらしい特長を損なっているように思います。何かよい方法があると確信していますが、調べても記載が見つけられないのでお尋ねします。どうぞよろしくお願いします。

  • あってもおかしくない -> たいていある、が R の良いところですね。 -- 2008-04-29 (火) 01:17:40
    > x
      A B  C
    1 1 2  3
    2 2 3  4
    3 3 4 NA
    4 4 5  6
    > rowMeans(x, na.rm=TRUE)
    [1] 2.0 3.0 3.5 5.0
    > rowSums(x, na.rm=TRUE)
    [1]  6  9  7 15
  • 早速の回答を有り難うございました。na.rmとはNAをremoveするという意味でしょうか。やはり簡単に記述できるのですね。追加質問で恐縮ですが、要素数合計を求める記述はないのでしょうか。例えばrowCountsのように。lengthを使えば可能ですが。 -- yh? 2008-04-29 (火) 02:39:05
  • 少し工夫が必要 -- 2008-04-29 (火) 13:08:36
    > !is.na(x)
            A    B     C
    [1,] TRUE TRUE  TRUE
    [2,] TRUE TRUE  TRUE
    [3,] TRUE TRUE FALSE
    [4,] TRUE TRUE  TRUE
    > rowSums(!is.na(x))
    [1] 3 3 2 3
  • あっ!なるほどと感心しました。sumでもTRUEの個数をカウントできることを気付き、すっきりしました。大変に有り難うございました。 -- yh? 2008-04-29 (火) 18:10:10
  • 失礼、行ではなく列、ということでしたね。もうお分かりと思いますが、代わりに colSums(), colMeans() 関数があります。 -- 2008-04-29 (火) 20:32:44

for文での連続した処理

初心者? (2008-04-27 (日) 19:22:10)

初歩的な勘違いをしていると思いますが、ご指摘くだされば幸いです。

> a1<-c(1,2)
> a2<-c(3,4)

とし、

> for(i in 1:2){x<-paste("a",i,sep="");mean(x)}

とすると、

NA 
NA 
Warning messages:
1: 引数は数値でも論理値でもありません。NA 値を返します in: mean.default(x) 
2: 引数は数値でも論理値でもありません。NA 値を返します in: mean.default(x) 

と返ってきますが、a1,a2のそれぞれのmeanの値を返すには、
どういうプログラム文が必要でしょうか?

  • 昔から何度も出てきている質問で「変数名を自動的に作って処理する」やつですが、変数名を自動的に作っても、それは変数(a1)ではなくただの"a1"というキャラクターになるわけで、"a1"というキャラクターのmeanを取ろうとするのでエラーになります。こういう場合はeval(parse(text="***"))を使います。-- okinawa 2008-04-27 (日) 19:35:58
    a1<-c(1,2)
    a2<-c(3,4)
    for(i in 1:2){
    	text0<-paste("x<-a",i,sep="") #実行される文を作る
    	eval(parse(text=text0)) #textには実行される文を指定
    	print(mean(x))
    	}
  • 実行できました。どうもありがとうございます。過去ログは読み、evalも見つけたのですが、理解不足でした。 -- 初心者? 2008-04-27 (日) 20:20:49

R2.7.0におけるlocator()の仕様

すろん? (2008-04-25 (金) 18:15:18)

iMacG5, MacOSX10.5.2にR2.7.0を入れました。

R2.6.2を利用していたときは,

> locator()

と入力してenterキーを押した後,適当にQuartzデバイス画面をクリックして再びenterキーを押せば,クリックしただけx, y座標を出力してくれたと思います。先ほどR2.7.0にアップデートして同じような操作をしたら,なかなかlocator()が終わってくれませんでした。Rのヘルプには,Escキーで終了させろと言っているようなので,それもやってみましたが終わりません。ついにはRが固まってしまうという事態になったので,やむなくRを強制終了しました。

この動作を2,3回繰り返した後,再びRを起動して,

> locator(1)
> locator(5)

などと命令しました。これは問題なく動作しました。しかしlocator(5)を途中で終わらせようとするとうまくいきません(EnterキーやEscキーを押してみたり,STOPボタンを押してみたり)。

括弧の中の数値が大きい場合など,途中でやめたい時もあるので悩んでおります。このような状況は,他の方にも現れているのでしょうか?2.7.0の仕様なので仕方がないことなのかどうか教えていただけると助かります。

  • 私のMac(IntelMacBookBlack2G&Leo.2)でも同じですね。2.6.*ではESCキーを押すと落ちたりしてたので使えなくしてるのかも・・・。 -- okinawa 2008-04-26 (土) 07:45:21
  • 確認していただいてありがとうございます。IntelMac?でも同じような症状でしたか。やはり2.7.0の仕様なのですね。これはあきらめて,何か良い方法を考えます。 -- すろん? 2008-04-26 (土) 20:18:35

データーフレームからの特定条件の抽出

subset? (2008-04-23 (水) 22:56:19)

いつも拝見しております。
どうしてもうまくいかないので、ご教授を願います。
下記のようなデータフレーム DFの抜粋があるとします。
Xには何らかの数字が入っているとします。

  
	  A	  B       C     D
   a	0.265  -0.422  -0.735   X
   b	0.000 	0.273  -0.102   X
   c	0.647  -0.233  -0.593   X
   d	0.551  -1.171  -2.047   X
   e  -0.078 	0.177 	0.213   X
   f   0.023  -0.330  -0.380   X
   g  -0.129 	0.086 	0.277   X
   h	0.174  -0.571  -0.095   X
   i   X    X      X     X
   j   X    X      X     X 

  
これから、
� (B-A) >= 0.2 または (C-A) >= 0.2
� (B-A) >= 0.2 ではあるが (C-A) >= 0.2を除くデータ
� (C-A) >= 0.2 ではあるが (B-A) >= 0.2を除くデータ
� �で作ったデータフレームを利用し (D - B) >= 0.2ではあるが (D - C) >= 0.2を除くデータ  
をそれぞれ抽出し新たなデータフレームを4つ作りたいと思います。

自分なりに調べsubsetで抽出してみましたが下記のようにしても
うまくいきませんでいた。

 A1 <- subset (DF, (B - A) >= 0.2 | (C - A) >= 0.2 )
 A2 <- subset (DF, (B - A) >= 0.2 &! (C - A) >= 0.2)
 A3 <- subset (DF, (C - A) >= 0.2 &! (B - A) >= 0.2)
 B1 <- subset (A1, (D - B) >= 0.2 &! (D - C) >= 0.2)

アドバイスをいただければと思います。
よろしくお願いいたします。

  • なにがうまくいかないのですか? ちなみに、A1のところは | じゃなくて & です。 -- 2008-04-24 (木) 00:16:49
  • うまくいきましたよ。 -- 2008-04-24 (木) 01:24:07
  • コメントありがとうございます。私の環境で実行しますと、A1〜A3までは理想の結果が得られるのですが、B1の結果にはA1のデータフレームからの結果が反映されてずDFからの結果が反映されているようです。ちなみにRのバージョンは2.6.2ですがバージョンの違いでしょうか? -- subset? 2008-04-24 (木) 05:59:02
  • ちゃんとできるよ.なんか考え違いしているんじゃない?
    set.seed(1)
    DF <- data.frame(
     A=c(.265,0,.647,.551,-.078,.023,-.129,.174,round(runif(2,0,1),3)),
     B=c(-.422,.273,-.233,-1.171,.177,-.330,.086,-.571,round(runif(2,0,1),3)),
     C=c(-.735,-.102,-.593,-2.047,.213,-.380,.277,-.095,round(runif(2,0,1),3)),
     D=round(runif(10,-1,1),3),
     row.names=letters[1:10])
    A1 <- subset (DF, (B - A) >= 0.2 | (C - A) >= 0.2 )
    A2 <- subset (DF, (B - A) >= 0.2 &! (C - A) >= 0.2)
    A3 <- subset (DF, (C - A) >= 0.2 &! (B - A) >= 0.2)
    B1 <- subset (A1, (D - B) >= 0.2 &! (D - C) >= 0.2)
    C1 <- subset (DF, (D - B) >= 0.2 &! (D - C) >= 0.2)
    • 2008-04-24 (木) 23:12:26
  • &! というのは使いたくないなあ。せめて & !( のように,&と!はスペースで離して,!と(の間にはスペースを入れないようにしたい。それよりは,(B - A) >= 0.2 & (C - A) < 0.2 としたい。わざわざ複雑に書くことない。-- 2008-04-25 (金) 09:22:22
  • コメント有り難うございます。ただ、上記のB1 <- subset (A1, (D - B) >= 0.2 &! (D - C) >= 0.2)を
    B1 <- subset (A1, (D - B) >= 0.2 | (D - C) >= 0.2)
    B2 <- subset (A1, (D - B) >= 0.2 &! (D - C) >= 0.2)
    B3 <- subset (A1, (D - C) >= 0.2 &! (D - B) >= 0.2)

に変更し計算させたところ、データの数が B1 = B2 + B3 になりませんでした。 内容を確認したところ、どうもB2, B3の結果はDFのデータから抽出したものになっているようです。

いろいろ調べたのですが、皆様がおっしゃるように方法自体は間違いでは ないと思うのですが。不思議でしょうがありません。-- subset? 2008-04-25 (金) 09:29:34

  • >データの数が B1 = B2 + B3 になりませんでした。
    なるよ.上記の例だと, B1 が b, g, i で, B2 が g で, B3 が b, i. -- 2008-04-25 (金) 10:15:11
    > ( B1 <- subset (A1, (D - B) >= 0.2 | (D - C) >= 0.2) )
           A     B      C     D
    b  0.000 0.273 -0.102 0.322
    g -0.129 0.086  0.277 0.374
    i  0.266 0.573  0.202 0.540
    > ( B2 <- subset (A1, (D - B) >= 0.2 &! (D - C) >= 0.2) )
           A     B     C     D
    g -0.129 0.086 0.277 0.374
    > ( B3 <- subset (A1, (D - C) >= 0.2 &! (D - B) >= 0.2) )
          A     B      C     D
    b 0.000 0.273 -0.102 0.322
    i 0.266 0.573  0.202 0.540
    > subset (DF, (D - B) >= 0.2 &! (D - C) >= 0.2)
           A      B      C      D
    g -0.129  0.086  0.277  0.374
    h  0.174 -0.571 -0.095 -0.232
    > subset (DF, (D - C) >= 0.2 &! (D - B) >= 0.2)
          A     B      C     D
    b 0.000 0.273 -0.102 0.322
    i 0.266 0.573  0.202 0.540
  • subset自体じゃなくてその周りに間違いがあると思うから、再現できるプログラムをそのまま書いたほうがよいかと。 -- 2008-04-25 (金) 10:42:27
  • うまくいきました。失敗の原因は符号が逆でした。簡素な式を心がけるようにしたいと思います。 -- subset? 2008-04-25 (金) 18:29:40
  • 脱力。論理式の簡略化は簡単なことなのですから。簡略化するのは,自分の考え方を整理する事でもある。易しく素直に書くことは,それこそ間違いをなくす根本だから。自分で自分を困惑させる必要はないのだから。 -- 2008-04-25 (金) 23:13:40

各列の項目ごとの集計表を一つの表にまとめるには?

初心者? (2008-04-22 (火) 18:49:31)
 A B C D

 1 a 5 1
 2 c 3 0
 1 a 3 1
 1 b 1 0 
 2 a 2 0
 1 a 4 0

といった行列から

1 2       ←Aについての集計表
4 2
a b c     ←Bについての集計表
4 1 1
1 2 3 4 5 ←Cについての集計表
1 1 2 1 1
0 1       ←Dについての集計表
4 2


といった感じで、各列の項目ごとの集計表を一つにまとめるにはどうすればよいのでしょうか?

試しに以下のようなスクリプトを書いてもみましたが、うまくいきませんでした。

xlab <- c(names(x))	#列タイトルのベクトル化
n <- ncol(x)	#繰り返し回数(列数)の取得
for (i in 2:n){
	cbind(table(x$xlab[i-1]),table(x$xlab[i]) )
}


アドバイスいただけないでしょうか?
 

  • ひとつにまとめるってのがよくわかんないけど、apply(x,2,table) とかそういうことかな? -- takahashi? 2008-04-22 (火) 19:22:30
  • あなたが求める形式となるべく近いものを得るには,for (i in 1:ncol(x)) print(table(x[,i])) かな(邪道だけど) -- 2008-04-22 (火) 23:17:55
    > for (i in 1:ncol(x)) print(table(x[,i]))
    
    1 2 
    4 2 
    
    a b c 
    4 1 1 
    
    1 2 3 4 5 
    1 1 2 1 1 
    
    0 1 
    4 2
  • ありがとうございました。以下のようなスクリプトで解決しました。 -- 初心者?     x <- データ
    	n <- ncol(x)
    	#各列ごとにテーブル集計を行う
    	a <- apply(x, 2, "table")
    	#各列のテーブルを一つのテーブルに追加
    	for(i in 1:n){
    		write.table(a[i], "y.csv", sep = ",", append = T)	
    	}

2008-04-23 (水) 11:19:13

gzファイルのパッケージ

MA? (2008-04-19 (土) 20:00:30)

WindowsOSとWindowsのRで、.gzで圧縮されたパッケージを使う場合、一回展開してからzipにすると、
以下にエラーunpackPkg(pkgs[i], pkgnames[i], lib, installWithVers?) :

       malformed bundle DESCRIPTION file, no Contains field

となってしまいます。
他に方法があるのでしょうか?
ちなみに、パッケージのリストには表示されません。

  • Windows は使ったことがありませんが、Windows 用のバイナリは最初から zip ファイルで配布されていますね。gz ファイルというのが理解できないのですが、もしかしてソースからインストールしようとしてるのでしょうか?それは(自前でコンパイル環境を整備していない限り)できないとおもうのですが. -- 2008-04-19 (土) 22:32:49
  • 上で指摘されている通り、tar.gz付きはソースファイルですので、インストールするにはコンパイルする必要があります。これはlinux環境の方かR玄人以外は使っていないので素直にzip付きを使うべきでしょう。(ちなみにMacはdmgです) -- okinawa 2008-04-20 (日) 08:51:59
  • コメントありがとうございます。zipで探してみます。 -- MA? 2008-04-20 (日) 09:29:01
  • ちなみに、ソースのかかれた.Rファイルをパスのとおっているディレクトリにおくことで、source("xxx.R")で利用も可能なようでした。 -- MA? 2008-04-23 (水) 20:27:18
  • 純粋にRだけで書かれている自己充足的な関数はそうでしょうね。しかし、しばしば C や Fortran といった他言語でかかれたライブラリを利用するパッケージがありますから、やはりコンパイル済みのバイナリを使うことをおすすめします。すべてのパッケージが Windows 用のバイナリパッケージを用意しているわけではありませんが。 -- 2008-04-23 (水) 21:15:45
  • それとパッケージからインストールしないとオンラインヘルプドキュメント等も利用できないはずですね。 -- 2008-04-23 (水) 21:17:12

Rの独習方法

デッサウ? (2008-04-19 (土) 19:30:38)

これから本気でRを独習しようと考えております。
理系出身であり、いまはエクセルで重回帰分析を
行っておりますが統計についての知識は乏しく、
解析自身にも自信が持てません。
正しく統計解析を行えるようになりたく
アドヴァイスありましたらよろしくお願いします。

  • 「正しく統計解析を行えるように」 -> 初級Q&Aで答えられるような質問ではないですね(笑)。しっかりした統計の本をまず一冊読み、後は実践、格闘、試行錯誤あるのみです。 -- 2008-04-20 (日) 07:15:30
  • 私の経験(医療生物統計)で言えば、(1)データの尺度分類/振る舞い方(経験上もしくは文献上どの項目と関連があるかないか)の把握が正確にできること。(2)データ(もしくはその組み合わせ)から適切な統計手法を選択できるか。だと思っています。(1)が出来ないと(2)がうまくできないので、本当に適切な解析だったか不安になります。(1)の部分はほとんどの統計入門書のなかでは軽視されており、すぐ(2)の手法の解説に走る傾向があります。統計学はデータの科学であると、偉い先生が言われていましたが、扱う「データ」自体を良くわからずに解析している学会発表が非常に多いです。(S*SSがPCで簡単に使えるようになってから、このような解析が急増し、いちいち指摘するのも疲れるくらい多くなり、指摘するのをやめてしまった多くの先生方がいると思います) -- okinawa 2008-04-20 (日) 08:41:44
  • ブラックボックスを使うのは止めましょう。十分に理解したかどうか,客観的な判断も難しいことではあるし,行けども行けども極めることが難しい道ではあるとは言うものも,努力を続けるしかないでしょう。永遠に続く,求道ですね。学問に王道なし。 -- 2008-04-20 (日) 22:04:54
  • 曖昧な質問になってしまいましたが回答ありがとうございまず。データの判断や解析手法をしっかり学ぶ必要があるのですね。オススメの入門書ありましたら教えてください。また、正しい解析を行うため練習問題(玄人の解析結果がある統計データ)を行いたいのですが適当なものありましたらご教授願います。よろしくお願いいたします。 -- デッサウ? 2008-04-22 (火) 07:49:36
  • まず青木先生のサイトで勉強されたらいかがですか? そしてできれば、手元にはあなたの分野で外国の方が書いた統計入門本の訳本と最近の文献(英語・日本語)を集めて読むこと。ネットの統計サイトにわからないことをたくさん投稿して、叩かれながら理解してゆくこと。-- okinawa 2008-04-22 (火) 08:22:56
  • 練習 -- st? 2008-07-01 (火) 11:18:40

AIX6へのインストール

シバタ? (2008-04-18 (金) 13:12:54)

AIX6(64bit)にRの最新版をインストールしたいのですが、対応しているのでしょうか。インストールして使用している方いらっしゃいますか。もし情報がありましたら、教えて下さい。宜しく御願い致します。

  • 実際にインストールして,動くかどうか試したら,質問への回答を待つより速く答えが得られそうに思います。 -- 2008-04-18 (金) 13:32:20
  • AIXに詳しい人以外には, お薦めしません. 私は, 全AIXバージョンも全AIXコンパイラも持たないので, 微妙なパッチしか作成出来ませんでした. たぶんAIX6にインストールする人は始めてではないでしょうか? AIX5.2とAIX5.3では一部の人が成功しています. より多くはうまくいかないらしいです. 傾向としてはかなりAIXに対する情熱が無いと難しいでしょう. -- なかま 2008-04-18 (金) 15:18:19
  • ご回答有難う御座います。以前、AIX5.2でRをインストールしようとして失敗した経験があります。その時はRのReadMe?にAIX5.2へのインストールが成功した方のコメント(及び簡単な指示)が載っていましたがうまくいきませんでした。(まだ最新のReadMe?を見ていませんが)ReadMe?を見てAIX6へのインストールを成功させた方のコメントがあれば、それをやってみようと思います。(情熱が少ないせいか・・・)今回もコメントをみてもうまく出来ないような気がしてしまいますが。 コメント有難う御座いました。お手数お掛け致しました。 -- シバタ? 2008-04-18 (金) 15:42:19
  • 最低限作業が必要なのは, m4ディレクトリ以下のm4マクロのaix5にaix6を追加し aclocal して, _AIX* とかのifdefで影響が無いか調べてからになると思います. 大変ですねやっぱり(^_^; -- なかま 2008-04-18 (金) 21:17:09
  • http://prs.ism.ac.jp/~nakama/AIX/ でうまく行ったと私以外の人(xlc,xlf)から報告がありました. 商用コンパイラでは問題ないのが確認されましたが gcc,gfortranではうまくいかない部分があります. -- なかま 2008-07-26 (土) 18:33:08

画像ファイルの上書き防止

初心者? (2008-04-16 (水) 12:13:24)

画像ファイルの上書きを防止するにはどうすればよいのでしょうか?

write()などだと、append = Tとすることで上書きを防ぐことができると思いますが、pdfやpngなどの画像ファイルでappend = Tを入れても、「使われていない引数」と言われてしまいます。

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

  • ファイルの存在有無がわかればいいので、こんなのでどうでしょう: -- 鈴木@ef-prime? 2008-04-16 (水) 14:24:46
    if(file.exists(file <- "hoge.pdf"))
    {
       stop("File already exists.")
    } else
    {
       pdf(file)
       plot(1:10)
       dev.off()
    }
  • 上記は勘違いでした。「上書きを防ぐ」というより、「既存のファイルに書き加えたい」わけですね。dev.off()せずにplotし続けるのではなく、既存ファイルに書き込む必要があるのでしょうか? -- 鈴木@ef-prime? 2008-04-16 (水) 16:06:14
  • (質問の趣旨が複数プロットを別個のファイルに書き込みたい、ということだとして) 一つの png() 命令の後に複数のプロット命令を書くと、既定 png(file="Rplot%3d.png")では別個の連番ファイルに書き込まれます。  -- 2008-04-16 (水) 16:37:55
    > png(); plot(runif(10)); plot(runif(20)); dev.off(); list.files()
    null device 
              1 
    [1] "Rplot001.png" "Rplot002.png"
    Tips はファイル名に %d というおまじないを書き込むことです。例えば png(file="myplot%2d.png") とでもしたらどうでしょう。もちろん連番ファイルのどれがどれかは覚えておくか、後で確認する必要があります. ?png より:
    If you plot more than one page on one of these devices and do not
        include something like '%d' for the sequence number in 'file', the
        file will contain the last page plotted.
  • すると
    $ R -q
    > png("hoge%i.png")
    > plot(sin,-pi,pi)
    > plot(cos,-pi,pi)
    > dev.off()
    > q("no")
    $ convert -append hoge1.png hoge2.png hoge.png
    と言うような事を御所望? -- なかま 2008-04-16 (水) 18:07:29
  • たくさんのアドバイスありがとうございます。説明が不十分で申し訳ありませんでした。知りたいことを整理させていただくと、「既存のファイルにプロットを書き加える」のではなく、「(連番などで)複数のグラフを別個のファイルに書き込む」方法です。基本的には、%dのおまじないが有効です。ただ、下のようにした場合問題が生じます。 -- 初心者? 2008-04-17 (木) 10:10:52

  png(filename ="Rplot%03d.png")

 plot(1:10)
 plot(1:15)

  plot(1:20)   dev.off()  こうすると、連番でRplot001-003までが作成されます。

 次に、以下の処理を行うと…

 png(filename ="Rplot%03d.png")
 plot(1:30)
 plot(1:200)
 plot(1:300)
 dev.off()

 上で作成した連番のRplot001-003に上書きされる形でRplot001-003が作成されます。

 できれば、ここを「Rplot004-006という感じで作成したい」と思っています。  これが無理であれば、テキストファイルなどの作成時、append=Tにしたとき、「warning が出て、上書きされない」ということができればと思っています。

 いかがでしょうか?

  • 一つの欠番もなく本当に連番にしたいのなら,自分で管理するしかないでしょう。既存のファイル名をチェックしてその次からのファイル名をプログラム的に作成すればよいでしょう。
    一番簡単にあなたの希望を叶えるのは,もうこれ以上ファイルへ出力する必要はないというときまで,dev.off() を行わないことでしょう? -- 2008-04-17 (木) 10:24:10
  • そんなに使いやすいとは思わないけれど例えば。ただしこれも気をつけないと上書きしてしまいます. -- 2008-04-17 (木) 15:44:06
    > list.files(patt=glob2rx("Myplot*.png"))
    [1] "Myplot1.png" "Myplot2.png" "Myplot3.png" # 既に1から始まる連番ファイルになっているとして
    > png(file=paste("Myplot",  1+length(list.files(patt=glob2rx("Myplot*.png"))),".png", sep=""))
    > plot(runif(10)); dev.off()
    null device 
              1 
    > list.files(patt=glob2rx("Myplot*.png"))
    [1] "Myplot1.png" "Myplot2.png" "Myplot3.png" "Myplot4.png"

複数のグラフを並べて一つのファイルに

iris? (2008-04-14 (月) 12:13:08)

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

複数のグラフを一括で見るためにグラフを並べるにはどうすればよいのでしょうか?

調べてpar(mfrow)を試してみたのですが、できるものとできないものがあり困っています。

できるもの
par(mfrow = c(3,2))
plot(1:5)
plot(1:10)
plot(1:15)


できないもの
x <- iris
par(mfrow = c(3,2))
histogram(~Sepal.Length, data = x)
histogram(~Sepal.Width, data = x)
histogram(~Petal.Length, data = x)

この場合、ヒストグラムは(小さなサイズでは表示されず)一つのグラフを表示させた時と同じサイズで表示され、連続で図を入力すると並べて表示されずに新しいものが表示されてしまいます(おそらく重ね書きされているだけ)。

アドバイスいただけると嬉しいです。

  • print(histogram(~Sepal.Length, data = x),split=c(1,1,3,2)) などなど。もっと簡単なやりかたあるのかなあ。一度?latticeとして、ヘルプを読むことをお勧めします。 -- takahashi? 2008-04-14 (月) 13:30:47
  • ありがとうございます。latticeしっかり読んでみます。 -- iris? 2008-04-14 (月) 15:47:09
  • なぜ,histogram にこだわるのかわからないなあ。確かに,hist にはない機能を持っているが,使われている機能は hist にないものではない。 -- 2008-04-14 (月) 22:35:50
  • histでできました!教科書に沿って勉強していたもので、histogramにこだわりはありません(笑)今のところ、histの方が初心者にも優しい感じがしますね。ありがとうございました! -- iris? 2008-04-15 (火) 10:40:49
  • よかったですね。histogramの解法がわかったらUPしてくださいね。 -- akira? 2008-04-15 (火) 14:08:35

VC++ からR.dllをロード・Rの関数を実行したい → NG:AccessViolation?が発生

(2008-04-13 (日) 18:42:58)

お世話になっております。

VC++6.0上でアプリをつくっています。
目的は「C++のアプリで、C++のソース上からRの関数を実行すること」です。

現在、R.dll をロードさせて、コンパイルを通すことまではできたのですが、Rの関数を呼び出すとAccess Violation が発生して 実行できません。
※バーションは「R-2.4.1」です。

アドバイス頂けないでしょうか。

 以下、私が行った操作です。

 1: R.dllから Rdll.lib を生成
   $pexports R.dll > R.exp

     $lib /def:R.exp /out:Rdll.lib
 2: RのDLLとヘッダーファイルのディレクトリを指定 

   VC++ メニューの「ツール」-「オプション」にて
    ・インクルードファイル "Rのルート"/include

       ・ライブラリファイル   "Rのルート"/bin
 3: 1で作成したRdll.libをリンクさせる

   「プロジェクト」-「設定」
    「リンク」- オブジェクト・ライブラリモジュールに Rdll.libを追加
 4:R言語の関数を呼び出すC++コードを記述して コンパイル
   たとえばこんな感じ

     #include <R.h>
     int main ( void )
     {
      SEXP a = allocVector(STRSXP, 1); // R.dll 内の関数
 
       return 0;
     }

  ※リンクエラーも無く、コンパイルは通ります。

 5:実行
  →NG:allocVector関数コール時にAccessViolation?が発生
       (デバッガ・ステップ実行にて確認)
  ・そもそも、R.dll は VC++上から使用できない?
  ・RcppTemplate?(R/C++間のインターフェース用ツール)のドキュメントを基に行いました。   

  • こうしたかなり特殊な話題はここで質問するよりは RsiteSearch? で検索する方が確実です。キーワード "VC++ R.dll" で検索したら6件ヒットしましたが、あまり有益ではない? -- 2008-04-14 (月) 07:28:45

軸の目盛を内側にしたい

名無し? (2008-04-13 (日) 14:33:04)

お世話になります。
表題のとおりなのですがどうしたら良いのでしょうか?

side3の軸を下まで持ってくればいけるかと思ったのですが

xlim <- c(1,5)
ylim <- c(2,4)
plot.new()
plot.window(xlim, ylim)
box()
axis(1)
axis(3, pos = ylim[1])

中に浮いてうまく重なりませんでした。

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

  • axis(1, tcl = 0.5) でいかがでしょうか? -- 2008-04-13 (日) 20:57:06
  • tckとtclでtickの長さと方向を指定できたのですね。有難うございました -- 名無し? 2008-04-13 (日) 22:32:17

zooオブジェクトをas.tsするとtimeがずれる

名無し? (2008-04-12 (土) 17:05:25)

お世話になります

> z <- zoo(matrix(c(1:4),2),c(as.Date("2008-01-30"),as.Date("2008-02-06")))
> z
2008-01-30 1 3
2008-02-06 2 4

上のようなデータがあったとき

>  julian(time(z))
[1] 13908 13915
attr(,"origin")
[1] "1970-01-01"

ですが、as.tsすると

> as.ts(z)
Time Series:
Start = 13909 
End = 13916 
Frequency = 0.142857142857143 
      zoo(coredata(x), tt).1 zoo(coredata(x), tt).2
13909                      1                      3
13916                      2                      4

となりjulianのときは13908,13915だったのにas.tsでは13909,13916となりずれます。(今回のデータではたまたま1ですがそうでない場合もあるようです)

> z2 <- z
> time(z2) <- julian(time(z))
> z2
         
13908 1 3
13915 2 4
> as.ts(z2)
Time Series:
Start = 13909 
End = 13916 
Frequency = 0.142857142857143 
      zoo(coredata(x), tt).1 zoo(coredata(x), tt).2
13909                      1                      3
13916                      2                      4

としてもずれます。

> as.ts(z2, start=13908)
Time Series:
Start = 13909 
End = 13916 
Frequency = 0.142857142857143 
      zoo(coredata(x), tt).1 zoo(coredata(x), tt).2
13909                      1                      3
13916                      2                      4

startは効きませんでした。
なぜなのでしょうか?

複数のデータ(日付毎のデータと週毎のデータ)を重ねてプロットする際に位置がずれて困るのですが対策法があれば教えてください。

バージョン&OSは
R version 2.6.2 (2008-02-08)
i486-pc-linux-gnu
ubuntu8(hardy)
です。

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

  • zooオブジェクトのままplotしたらだめですか? plot(z, xlim=c(ほげほげ))で。件のずれるのは、zoo:::as.ts.zooregでおきるんだけど、どうしてもtsにしたいなら以下の通り ts(coredata(z),start=as.numeric(start(z)),end=as.numeric(end(z)),freq=frequency(z)) -- takahashi? 2008-04-14 (月) 14:13:50
  • ありがとうございました。そのtsの変換法を使用させていただきます。zooのままplotすることも検討してみます。 -- 名無し? 2008-04-15 (火) 08:55:49

グラフのx軸の作り方を教えてください。

シチノスケ? (2008-04-11 (金) 12:27:15)

こんにちは。
http://www.geocities.jp/t_okumurin/080411graph.bmp
にあるようなグラフをRで作りたいのですが,x軸をどうやって指定したらよいかわかりませんので,教えていただけませんでしょうか。
どうぞよろしくお願いいたします。

  • xaxt="n", axis() -- 2008-04-11 (金) 13:55:27

rJavaで.jinit()に失敗してしまうようです。

はーとりずむ? (2008-04-10 (木) 13:30:54)

お世話になります。

質問内容は、WinXP + R2.6.2 + JRE1.6.0_05上でrJavaやiplotを使用しようとすると、エラーが出てしまい、うまく動作しません。
何か問題解決のヒントがあればご教授ください。

ちなみに実行するたびに、出てくるエラーが違うのですが、概ね下記のとおりです。

[パターン1]
Error occurred during initialization of VM
Could not reserve enough space for object heap
Error in .jinit() : Cannot create Java virtual machine (-4)

[パターン2]
以下にエラー .jinit() : Cannot create Java virtual machine (-1)

また、SessionInfo?()の情報は下記のとおりです。

R version 2.6.2 (2008-02-08)
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] rJava_0.5-1 RODBC_1.2-3

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

  • 原因は全く分からず推測ですが、エラーはRというよりJavaのエラーに見えます。JREのversionがあってないとか?googleで"Cannot create Java virtual machine"してみてはどうですか? -- akira? 2008-04-11 (金) 07:15:37

データフレームのソート方法

masa? (2008-04-09 (水) 21:27:41)

例えば、下のようなデータフレームがあるとします。

      A    B   C 
AB    1    6   1
AC    4    1   3
AD    3    3   1
AE    2    5   2
AF    1    1   1
AG    1    2   4


このようなデータをAの列を基準列として、大きい順に並び替え
A列に含まれる3以上を基準としB,Cを順次大きい数字順に並び替えたいと思います。
例えば下のようにです。

     A    B   C 
AC    4    1   3
AD    3    3   1
AB    1    6   1
AE    2    5   2
AG    1    2   4
AF    1    1   1


一つの列のみの並び替えならば、orderを使用することで
並び替えることができました。

アドバイスをいただければと思います。

  • masaさんのおっしゃる通り「A列に含まれる3以上」かつ「B,Cを順次大きい数字順」をコードにすれば良いと思いますが。ただ、このときに「BとCの大小関係の定義」がわかりません。この辺を考えてみてはどうですか? -- akira? 2008-04-09 (水) 21:46:38
  • 仕様と例が今ひとつしっくりしていない。(仕様の記述が不完全)。プログラムを書くだけのことかも。(エレガントな方法というのはないかも) -- 2008-04-09 (水) 21:47:26
  • コメントありがとうございます。BとCは今度はB内のAに含まれる行(AC,AD,AB)を無視し、B列内で3以上をソートしたいと思います。チャレンジしてみます。 -- masa? 2008-04-09 (水) 21:48:29
  • かぶった?みんな同じ事を考えるんだね。 -- 2008-04-09 (水) 21:48:31
  • 使い始めて日が浅く、order関数で複数行の設定ができませんでした。何かアドバイスをお願いします。 -- masa? 2008-04-10 (木) 07:04:37
  • もちろんRjpwikiで基本操作のページを読むのが正攻法(?)と思います。
    あとはR-Tips金先生のHPも初心者向けでわかりやすいです。私はR-Tipsから始めました。
    最近は他にもR関係のHPが増えているので、googleで自分にあったHPを探してもおもしろいかも。良いHPがあれば教えてください! -- akira? 2008-04-10 (木) 07:19:49
  • 自分なりに調べ、解決したので報告させていただきます。

     sortlist <- rev(order(DF$A )) 
     T1 <- DF[sortlist,]
     T2 <- subset (T1, A >= 3.0)
     T3 <- subset (T1, A < 3.0)
     sortlist <- rev(order(T3$B )) 
     T4 <- T3[sortlist,]
     T5 <- subset (T4, B >= 3.0)
     T6 <- subset (T4, B < 3.0)
     sortlist <- rev(order(T6$C ))
     T7 <- T6[sortlist,]
     T8 <- subset (T7, C >= 3.0)
     T9 <- subset (T7, C < 3.0)
     DF2  <- rbind (T2, T5, T8)

    どうでしょうか。何かアドバイスがあればお願いします。-- masa? 2008-04-10 (木) 16:31:40
  • 少なくとも,最後の行は,DF2 <- rbind (T2, T5, T8, T9) でないと,AF が無くなってしまう。 -- 2008-04-10 (木) 17:52:04
  • 解きほぐすと頭の体操にはなると思うけど、実際は使わないほうがよいコード。 DF[do.call(order,data.frame(t(apply(DF,1,function(x){z<-which(x>=3)[1];c(z,-x[z])})))),] -- takahashi? 2008-04-10 (木) 18:17:56
  • 様々なコメントありがとうございます。 -- masa? 2008-04-10 (木) 19:41:33

作業スペースの保存、読み込みについて

初心者? (2008-04-09 (水) 13:54:17)

R終了時に作業スペースを保存して次にそれを読み込むと以下のようなエラーメッセージが出ます。

load("C:\\Users\\tak\\Documents\\R\\workspace\\.RData")

Warning message:
In readChar(con, 5) : can only read in bytes in a non-UTF-8 MBCS locale

「作業スペースの保存」とは現在の作業を保存して次に立ち上げた時に続きができるようにするものだと解釈しています。アドバイスをお願いします。

R version 2.6.2 (2008-02-08)
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

OS=VISTA

  • ???さんのプログラムが動きました!ありがとうございました。ただ、私の作ったプログラムとakiraさんが書いてくださったプログラム(pdfでも同じでした)が動かない理由が分からないのがやはり残念ですね。問題は何なんでしょう??? -- iris? 2008-04-09 (水) 15:55:51
  • errorじゃなくてwarningです。基本的に無視して大丈夫。 -- takahashi? 2008-04-09 (水) 16:00:50
  • 保存した作業スペースが出てこないで、最初からのスタートになるのですが? -- 初心者? 2008-04-09 (水) 18:02:23
  • 自分で保存したり読み込んだりしているのですか?作業を終わるときにq()とすると,保存するかしないか訊かれるし(保存するを選べばそれだけで保存されるし),開始時には自動的に読み込まれるはずでは? -- 2008-04-09 (水) 18:51:56
  • 自動的に読み込まれません。

[以前にセーブされたワークスペースを復帰します] 起動準備中です ー Warning message:In readChar(con, 5) : can only read in bytes in a non-UTF-8 MBCS locale -- 初心者? 2008-04-09 (水) 19:15:31

とのメッセージになります。

  • 勘違いしてるような気がしているので一応。コンソールの出力履歴とかは保存されません。読み込まれるのは変数定義だけです。例えば、x<-1として、終了(作業スペースの保存)、再度起動して、xと入力したら、1と出力されません? もし私の気のせいでしたらごめんなさい。 -- takahashi? 2008-04-09 (水) 19:20:32
  • 勘違いしてました。ありがとうございました。 -- 初心者? 2008-04-09 (水) 20:27:35
  • 何でそんな変なメッセージが出るのかわからないけど,最初っからそんなへんなメッセージ出てたんでしょうか。あるいは,ある日突然出るようになったんでしょうか。一度, rm(list=ls()) で変数の定義なんか全部消去して ,.Rdata を刷新してみれば?それでも治まらないなら,Rの再インストール,OS の再インストール(ヲイヲイ)でもしてみるかなあ。 -- 2008-04-09 (水) 20:46:57
  • たぶんR2.6.2からconnection系の何かが変わってマルチバイトロケールのときにwarning出すようになったと思うので、再インストールしても意味ないと思いますよ。 -- takahashi? 2008-04-09 (水) 22:25:54
  • 無視して下さい. 警告メッセージが出るだけです. 動作がおかしくなることは無いはずです. データが無い?のは他の原因では? -- なかま 2008-04-10 (木) 09:48:32

画像ファイルへの連続出力

iris? (2008-04-09 (水) 10:21:04)

連続する列に対して、自動的に「ヒストグラムを書いて、それを画像ファイルとして保存」という作業をするべく下のようなプログラムを書きました。
ファイル自体はできているのですが、中身は白紙になってしまいます。
アドバイスいただけると嬉しいです。

x <- iris
n <- ncol(x)	#繰り返し回数(列数)の取得
for (i in 1:n){
	file.name <- sprintf("Fig%03i.png", i)	#出力ファイルの通し番号設定
	png(file.name, width = 400, height = 400)	#pngデバイスドライバの用意
	histogram(x[,i])	#i:列, x:データフレーム
	dev.off()
}
  • library(lattice)しなかっただけでは?
    library(lattice)
    options(device="png")
    png<-function(filename = "Fig%03d.png", width = 400, height = 400,...){
         grDevices::png(filename,width,height,...)
    }
    lapply(iris,function(x)if(is.numeric(x))histogram(x))
    dev.off()
    ちゃんと, 出てると思います -- なかま 2008-04-09 (水) 11:26:57
  • なかまさんプログラム例まで書いていただき本当にありがとうございます! latticeを起動してもやはり同じ結果(白紙)になってしまいます。 ちなみに、なかまさんのプログラムを実行させていただいたところ、「以下にエラーdev.off() : デバイス 1 をシャットダウンすることが出来ません(NULL デバイスです)」と表示されてしまいこれも画像ファイルが作成されませんでした。お手数をおかけしますがアドバイスよろしくお願いします。 -- iris? 2008-04-09 (水) 11:48:05
  • iris 氏の,掲示されたプログラム(for で回す)の出力は長さ0のファイルになる(理由不明)。
    以下のようにするとよい(オンラインヘルプの png を良く読めば,sprintf 等不要なこともわかる)
    (なかま さんのは,書き方が玄人好みで難しい)
    (histogram は対象変数が factor でも“棒グラフ”?を描いてくれる。余計なお世話だ) -- 2008-04-09 (水) 11:49:05
    png(filename="png%i.png", width = 400, height = 400)
    lapply(iris, histogram)
    dev.off()
  • 「NULL デバイスです」のメッセージはデバイスが開いていないと出たと思います。推察するに、png()が起動していないのでは?他のデバイス(モニターとかpdf()とか)でも同じエラーが出ますか? -- akira? 2008-04-09 (水) 12:07:42
  • png()として, 何かエラーは出てませんか?pngデバイスはWindows以外のプラットフォームではX11を必要とします(コードがアレゲなのはたぶんにRのせいかも...) -- なかま 2008-04-09 (水) 12:54:30
  • どうも,for ループの中で ping()…dev.off() をやると問題があるみたい。同じ構文で,histogram の代わりに hist だと問題ない。 -- 2008-04-09 (水) 13:02:52
  • latticeグラフィックスオブジェクトはprint/plotして始めて描画されるので、関数の中とか、sourceの中とかでは明示的に描画してあげないとだめです。 for(i in 1:2){png();print(hist(i));dev.off()} -- takahashi? 2008-04-09 (水) 13:28:48
  • ああ, そういえば, forはprint.evalしないですね.(for使わないので...) sourceの場合はオプションもあるけど, print(histogram(x)) or plot(histogram(x)) を使うのが正解ですね. -- なかま 2008-04-09 (水) 15:11:56
  • 皆様のおかげで問題も解決して自分のプログラムが動きました!考えていただいたほかのプログラムもすごく勉強になりました。ありがとうございました! -- iris? 2008-04-10 (木) 16:20:43

変数の削除

ma? (2008-04-09 (水) 06:02:51)

データセットから分散が0のものを自動的に削除する方法を探してます。
updateなどを使う方法は理解してますが、一括で行う方法が見つかりません。

  • 「自動的」ってどの程度の自動性を望むのでしょうか。データフレームから分散0の列を除くだけなら,x[sd(x)>0] だけでよいのだが。 -- 2008-04-09 (水) 07:19:01
  • R-コマンダーで読み込んだデータセットに対してコマンドから列の除外をしようとしてます。x[sd(x)>0]ですと「エラー: オブジェクト "x" は存在しません」となってしまいます。 -- MA? 2008-04-09 (水) 19:31:06
  • xがmatrixならx[,apply(x,2,sd)>0]になります。
    オブジェクト"x"が存在しないのはMAさんがオブジェクト"x"を作っていないからですね。そこから既にわかっていないのでしたら、変数の削除をする前に覚えなきゃいけないことがあると思いますよ。 -- akira? 2008-04-09 (水) 21:05:37
  • コメントありがとうございます。 -- MA? 2008-04-10 (木) 05:42:40

データフレーム中のNAの置換

nami? (2008-04-08 (火) 23:51:38)

ある2つのデータフレームをmergeした時、欠損値はNAとなってしまいます。
このNAを0に置換したいのですがうまくいきません。例えば、

> datA <- data.frame(x = c("A","B","C"), y = c(1:3))
> datB <- data.frame(x = c("A","B","D"), z = c(4:6))
> (datC <- merge(datA, datB, all = TRUE, by = "x"))
 x  y  z
1 A  1  4
2 B  2  5
3 C  3 NA
4 D NA  6

この中のNAを0に置換したいのです。
datD <- replace(datC, which(is.na(datC)), 0)
などとしてみましたが

以下にエラー `[<-.data.frame`(`*tmp*`, list, value = 0) : 
 新しい列は既存の列に穴を開けるかも知れませんうまくいきませんでした。

となり、うまくいきませんでした。
どなたか、ご教示くだされば幸いです。
環境はR2.6.2、windowsXP SP2です。
宜しくお願いします。

  • こんなんでいいのかしら? -- 2008-04-09 (水) 00:31:21
    > datC[is.na(datC)] <- 0
    > datC
      x y z
    1 A 1 4
    2 B 2 5
    3 C 3 0
    4 D 0 6
  • ありがとうございます。目的のことができました。 -- nami? 2008-04-09 (水) 18:25:02
  • NAはNAで0ではありませんから副作用が無いかどうかよく吟味してください。 -- 2008-04-10 (木) 08:06:26

Graphvizの記法をRgraphviz用に翻訳

kado? (2008-04-08 (火) 23:17:57)

Graphviz用に書かれたプログラムをRgraphvizで簡単に実行する方法はないでしょうか?

semで得られた結果をグラフ化するとき、いちいちGraphvizを通してグラフを作成するのではなく、Rgraphvizを用いてR上で描画した方が手間が少ないのではないかと考えました。
なにかよい方法はないでしょうか?

データフレームにある重複rownameの操作について

DataFrame? (2008-04-08 (火) 16:23:58)

はじめまして、データフレームのrowname操作について質問します。

下のようなデータフレームがあるとします。

   a  b  c
1  h  0  2
2  l  1  3
3  h  1  2 

このデータを次のようにしたいと考えています。

   b  c
h  0  2
l  1  3
h  1  2 

どの様にすればよいでしょうか?解決方法をお願いいたします。

  • 奇遇ですね。昨日,Q&A (中級者コース)に掲示された「rownameの付け方」と同じですよ。 -- 2008-04-08 (火) 17:03:28
  • お教え頂いた「rownameの付け方」では、上記内容ですとrow.namesが重複しています。と出てしまいます。何卒解決方法の例を教えていただけないでしょうか。 -- DataFrame? 2008-04-08 (火) 17:21:20
  • このデータでは無理です。row.namesにはduplicateが許されていないので,1行目と3行目が同じ"h"である以上,row.namesにはできません。 -- 中澤? 2008-04-08 (火) 17:28:16
  • コメントありがとうございます。何らかの処理で取り除かなくてはならないのですね。ありがとうございます。 -- DataFrame? 2008-04-08 (火) 17:34:22
  • 無理やりつけれないこともないですが、意味がないですよね。
    matrixと転置を使うと重複が許されます。
    x <- data.frame(matrix(1:12,3))
    colnames(x) <- rep("A",4)
    x <- t(x)
    rownames(x)
    で、これをしていて気づいたのですが、
    x <- data.frame(matrix(1:12,3))
    colnames(x) <- rep("A",4)
    x <- t(x)
    rownames(x)
    as.data.frame(t(x)) # エラー
    rownames(as.data.frame(t(x))) # 重複したrownameを返す。
    なんだか奇妙ですね。 -- akira? 2008-04-08 (火) 18:11:08
  • コメントありがとうございます。例えば、h, l, h1,と自動で名前を変えて付けることはできますか? もしできないのであれば、アクセスで取り除くこととします。 -- DataFrame? 2008-04-08 (火) 19:47:38
  • ともかくユニークにしたければ例えば。 -- 2008-04-08 (火) 20:29:44
    > DF2 <- transform(DF, a=paste(a, seq(nrow(DF)), sep=""))
    >  DF2
       a b c
    1 h1 0 2
    2 l2 0 3
    3 h3 1 2
  • 目的としていることが、簡単にできるようになりました。ありがとうございます。 -- DataFrame? 2008-04-08 (火) 20:40:16
  • ↑x4 エラーはas.data.frameの中じゃなくてprint.data.frameの中なので、表示しなければエラーにはなりません。 -- takahashi? 2008-04-08 (火) 20:57:54
  • 二重投稿してしまいました。どのようにしたら消せるのでしょうか? -- DataFrame? 2008-04-08 (火) 21:04:34
  • ページトップの編集ボタンを押して、該当部分を消します。ついでに rowneme, DataFream? の綴りも直しておきましょう。 -- 2008-04-08 (火) 21:23:23
  • 誤字の指摘ありがとうございます。無事修正ができました。 -- DataFrame? 2008-04-08 (火) 21:48:34
  • 参考まで。変形後 rownames が h で始まるものだけを取り出したなるかもしれない。その時は -- 2008-04-08 (火) 22:20:31
    > DF3
       b c
    h1 0 2
    l2 0 3
    h3 1 2
    > DF3[grep("\\h", rownames(DF3)),] # grep 関数で行名が h で始まるものだけを取り出す
       b c
    h1 0 2
    h3 1 2
  • 「hで始まる」というのなら,DF3[grep("^h", rownames(DF3)),] では? -- 2008-04-08 (火) 22:39:43
  • 失礼。そうでした。\\ は \\[ 等として [ で始まる文字列を指定する特殊正規表現でした(^[ は不可)。但し \\h は h を含む文字列にマッチしてしまう(?)ようで、たまたまこの場合はまぐれであたりです。\\a という表現が実際は何を意味するのか ?regex でも分かりませんが、詳しい人教えてください。 -- 2008-04-09 (水) 00:23:33
  • 細かいことを言いますが
    > \\ は \\[ 等として [ で始まる文字列
    単に [ を含む文字列です
    >(^[ は不可)
    [ で始まる文字列は,^\\[ でしょう -- 2008-04-09 (水) 07:36:19
  • hで始まるだけだと、h1,h2,...とha1,ha2,...が区別できず困るかもしれません。
    DF3[grep("^h[[:digit:]]$", rownames(DF3)),]
    でしょうか?この辺は正規表現を勉強すれば解決します。 -- akira? 2008-04-10 (木) 08:01:33

histogramのバグでしょうか?

iris? (2008-04-08 (火) 15:14:25)

   a b c

  1 x  x  x   
  2 x  x  x
  3 x  x  x

このようなデータx(具体的にはirisのデータ)のタイトルを数字に変えました。

names(x) <- c(1:ncol(x))
   1 2 3

  1 x  x  x   
  2 x  x  x
  3 x  x  x


こうしたうえで、ヒストグラムを作成します。
histogram(~ 1(←変換したタイトルの番号), data = x)

すると、タイトル変換前とはまったく別の変なヒストグラムが表示されてしまいます。

変換後の数字にシングル・ダブルクオーテーションをつけても無理でした。
histogram(~ '1'(←変換したタイトルの番号), data = x)

逆に、変換を数字でなくアルファベットにしてみると、問題なく変換前と同じヒストグラムが表示されました。
histogram(~ "a"(←変換したタイトルのアルファベット), data = x)

ただ、連続する列に対して、自動的にヒストグラムを書きたいのでタイトルを数字で扱いたいのでこれでは解決策になりません。

原因と解決法などわかる方がいらっしゃいましたらよろしくおねがいします。

  • > 連続する列に対して、自動的にヒストグラムを書きたいのでタイトルを数字で扱いたいので
    for (i in 1:4) histogram(iris[,i])
    等でよいのでは?
    「~ a」などは,formula というもので,formula の「~ 1」は,「1という名前の列のデータ」を表すものではありません。 -- 2008-04-08 (火) 15:39:24
  • ありがとうございます。ただ、まだ解決されません。 具体的には、以下のようなプログラムを組みました。
    x <- iris
    n <- ncol(x)                                       #繰り返し回数(列数)の取得
    for (i in 1:n){
    	file.name <- sprintf("Fig%03i.jpeg", i)   #出力ファイルの通し番号設定
    	png(file.name, width = 400, height = 400)  #pngデバイスドライバの用意
    	histogram(~ x[,i], data = x )}            #i:列, x:データフレーム
    	dev.off()
    }
    • iris? 2008-04-08 (火) 18:19:50
  • apply(iris,2,hist)もだめですか?
    上のコードをみますと、
    histogram(~ x[,i], data = x )}
    がおかしいですね。変なところに「}」があるし、「~x[,i]」もformulaを満たしていないように思います。単純に
    histogram(x[,i])
    としてはいかかですか?-- akira? 2008-04-08 (火) 18:23:42
  • akiraさんレス感謝です!ただ、やはりうまくいきません。

 実行するとこんな感じになります…

> x <- iris
> n <- ncol(x)                                       #繰り返し回数(列数)の取得
> for (i in 1:n){
+ file.name <- sprintf("Fig%03i.jpeg", i)   #出力ファイルの通し番号設定
エラー:以下の場所で構文エラーがありました.
"for (i in 1:n){
file.name <- sprintf("Fig%03i.jpeg", i)
> png(file.name, width = 400, height = 400)  #pngデバイスドライバの用意 
以下にエラーpaste("png:", filename, sep = "") : 
       オブジェクト "file.name" は存在しません
> histogram(x[,i])                          #i:列, x:データフレーム
エラー:"histogram(x[,i]) 
> dev.off()
以下にエラーdev.off() : デバイス 1 をシャットダウンすることが出来ません(NULL デバイスです)
> }
エラー:"}" に構文エラーがありました
  • iris? 2008-04-08 (火) 18:43:50
  • あのですね。見えないでしょうが,全角のスペースが入ってますよ。file.name <- sprintf("Fig%03i.jpeg", i)の直後と,histogram(x[,i])のあとの1個の半角空白の後。絶対にまちがいないのにエラーが出たらまず,全角空白のせいだと思ってよいでしょう。
    それと,png 関数に渡すファイル名が *.jpeg というのはだめでしょう。png 関数には *.png です。オンラインヘルプを見ましょう。そもそも,jpeg というのは写真などの画像用のファイル形式ですしね。 -- 2008-04-08 (火) 21:02:04
  • 全角スペースですか!稚拙な間違いにコメントいただきありがとうございます!試してみます。 -- iris? 2008-04-08 (火) 22:40:55
  • エラー解消しました!ただ、ファイルの出力が・・・。トピずれするのでまた別で質問させてもらいますが、よろしくおねがいします。 -- iris? 2008-04-09 (水) 10:15:15

パッケージがインストールできません

pank? (2008-04-08 (火) 11:09:51)

初歩的な質問ですみません。パッケージインストール時に以下のようなエラーメッセージが出ます。たとえば“ctv”をインストールしようとすると

install.packages("ctv")

install.packages("ctv") 中で警告がありました: 
 'lib = "C:/PROGRA~1/R/R-26~1.2/library"' は書き込み可能ではありません  
以下にエラー install.packages("ctv") : 
  パッケージをインストール出来ませんでした 


OSはVISTAです。いずれのパッケージに対しても同様のエラーが出ます。どなたか解決策をよろしくお願いします。

(追記) sessionInfo() R version 2.6.2 (2008-02-08) 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

  • VistaのProgram Filesは厳しいセキュリティがかかってるので、管理者モードでRを起動しないといけなくなかったかな? Rguiのアイコンを右クリック、管理者として実行で。 -- 2008-04-08 (火) 11:56:07
  • ありがとうございました。うまくインストールできました。これですっきりしました。 -- pank? 2008-04-08 (火) 12:54:54

列数(あるいは行数)不明のデータの列数(行数)をカウント

はじめ? (2008-04-07 (月) 17:46:51)

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

題名そのままなのですが、
列数(あるいは行数)不明のデータの、列数、行数をカウントするのはどうすればよいのでしょうか?

  • dim(x) -- 2008-04-07 (月) 18:10:56
  • nrow(x);ncol(x) -- 2008-04-07 (月) 19:04:56
  • ダウングレードしてるようなので,length(x[1,]); length(x[,1]) 。ただ,これは,データフレーム,二次元配列のみが対象です。 -- 2008-04-07 (月) 21:51:34
  • まずは基本的な関数を覚えれば解決すると思いますので、R-Tipsなどから始めると、すっきりする思いますよ。 -- akira? 2008-04-08 (火) 09:45:09
  • 解決しました!勉強したての拙い内容ですがお答えいただいて本当にありがとうございました! -- はじめ? 2008-04-08 (火) 13:42:47

データフレーム中で、最も近い値との差を求める

なつめ? (2008-04-07 (月) 07:47:04)

初心者です、よろしくお願いします。
2列(xとy)× 100行のデータフレームがあります。
私がやりたいと思っていますのは、xの1行目から100行目のそれぞれの値に対して、
最も大きさが近い値をyの1から100行目から探し、その差を、それぞれのxの値に対して、つまり計100個求めるというものです。
どのようにしたら良いでしょうか?

  • エレガントな解ではないけど -- 2008-04-07 (月) 10:16:21
    d <- data.frame(x=rnorm(100), y=rnorm(100))
    z <- outer(d$x, d$y, "-")
    apply(z, 1, function(u) {
    	min1 <- min(c(u[u>=0], Inf))
    	min2 <- max(c(u[u<0], -Inf))
    	return(ifelse(min1 >= -min2, min2, min1))
    })
  • sapply(d$x,function(x)min(abs(d$y-x))) ベタな解だ・・・。 -- takahashi? 2008-04-07 (月) 10:29:23
  • 差に符号が必要なら sapply(d$x,function(x){z<-d$y-x;z[which.min(abs(z))]}) -- takahashi? 2008-04-07 (月) 10:31:32
  • 迅速なアドバイスありがとうございました。また質問させてもらいます。 -- なつめ? 2008-04-08 (火) 08:14:08

月別発生率の分析について

ポアソン? (2008-04-04 (金) 13:00:09)

下のデータは数年間に発生した二つの事象の月別発生数を示したものです。

table(DAT_g$month)

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

table(DAT_d$month)

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


これらから、月ごとの発生に差があるかどうかを示したいのですがどうしたらよろしいでしょうか。

  • DAT_g と DAT_d で分布が違うということを言いたいのでしょう?R の話ではなく,統計学の話としてどういう手法を採るべきかはわかっているのでしょうか?統計学はわかるけどRがわからないということでないと,以下の回答では不十分になるでしょうけど。 -- 2008-04-04 (金) 15:40:55
    > x
     [1] 1 1 0 1 1 1 2 1 0 1 1 0
    > y
     [1] 2 1 3 4 2 0 0 3 2 2 0 4
    > ( d <- rbind(x, y) )
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
    x    1    1    0    1    1    1    2    1    0     1     1     0
    y    2    1    3    4    2    0    0    3    2     2     0     4
    > fisher.test(d)
    
    	Fisher's Exact Test for Count Data
    
    data:  d 
    p-value = 0.2637
    alternative hypothesis: two.sided
  • コメントありがとうございます。おっしゃるとおり統計の部分でつまずいています。DAT_gとDAT_dはまったく別の独立した事象で比較が目的ではありません。紛らわしい表現ですみません。それぞれをポアソン分布に当てはまるかどうかを判定すること。また、年間を通して月別の発生頻度に増減があるか、管理図のようにいくつ以上(または以下)は逸脱という判断ができるのではないかと考えているのですがいかがでしょう。 -- ポアソン? 2008-04-04 (金) 18:52:59
  • ポアソン分布に従うか,月ごとに一様か,どれくらいだと逸脱と判定するかですか,統計学の該当部分をもう一度学習されるのが先決でしょう。先が長そうなので,この件はパス。懇切丁寧な解答を辞さないという人に譲ります。すみませんね。 -- 2008-04-05 (土) 00:35:42
  • 統計に関する質問はクロスポストになってしまいますが、統計プロパーな疑問は統計学なんでもあり掲示板が、より専門的な回答が得られて良いと思いますよ。
    私もそうですが、Rjpwikiは統計プロパーでない人も多いので。回答にならずすみません。 -- akira? 2008-04-05 (土) 07:33:13
  • もう少しご指導をお願いします。 それぞれの発生数を元にベクトルを作成しました。
    > poi_g <- c(3,8,1,0,0,0,0,0,0,0,0)
    > poi_d <- c(3,1,3,2,4,0,0,0,0,0,0)
    > sum(poi_g)/12 #lambda 発生数の月平均
    [1] 1
    > sum(poi_d)/12  #lambda
    [1] 1.083333
    それぞれをplotすると、poi_gはポアソン分布に近いような気がします。 ここで、Rを用いて当てはまりを評価するにはどうしたらよいでしょうか。
    • ポアソン? 2008-04-05 (土) 11:54:22
  • 平均パラメータの推定は最尤推定で(この場合 0.8), その上でポアソン分布に当てはまっているかどうかは、推定度数と標本度数を(χ2乗)適合度検定統計量で。但しこの程度の標本数では意味のある検定は無理でしょう。まず統計の本を読むことが先決です。 -- 2008-04-05 (土) 15:00:02
  • http://aoki2.si.gunma-u.ac.jp/lecture/GoodnessOfFitness/poissondist.html
  • http://aoki2.si.gunma-u.ac.jp/lecture/GoodnessOfFitness/nominalscale.html
    http://aoki2.si.gunma-u.ac.jp/R/poissondist.html でもご覧になればよいかも。
    sum(poi_g)/12 は,間違えていますよ。sum(0*3+1*8+2*1)/12 だ。大元のデータをつかうなら,mean(DAT_g$month) だし。初歩的ミス。意味ないけど,poi_d <- c(3,1,3,2,4,0,0,0,0,0,0)もpoi_d <- c(3,1,4,2,2,0,0,0,0,0,0)のミス。後ろの方の0のつながりは何だろう。 -- 2008-04-05 (土) 22:15:12
  • ありがとうございます。何冊かR関係の統計本を読んだところでは生兵法ですね。勉強させていただきます。 -- ポアソン? 2008-04-06 (日) 10:19:05

stepAICについて

ぽい? (2008-04-03 (木) 01:59:51)

ARIMAモデルの変数選択をstepAICを使用して行いたいのですが、そもそもstepAICはARIMAモデルでも使用できるのでしょうか?
また、変数の入力方法は

scope=~x1*x2*x3

という方法でいいのでしょうか。

  • やってみて,エラーが出たら(エラーメッセージも参考にして)考え直す,で,よいのではないかな。 --  ? 2008-04-03 (木) 11:23:53
  • 以下のように実行してみました。
    > library(MASS)
    > g<-arima(y,order=c(1,1,1),seasonal=list(order=c(3,1,2),period=7))
    > stepAIC(g,direction="both",scope=~x1*x2*x3)
     以下にエラー terms.default(object) : no terms component
    このようにエラーが出ました。このエラーはどのようなエラーでしょうか。-- ぽい? 2008-04-03 (木) 22:24:21
  • 「stepAICの引数objectはtermを持たないといけない」ということでは?
    gはclassが違うのでしょう。arimaの返り値はtermを持っていないようです。ぽいさんが使うオブジェクト「y」がわからないのでこれ以上はわかりません。 -- akira? 2008-04-03 (木) 22:55:46
  • akira さんではないですが,追試できる状態で質問して欲しいと思います。
    それはさておき,stepAIC のヘルプには,その引数 object がどのようなものであるべきか詳しく書かれていなくて困るのだが,そのソースを眺めると,terms(object) という部分がある。エラーが起きているのはここだね。で,terms 関数のヘルプを見ると,その関数は terms オブジェクトを取り出すものだと言うことがわかる。では,arima 関数は terms オブジェクトを返すかと見てみると,そんなものは返さないことがわかった。
    結論,「あなたのやり方では stepAIC によるモデル選択はできない。」 -- 2008-04-04 (金) 11:12:56
  • 質問にお答えいただきありがとうございます。 yは売上データです。試しとして以下のデータでも同様に行ってみたのですが、エラーが出ました。
    > y<-c(0,2,4,3)
    > x1<-c(1,0,0,0)
    > x2<-c(0,1,1,0)
    > x3<-c(0,1,1,1)
    > g<-arima(y,order=c(1,1,1))
    > stepAIC(g,direction="both",scope=~x1*x2*x3)
    ご指摘の通り、stepAICを使用してARIMAモデルの変数選択はできないのですね… -- ぽい? 2008-04-05 (土) 22:39:04

CSVのインポートエラー

basel_firb? (2008-03-30 (日) 09:29:36)

Window R 2.5.1を使用しています。
デスクトップ上にあるCSVファイル「test.csv」を「read.csv」構文を実行すると
以下のようなエラーが出ます。

A<-read.csv("test.csv")

以下にエラーfile(file, "r") :  コネクションを開くことができません
追加情報: Warning message:
ファイル 'test.csv' を開くことができません, 理由は'No such file or directory'です in: file(file, "r") 


directoryを指定しなければだめなのでしょうか?
また、directoryの指定方法をご教授願います。

  • (1)パスが通っていないこと、(2)2バイト文字のディレクトリ(ここではデスクトップ)にCSVを置いていることが原因です。CSVをC:直下に移動させ、"C:/test.csv"としてください。WinのRではパスの表示は/もしくは¥¥です。 -- okinawa 2008-03-30 (日) 10:54:15
  • ありがとうございます。R初心者なもので・・・。さっそく試してみます。 -- basel_firb? 2008-03-30 (日) 11:25:34
  • R内でWindowsのパス標記は「¥」でなく「/」になりますから注意してください(ややこしい)。
    あと、ファイルの読み込みはフルパスをdir(path="c:/", pattern="test.csv", recursive=TRUE, full.names=TRUE)でとってくることもできますよ -- akira? 2008-03-31 (月) 19:21:35
  • なれるまでは read.csv(file.choose()) としたらいかが -- 2008-03-31 (月) 20:09:42

画像の拡大

きのねっこ? (2008-03-27 (木) 11:01:16)

初めて投稿させていただきます。よろしくお願いします。
現在群平均法をつかってクラスター分析を行ない樹形図に可視化しております。(ちょうど下に投稿している ”行列の読み込み”の内容が似ております。)
その際樹形図が1000個のデータからできているので、画像に変換したとき画像がつぶれてしまって詳細がみれなくなってしまいます。ビットマップやメタデータでダウンロードして拡大しようとしてもつぶれたままで拡大してしまい見れません。
なんとかこれを解消したいので、是非教えていただけると非常に助かります。

  • 初級Q&Aアーカイブ(8)に似たような質問がありますよ。 -- 2008-03-27 (木) 13:19:14
  • 前に何人か同じことを質問していたようで、申し訳ないです。助かりました。ありがとうございました。 -- きのねっこ? 2008-03-27 (木) 13:26:32

try関数を使用してもエラーが出ます

ぽんぺい? (2008-03-24 (月) 15:57:06)

ARIMA(p,d,q)モデルの次数をfor文でまわして、全通りの結果を得たいのですが、次数の組み合わせによっては、non-stationary seasonal AR part from CSSというエラーが出ます。

このfor文をtry()のなかに入れて行ってもエラーで止まってしまいます。
どのようにtryを使用すれば、エラーが出ても最後までまわすことができるのでしょうか。

  • tryの中にfor文を入れなければよいのでは?
    layout(matrix(1:4,ncol=2))
    try(
     for(i in 1:4){
       if(i==3) i<-"a"
       plot(i)
     }
    )
    これだとエラー
    layout(matrix(1:4,ncol=2))
    for(i in 1:4){
     if(i==3) i<-"a"
     try(plot(i))
    }
    これだと大丈夫-- akira? 2008-03-24 (月) 17:39:51

IF文でエラーがでます

こやま? (2008-03-19 (水) 13:50:36)

条件分岐式で計算をしようとするとエラーが出ます。非常に初歩的な質問ですみませんが、解決のヒントをいただけないでしょうか。データは文字列"t"を含むデータで、以下の様になっています。

x        y
t	t
55	219
t	t
234	-293
-122	371
t	t
-22	-312
t	t
349	182
343	-324

このデータについて、t以外の数値について条件に合致した時だけ合計する式を以下のように書きました。

n <- nrow(data)
a1 <- 0
a2 <- 0
a3 <- 0
a4 <- 0
a5 <- 0
b1 <- 0
b2 <- 0
b3 <- 0
b4 <- 0
b5 <- 0
for (i in 1:n){
   x <- data[i,1]
   y <- data[i,2]
   if ((x != "t") & (y != "t")) {
       if ((x >= 0.0) & (y >= 0.0)){
	        a1 <- a1 + x
	        b1 <- b1 + y
       }else if ((x >= 0.0) & (y < 0.0)){
	        a2 <- a2 + x
	        b2 <- b2 + y
       }else if ((x < 0.0) & (y <= 0.0)){
	        a3 <- a3 + x
	        b3 <- b3 + y
       }else if ((x < 0.0) & (y > 0.0)){
	        a4 <- a4 + x
	        b4 <- b4 + y
       }else{
	        a5 <- a5 + x
	        b5 <- b5 + y
       }
   }else{
   }
}

これを走らせると、以下のようにエラーがでます。欠損値にならないようにt以外のデータを計算するようにしたつもりですが、うまくいかないようです。長くなってすみませんが、どうぞよろしくお願いします。

以下にエラーif ((x >= 0) & (y >= 0)) { : TRUE/FALSE が必要なところが欠損値です
追加情報: 警告メッセージ:
1: >= 因子に対しては無意味です in: Ops.factor(x, 0) 
2: >= 因子に対しては無意味です in: Ops.factor(y, 0) 


  • & と && の違いを調べましょう(ついでに,| と || も)
    数値もfactorになっています -- 2008-03-19 (水) 13:55:46
    data2 <- as.matrix(split(data, data[,1]=="t" & data[,2]=="t")[[1]])
    x <- as.numeric(data2[,1])
    y <- as.numeric(data2[,2])
    f1 <- x >= 0 & y >= 0
    a1 <- sum(x[f1])
    b1 <- sum(y[f1])
    f2 <- x >= 0 & y < 0
    a2 <- sum(x[f2])
    b2 <- sum(y[f2])
    f3 <- x < 0 & y <= 0
    a3 <- sum(x[f3])
    b3 <- sum(y[f3])
    f4 <- x < 0 & y > 0
    a4 <- sum(x[f4])
    b4 <- sum(y[f4])
    # a5, b5 は起こらない
    a1;a2;a3;a4
    b1;b2;b3;b4
    とか
    data2 <- as.matrix(split(data, data[,1]=="t" & data[,2]=="t")[[1]])
    x <- as.numeric(data2[,1])
    y <- as.numeric(data2[,2])
    f <- (sign(y)+1)*3+sign(x)+1
    (a1 <- sum(x[f %in% c(4,5,7,8)]))
    (b1 <- sum(y[f %in% c(4,5,7,8)]))
    (a2 <- sum(x[f %in% 1:2]))
    (b2 <- sum(y[f %in% 1:2]))
    (a3 <- sum(x[f %in% c(0,3)]))
    (b3 <- sum(y[f %in% c(0,3)]))
    (a4 <- sum(x[f == 6]))
    (b4 <- sum(y[f == 6]))
    とか
    data2 <- as.matrix(split(data, data[,1]=="t" & data[,2]=="t")[[1]])
    x <- as.numeric(data2[,1])
    y <- as.numeric(data2[,2])
    f <- (sign(y)+1)*3+sign(x)+1
    f[f %in% c(4,5,7,8)] <- "case1"
    f[f %in% 1:2] <- "case2"
    f[f %in% c(0,3)] <- "case3"
    f[f == 6] <- "case4"
    by(x, f, sum)
    by(y, f, sum)
    とか,最後の2行を以下にするとか
    sapply(list(x=x, y=y), by, f, sum)
  • さっそくのお返事ありがとうございます!使用しているR本にも、Rはifやforよりベクトル演算する方がいいと書かれていましたが、どうするのか未だによくわかっていませんでした。これを消化して勉強します! -- こやま? 2008-03-19 (水) 16:44:41

関数がみつからない

あだむす? (2008-03-18 (火) 18:58:52)

はじめて投稿します。よろしくお願いします。
多重比較のパッケージmultcompの中にある関数simtestを使いたくてmulticompをインストールしました。具体的に関数simtestの使い方を見たくて
help(simtest)とすると、パッケージはインストールされているはずなのにドキュメントがないというエラーが出てしまい困っております。

library(multcomp)

help(simtest)
No documentation for 'simtest' in specified packages and libraries:
you could try 'help.search("simtest")'

help.searchでも同様にエラーがでました。libraryの中にはmultcomとmvtnormのパッケージのフォルダがあったのでインストールはされていると思うのですが・・・。

ちなみにRのバージョンは2.6.2でOSはWindows XPです。

  • multcomp 中に simtest という関数はありません。library(help=multcomp) で確認してください。 -- 2008-03-18 (火) 19:20:44
  • simtest()は古いユーザインタフェースなのでglht()とsummary.glht()を使えという警告がずっとヘルプに出ていたので,バージョンアップして無くなったのかもしれません。R-2.6.1のときのmultcomp 0.992-8ではsimtest()はありましたが,R-2.7.0preにインストールしたmultcomp 0.993-2では,確かにsimtest()はヘルプにはありませんね。 -- 中澤? 2008-03-18 (火) 19:23:32
  • 今はglht()という関数を使うのですね。こちらを勉強します。回答どうもありがとうございました。 -- あだむす? 2008-03-18 (火) 20:19:32
  • multcompのバージョンじゃないですか?この記事が関係ありそうな気が…RSiteSearch?("simtest")なんかどう? -- akira? 2008-03-19 (水) 09:59:56
  • akiraさん、関連記事どうもありがとうございます。またRSiteSearch?をしてみたらmratiosなるパッケージをみつけました。ぱっと見ですが、これも多重比較のための関数のようです。 -- あだむす? 2008-03-19 (水) 17:16:54

semのモデル指定について教えてください

おくむら? (2008-03-11 (火) 18:05:48)

こんにちは。semパッケージを使って,
http://www.geocities.jp/t_okumurin/sem.JPG
にあるようなモデルを分析したいと思うのですが,これをフィットさせるためのモデルの指定をどうしたらいいか教えてください。
一応,

modelsem <- specify.model()
t1 -> x1, b11, 1
t1 -> x2, b12, 1
t2 -> y1, b21, 1
t2 -> y2, b22, 1
t1 <-> t2, cort, NA
e1 -> x1, be1, 1
e2 -> x2, be2, 1
e3 -> y1, be3, 1
e4 -> y2, be4, 1
x1 <-> x1, d1, NA
x2 <-> x2, d2, NA
y1 <-> y1, d3, NA
y2 <-> y2, d4, NA

こんな感じかと思ったのですが,うまくいかないので。
よろしくお願いします(ちなみに,SASではうまくいきます)。

  • 識別問題に抵触しているかと思いますが,念のため,相関行列を提示していただけませんでしょうか.できましたら,CALISのプログラムを付随していただけると幸いです. -- 奥村泰之? 2008-03-11 (火) 21:38:35
  • CALISのプログラムはこんな感じです。
    proc calis data=data1 edf=99 all nomod;
    lineqs
    x1 = 1 f1 + e1,
    x2 = 1 f1 + e2,
    y1 = 1 f2 + e3,
    y2 = 1 f2 + e4;
    std
    e1-e2 = del1,
    e3-e4 = del2,
    f1 = 1,
    f2 = 1;
    cov
    f1 f2 = phi12;
    run;
    相関行列は人工データで発生させたものですが,^
              x1        x2        y1        y2
    x1 1.0000000 0.9201039 0.8892795 0.8281659
    x2 0.9201039 1.0000000 0.7766174 0.7349069
    y1 0.8892795 0.7766174 1.0000000 0.9515039
    y2 0.8281659 0.7349069 0.9515039 1.0000000
    こんな感じのものが1000個あります。
  • 以下のプログラムで大丈夫だと思いましたが,無理でした。CALISでも試しましたが,なにやらエラーは出ています。申し訳ございません。原因も解決策もわかりませんでした。 -- 奥村泰之?
modelsem <- specify.model()
t1 -> x1, NA, 1
t1 -> x2, NA, 1
t2 -> y1, NA, 1
t2 -> y2, NA, 1
t1 <-> t2, phi12, NA
x1 <-> x1, del1, NA
x2 <-> x2, del1, NA
y1 <-> y1, del2, NA
y2 <-> y2, del2, NA
t1 <-> t1, NA, 1
t2 <-> t2, NA, 1

変数名のないExcelファイルの読み込み

朝からずっと悩んでます? (2008-03-10 (月) 16:44:46)


変数名がなく,1行目からデータが入力されている Excel ファイルを読み込みたいのですが,
RODBC パッケージの odbcConnectExcel? と sqlQuery を使って読み込むと,
どうしても1行目が変数名扱いになってしまうので,1行目の数値が読み込めません。
read.table の header=F のような読み込み方をするには
どうしたらいいでしょうか?

R のバージョンは 2.6.0, OS は Windows XP,
MS-Office 2003 を使用しています。

  • RODBCのマニュアルのodbcConnectExcel? Excel Connectionsに「英語で」書いてありますよ・・・。基本的にSQLなのでフィールド名が無いとだめなのではないでしょうか。(P.S Excel2007にもいつのまにか対応してたんですね!) -- okinawa 2008-03-10 (月) 18:00:01
  • さっそくのご回答,ありがとうございます。ヘルプは一応読んで ダメなのかなとは思ったのですが,FirstRowHasNames?=0 を何とか有効にできないか試行錯誤して挫折しました。SQL, ODBC, Excel などのキーワードで調べてみたのですが,欲しい情報を探すことができず,ここで相談することにしました。諦めてxlsReadWrite?パッケージを使うことにします。 -- 朝からずっと悩んでます? 2008-03-10 (月) 18:31:15
  • read.xlsはダメですか? -- akira? 2008-03-10 (月) 22:48:02
  • akira さんがおっしゃっているのは perl と併用する方の read.xls でしょうか?日本語未対応とのことなので,そちらはまだ試していません。当面はxlsReadWrite?パッケージの read.xls でいこうと思っているのですが,無料版では読み込む行数などが指定できないようなので,RODBCで何とかできるといいなぁと思ったのです。 -- 朝からずっと悩んでます? 2008-03-11 (火) 09:46:36
  • 時間コストを考えるなら、あれこれ悩むより、read.table()に慣れているなら、csvとして保存して read.csv() または read.table() でさくっと解決。時間に対する価値観の問題なので、意見の分かれるところと思いますが。 -- 2008-03-11 (火) 14:42:29
  • 複数のシートがあるファイルが多数あるので,Excelマクロでタブ区切りのテキストファイルを生成してから read.table() で読むか,ファイルを編集して1行目に変数名フィールドを入れるなども考えましたが,余計なファイルを作る もしくは ファイルをいじらなくてはいけないので,直接 Excelファイルを読み込む方法を検討したかったのです。私にとっては今後もずっと つきまとう問題なので,一度は悩んでもいいかなぁと。何はあともあれ,みなさん,いろいろ解決案を考えてくださり,ありがとうございました。 -- 朝からずっと悩んでました? 2008-03-11 (火) 15:18:59
  • この際、難しいですがRExcelを使うのはどうでしょうか? -- okinawa 2008-03-20 (木) 08:19:46

X11フォントの設定

きむら? (2008-03-05 (水) 19:12:50)

なかま さんの "R for OSXでIPAフォントの利用" を行っていたのですが、X11フォントの設定の "~/.Rprofile" ファイルが見つかりません。 OSはOS X 10.4ですが、ターミナルで "cd ~" "ls -a" としてみましたが表示されません。 不可視ファイルだと思いますが、どこにあるのでしょう?

  • 無かったら作るものです. `.Rprofile'というファイルは存在すれば, Rが起動時に読んで処理してくれます. ヘルプに大変詳しい説明がありますから, `?.Rprofile' としてみて下さい. -- なかま 2008-03-05 (水) 22:21:12
  • ありがとうございます。ついついネットで日本語の情報ばかり探してしまいますが、ヘルプにあったのですね。と言っても問題は理解出来るかですが・・・ 何れにしても少し時間が掛かると思いますので、先ずはお礼まで。 -- きむら? 2008-03-06 (木) 22:52:18
  • 出来ました。というか、実際にやりたかった事は、Rコマンダーの表示フォント変更でした。「フォントパスが塗通る -- きむら? 2008-03-09 (日) 00:01:04
  • 出来ました。というか、実際にやりたかった事は、Rコマンダーの表示フォント変更でした。「フォントパスが通ってフォントの一覧が出てるか」はどうもうまくいっていないようでしたが、Rコマンダーを起動させてみると、見事にフォントが置換されていました。ありがとうございました! -- きむら? 2008-03-09 (日) 00:02:55

ccf()データの出力方法

こやま? (2008-03-04 (火) 16:36:00)

Rで、二つの時系列データの相互相関を調べたいと思い、ccf関数を用いて計算を行いました。
計算結果はグラフになって出たのですが、相関係数の値を出力しようとすると、以下のようにエラーになって出力できません。

 result1 <- ccf(dt[ ,1], dt2[ ,1], lag.max = 120, type = "correlation", plot = TRUE)

 write.table(result1, file = "C:/R/result1.txt")

以下にエラーas.data.frame.default(x[[i]], optional = TRUE) : 
       クラス "acf" はデータフレームに強制変換できません


(result1)と括弧をつけるとR画面上には出力されますが・・・。また、write()とした場合は、以下のようにエラーが出ます。

write(result1, file = "C:/R/result1.txt")

以下にエラーcat(list(...), file, sep, fill, labels, append) :

       引数 1 は,まだ cat で取り扱えません


どのようにすればテキストデータに出力できるでしょうか?
初歩的な質問で申し訳ありません。よろしくお願いいたします。

  • 単にテキストに落としたければ sink("C:/R/result1.txt"); result1; sink() ではどうですか。 sink 関数はコンソールへの標準出力をファイルに落とします。 -- 2008-03-04 (火) 16:45:56
  • sink("hoge.txt);result1;sink() フォーマットから替えたいなら, stats:::print.acf が参考になるでしょう -- 2008-03-04 (火) 16:57:00
  • write.table(as.data.frame(result1)[,c(4,1)], file = "C:/R/result1.txt") -- 2008-03-04 (火) 17:35:03
  • ありがとうございます。> write.table(as.data.frame(result1)[,c(4,1)], file = "C:/R/result1.txt") で試してみましたが、また「下にエラーas.data.frame.default(result1) : クラス "acf" はデータフレームに強制変換できません」と出てしまいました。 -- こやま? 2008-03-04 (火) 17:51:00
  • sink()の方は、扱いにくい形ではありますがテキストに落とすことが出来ました。 -- こやま? 2008-03-04 (火) 17:51:16
  • すまぬ。一行抜けていた。as.data.frame する前に,ccf が返すオブジェクトのクラスをリストにしておかにゃならぬ。
    as.data.frame(result1) のどの列をどの順序で出力するかは自分で決めてね。 -- 2008-03-04 (火) 18:59:43
    x <- rnorm(1000)
    y <- rnorm(1000)
    result1 <- ccf(x, y, lag.max = 120, type = "correlation", plot = TRUE)
    class(result1) <- "list"
    write.table(as.data.frame(result1)[,c(4,1)], "test.dat")
  • ありがとうございます!希望する形でテキストに保存することが出来ました。 -- こやま? 2008-03-05 (水) 09:11:48

行列の読み込み

R初心者? (2008-03-03 (月) 13:00:34)

Rを用いてクラスター解析を行おうと考えています。
このとき、はじめから入っているユークリッド距離とかではなく、
自分で定義した類似度を用いたいと考えています。
そこで、perlを用いて類似度の行列を作成しました。
(行列の形は三角行列です。)
しかし、読み込もうとすると、要素が有りませんとエラーが出てしまいます。
類似度のデータをどのような形で取り込めば良いのでしょうか?
教えてください。お願いします。

  • 三角行列をどのように,どの関数に与えたのですか。たとえば,hclust 関数なら,与える引数(非類似度)は dist クラスでなければなりません。行列を dist クラスに変換するには dist 関数を使ったりしますよ。?hclust, ? dist をお試し下さい。 -- 2008-03-03 (月) 13:34:38
  • 今までは、データをa2<-dist(a,method="euclid")の様に類似度に変換してc<-hclust(a2,method="complete")でクラスタリングを行っていました。しかし、既存の類似関数ではなく新しい類似度の定義を試したいと考えています。だから、dist()を用いず他の方法で類似度データを作成しました。このデータ(distクラス??)を取り込んでhclust()関数を使いたいと考えています。どのようにして、取り込んだ行列をhclust(0)に入れれば良いでしょうか? -- 質問者? 2008-03-03 (月) 13:44:12
  • その行列はどのようになっているのですか。ファイルに入っているのですか。ファイルから読み込めるんですか。読み込んだものは dist クラスになっているんですか?情報・背景をちゃんと書かないとわかりません。 -- 2008-03-03 (月) 14:01:03
    0.0000000 0.0000000 0.0000000 0.00000000 0.0000000
    0.9118028 0.0000000 0.0000000 0.00000000 0.0000000
    0.3342491 0.9712567 0.0000000 0.00000000 0.0000000
    0.5905108 0.6187089 0.3155890 0.00000000 0.0000000
    0.6783135 0.3242619 0.9274259 0.01916572 0.0000000
    のようなデータがデータファイル test.dat にあるとして,以下のようにすればデンドログラムが描かれるはずですが???
    > x <- matrix(scan("test.dat"), 5, byrow=TRUE)
    Read 25 items
    > y <- as.dist(x)
    > ans <- hclust(y)
    > plot(ans)
  • 最低 エラーメッセージを添えないと答えようがありません。 それと特に複雑な変形でなければ、R上で行列から直接類似度データを計算するほうが面倒がないはずです。 -- 2008-03-03 (月) 14:09:44
  • > 読み込もうとすると、「要素が有りません」とエラーが出てしまいます。 とは書いてあるが。
    実際の所,要素がないのでしょうね。
    なぜ,要素がないとRが判定したのかは,情報不足でわからないですね。 -- 2008-03-03 (月) 14:14:26
  • 三角行列ファイルをそのままread.tableで読み込んで、as.distせずにdata.frameのままでhclustしたのでは?昔、こんなことをした記憶があります。
    test.datはこんなcsv
    1
    .5,1
    .2,.3,1
    .1,.6,.4,1
    
    > dat <- read.csv("test.dat", header=FALSE, row.names=FALSE)
    > dat
       V1  V2  V3 V4
    1 1.0  NA  NA NA
    2 0.5 1.0  NA NA
    3 0.2 0.3 1.0 NA
    4 0.1 0.6 0.4  1
    > hclust(dat)
     以下にエラー if (n < 2) stop("must have n >= 2 objects to cluster") : 
       引数の長さが0です 
    > is(dat)
    [1] "data.frame" "oldClass"  
    > hclust(as.dist(dat))
    Call:
    hclust(d = as.dist(dat))
    Cluster method   : complete 
    Number of objects: 4 
    > cl <- hclust(as.dist(dat))
    > is(cl)
    [1] "hclust"
    > plot(cl)
    とか。 -- akira? 2008-03-03 (月) 19:26:48
  • そもそも,「要素が有りません」というエラーメッセージはどんなときにでるのかな?ググっても出てこない。 -- 2008-03-03 (月) 22:24:27
  • 返信が送れてすみません。『三角行列ファイルをそのままread.tableで読み込んで、as.distせずにdata.frameのままでhclustしたのでは?』>その通りでした。as.distで解決しました。「「要素が有りません」というエラーメッセージはどんなときにでるのかな?』>三角行列をread.tableで読み込もうとしたら「要素がありません」のエラーが出ました。read.tableでは全ての行列に要素が埋まってるデータでないと読み込めないのですね。 -- 質問者? 2008-03-06 (木) 16:55:18
  • そんなことはないと思います。上の例では空欄は自動的にNAを補完します。na.stringsの引数はデフォルトでNAのはずですが。 -- akira? 2008-03-09 (日) 20:17:44

棒グラフのerror barについて

初心者です。。。? (2008-02-29 (金) 14:47:17)

棒グラフとerror barで
mean±se
をあらわす方法を教えて下さい。
barplotで棒グラフはかけるのですが、どうやってerror barを
つけたらよいのでしょうか?
宜しくお願いします。

出力結果の"[1]の意味"は、何ですか?[2]の時もありますか?

ろろ? (2008-02-27 (水) 01:36:41)

[1]を出力しない方法を教えて下さい。
よろしくお願いします。

  • ?cat -- takahashi? 2008-02-27 (水) 01:49:18

データの個数を得る方法

すろん? (2008-02-26 (火) 13:18:54)

はじめまして。お世話になります。
length()を使うと,

> data_a <- c(1.5, 1.2, 1.3, 1.6, 1.2, NA, 1.2, 1.5, 1.7, NA)
> length(data_a)
> [1] 10


のようにベクトルdata_aの長さを得ることができます。この場合,NA値もカウントされます。length()では,na.rm=TRUEのような使い方ができません。NA値を除いた数値の数のみを得たい場合には,どのようにすれば良いのでしょうか?

これまでに私が試したのは,(1)あらかじめNA値を削除したベクトルを作成してからlength()を実行する。(2)xtab()やtable()などで集計表を改めて作る。というようなものです。また,RjpWiki上で「データ数を得る」や「データ長」ののような語句で検索をしました。また,

> library(help="base")
> library(help="stats")


などを実行して探したり,「The R Tips」,「Rプログラミングマニュアル」等の解説本で,基本統計量に関する項目などを当たりましたが,よくわかりませんでした。横着をしなければ問題は感じられないことと思いますが,もしlength()やmean(), sum()などのように単純に求められる方法をご存じでしたら,是非教えていただきたいと思います。どうぞよろしくお願いいたします。

ところで,「簡単な投稿法」を参考にしたかったのですが見あたりません。見られなくなっているのでしょうか?

  • 例えば -- 2008-02-26 (火) 13:24:53
    > ( x <- sample(c(1:3,NA), 10, rep=TRUE) )
     [1]  1  2  1  1 NA NA  2  3  2  2
    > !is.na(x)
     [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
    > sum(!is.na(x))
    [1] 8
    こんなのもあり(素直でないが)。
    > x > -Inf
     [1] TRUE TRUE TRUE TRUE   NA   NA TRUE TRUE TRUE TRUE
    > sum(x > -Inf, na.rm=TRUE)
    [1] 8
    まだまだあり。
    > complete.cases(x)
     [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
    > sum(complete.cases(x))
    [1] 8
    おそらく、以下が正統派(?)。
    > na.omit(x)
    [1] 1 2 1 1 2 3 2 2
    attr(,"na.action")
    [1] 5 6
    attr(,"class")
    [1] "omit"
    > length(na.omit(x))
    [1] 8
  • 早速のお答えありがとうございます。一番上のお答えのように,!is.na(x)のような使い方など全く思いつきませんでしたし,complete.cases()などは具体的にどう使うのかわからなかったので大変参考になりました。更に勉強いたします。 -- すろん? 2008-02-26 (火) 13:49:02
  • 参考まで(心配性)。 -- 2008-02-26 (火) 13:59:46
    > is.na(c(Inf,-Inf,NaN, NA))          # NaN (Not a Number)はNA扱い
    [1] FALSE FALSE  TRUE  TRUE
    > complete.cases(c(Inf,-Inf,NaN,NA)) # Inf, -Inf は正当な数扱い
    [1]  TRUE  TRUE FALSE FALSE
    > c(Inf,-Inf,NaN,NA) > -Inf      # -Inf > -Inf は FALSE
    [1]  TRUE FALSE    NA    NA
    > na.omit(c(Inf,-Inf,NaN,NA)) 
    [1]  Inf -Inf
    attr(,"na.action")
    [1] 3 4
    attr(,"class")
    [1] "omit"
  • 理論演算に関する対応(という表現で正しいのでしょうか?)まで教えてたいただきありがとうございます。私はRもさることながらプログラミングも初心者なので,理論演算はある意味鬼門です。感謝でござます! -- すろん? 2008-02-26 (火) 14:25:49

osx leopardでRを使用している時に、escキーを押すと落ちてしまう

satou? (2008-02-22 (金) 23:38:08)

題名の通りですが、osx leopardでRを使用している時に、escキーを押すと落ちてしまいます。
正確に言うと、マウスカーソルが待機中(虹色でぐるぐるしてるやつです。)になり、操作を受け付けなくなってしまいます。同様の現象が出ている方、あるいはその現象を解決した方がいましたら、情報頂けると助かります。

   OS:Mac OS X 10.5.2
   sessioninfo()の出力
   R version 2.6.2 (2008-02-08)
   i386-apple-darwin8.10.1

   locale:
   ja_JP.UTF-8/ja_JP.UTF-8/ja_JP.UTF-8/C/ja_JP.UTF-8/ja_JP.UTF-8

   attached base packages:
   [1] stats graphics grDevices utils datasets methods base
  • 私の環境(Mac OS X 10.5.2、R 2.6.1)では再現されませんでした。 -- 2008-02-23 (土) 08:47:38
  • 落ちました!(MacOSX10.5.2,R2.6.2,MacBookCore2Duo2Gblack) -- okinawa 2008-02-23 (土) 09:11:19
  • Rのversionを2.6.1から2.6.2にアップグレードしたら落ちました。2.6.2固有の現象なのでしょうか? -- 2008-02-23 (土) 10:16:19
  • みなさん、コメントありがとうございます。みなさんのコメントを見る限り、R2.6.2だと落ちてしまうようですね。 -- satou? 2008-02-25 (月) 20:43:13
  • CRANのミラー内にある, R-GUI-4944-2.6-Deployment.dmg は入れたんですか? -- 2008-02-25 (月) 21:36:30
  • R-SIG-Macでも話題になってますね。解決策は「CRANあるいはhttp://r.research.att.com/から最新のGUI版をインストしなさい」とのことでした。 -- ジェットラグ? 2008-02-26 (火) 00:05:48
  • 情報ありがとうございます。http://r.research.att.com/から最新のGUI版をインストールしたところ、症状がでなくなりました。ただ、MISC->ワークスペースの変更をすると落ちてしまいますね... -- satou? 2008-02-28 (木) 15:59:44

tableやxtabsを用いてカウントではなく数値合計を集計するには?

はいどらりすく? (2008-02-22 (金) 17:14:51)

お世話になります。
仕事でtableやxtabを使って簡単な集計をしているのですが、これらの関数ではカウントができても数値の合計ができません。
具体的には、部署別売り上げデータから年度別の部署ごとの売り上げ集計表を作りたいのです。当然、カウントではなく個々のデータが持っている売上額を合計して作表しなくてはいけませんが、このやり方がわからないのです。例を示しますと

売り上げNo 部署    売上月 金額
     1 第2営業部   01  200
     2 第2営業部   02  100
     3 第1営業部   02   50
     4 第3営業部   03  300
     5 第1営業部   04  200
     6 第2営業部   04  500
     7 第3営業部   05  200
     8 第1営業部   06  100
     9 第1営業部   06   50
    10 第2営業部   06  200

      ↓↓↓↓↓

      売上げ月
部署     01   02   03   04   05   06
第1営業部     0   50    0  200    0  150
第2営業部   300    0    0  500    0  200
第3営業部     0    0  300    0  200    0


のような集計を行いたいのです。
tableやxtabsのソースを見て改造しようとも考えましたが、今の自分には全くチンプンカンプンでした。
どうぞよろしくお願い申し上げます。

  • xtabs(金額 ~ 部署 + 売上月,df) -- 2008-02-22 (金) 18:26:41
  • 「第2営業部 300 0 0 500 0 200」 は正しくは 「第2営業部 200 100 0 500 0 200」 ですね。 -- 2008-02-22 (金) 19:57:09
  • 今までformula引数の意味がよくわからず、適当に指定していましたが、やっと意味が少し分かったような気がします。もっと勉強します。ありがとうございました。 -- はいどらりすく? 2008-02-25 (月) 18:51:57

pdf と postscript を一発で

もちだひろつぐ? (2008-02-21 (木) 01:23:34)

pdf ファイルと postscript ファイルを作成したいのですが、今のところ

pdf('file.pdf', width=11, height=8.5)
plot(0,0, xlab='nothing', ylab='nothing', main='NOTHING')
dev.off()


postscript('file.eps', width=11, height=8.5)
plot(0,0, xlab='nothing', ylab='nothing', main='NOTHING')
dev.off()


と pdf() と postscript() を別々に走らせています。
これを一度で済ます方法はありますか?

上記の例だと、 plot() のところがシンプルですが、これに axis() やら legend() やら何やら加わってくると、二度走らせるのがめんどうちいです。
よろしくお願いします。

  • 自分で関数を作ってみてはいかがでしょうか? -- ジェットラグ? 2008-02-21 (木) 06:29:37
  • X デバイスに描画しておいて、これでよしとなったら dev.copy2eps(file="hoge.eps"); dev.copy2pdf(file="hoge.pdf") としたら。もしくは Imagemagick のようなソフトで後から画像ファイル形式を変更しても可。 -- 2008-02-21 (木) 06:55:30
  • わたしもpngとpdfを2種類はきだしてますが、関数化してますね。 -- okinawa 2008-02-21 (木) 08:59:42
  • この手の便利関数は自作の方が自由度が高くて良いと思います。
    ps2pdf <- function(x, y, ...){
     postscript(x, width=11, height=8.5)
     plot(y, ...) # 複雑な場合は適当に
     dev.off()
     system(paste("ps2pdf", x, sub("ps","pdf",x)))
    }
    とか。私も描画関係の便利関数は自作して、起動時に読み込んでます。 -- akira? 2008-02-21 (木) 09:44:07
  • 大変参考になりました。どうもありがとうございました。 -- もちだひろつぐ? 2008-02-21 (木) 23:11:10

コネクションが開けない

あんころ? (2008-02-20 (水) 22:12:01)

txtファイルを読み込もうとすると、

file(file,"r"):コネクションを開くことができません

というエラーが出て読み込めません。
このエラーの意味は何でしょうか?
また、読み込むデータ量に限度などはあるのでしょうか?

  • 素直に取ればファイルが無いといっているわけですが。一寸腑に落ちないのは、文字通り file(file,"r") としたのですか(file("file","r") でなくて)。テキストファイルを文字列ベクトルとして読み込むには普通 readLines() 関数を使いますね。制限は当然あります。可能なメモリ量は越えられませんから。 -- 2008-02-20 (水) 23:25:22
  • file(file,"r")はエラーメッセージですか?
    txtファイルの形式にもよりますが、
    con <- file(descroption="file", open="r")
    x <- readLines(con)
    close(con)
    なんてことをしたのでしょうか?
    もし、file(file,"r")をそのまま入力したのであれば、fileはオブジェクトですよね?fileには正しいファイルのパスが入っていましたか?
    txtの形式によっては、read.table関係でも良いと思いますよ-- akira? 2008-02-21 (木) 00:41:08
  • [file(file,"r"):コネクションを開くことができません] の後にも何かエラーメッセージが出てるでしょ? -- 2008-02-21 (木) 01:04:30
  • これがエラー文です。 以下にエラー file(file, "r") : コネクションを開くことができません   追加情報: Warning message: In file(file, "r") :ファイル 'Im.txt' を開くことができません, 理由は 'Permission denied' です -- あんころ? 2008-02-21 (木) 12:19:18
  • > 追加情報: Warning message: In file(file, "r") :ファイル 'Im.txt' を開くことができません, 理由は 'Permission denied' です
    そこまで読んでいれば,質問する必要はないでしょう。原因はまさにそれですよ。 -- 2008-02-21 (木) 12:39:55

直和を使ってブロック対角行列を作りたい

シチノスケ? (2008-02-14 (木) 11:08:59)

こんにちは。
今,list形式でxj?(jは1からJまで)のデータが入っているとします。これを対角要素にもつブロック対角行列Xを新たに作りたいのですが,直和を実行するためのプログラムをご存じないでしょうか?

  • Matrix パッケージの関数 bdiag() がつかえます。但しこれはスパース行列形式ですから、通常のマトリックス形式にするには as.matrix() 関数で変換します. -- 2008-02-14 (木) 11:55:38
    > L <- list(matrix(seq(4),2,2),matrix(seq(9),3,3),matrix(seq(25),5,5))
    > library(Matrix)
    > bdiag(L)
    10 x 10 sparse Matrix of class "dgCMatrix"
                                 
     [1,] 1 3 . . . .  .  .  .  .
     [2,] 2 4 . . . .  .  .  .  .
     [3,] . . 1 4 7 .  .  .  .  .
     [4,] . . 2 5 8 .  .  .  .  .
     [5,] . . 3 6 9 .  .  .  .  .
     [6,] . . . . . 1  6 11 16 21
     [7,] . . . . . 2  7 12 17 22
     [8,] . . . . . 3  8 13 18 23
     [9,] . . . . . 4  9 14 19 24
    [10,] . . . . . 5 10 15 20 25
    > as.matrix(bdiag(L))
          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
     [1,]    1    3    0    0    0    0    0    0    0     0
     [2,]    2    4    0    0    0    0    0    0    0     0
     [3,]    0    0    1    4    7    0    0    0    0     0
     [4,]    0    0    2    5    8    0    0    0    0     0
     [5,]    0    0    3    6    9    0    0    0    0     0
     [6,]    0    0    0    0    0    1    6   11   16    21
     [7,]    0    0    0    0    0    2    7   12   17    22
     [8,]    0    0    0    0    0    3    8   13   18    23
     [9,]    0    0    0    0    0    4    9   14   19    24
    [10,]    0    0    0    0    0    5   10   15   20    25
  • ありがとうございました!! -- シチノスケ? 2008-02-14 (木) 14:08:56
  • 簡単に作ってみる -- 2008-02-14 (木) 14:44:31
    bdiag2 <- function(L)
    {
        a <- sapply(L, function(x) {x <- as.matrix(x); return(c(nrow(x), ncol(x)))})
        l <- apply(a, 1, cumsum)
        n <- nrow(l)
        m <- array(0, dim=rowSums(a))
        mapply(function(x, i, j) m[i, j] <<- x,
               L, mapply(seq, c(0, l[-n,1])+1, l[,1]),
                  mapply(seq, c(0, l[-n,2])+1, l[,2]))
        return(m)
    }

自分の作成した名前にデータを関連付けたい

みゅ? (2008-02-13 (水) 06:19:19)

プログラムを書きながら前々から疑問に思っていたのですが、出来る範囲で調べてもいつもわからず、そもそもできるの事なのかできない事なのか、キーワードも調べ方もわからなくて行き詰っています。解決の方法か、鍵になる単語か、教えていただけないでしょうか。(やりたいことは明らかなのですが、うまく説明が出来なくて伝わりにくいかもしれません。例を書くので、まどろっこしいかもしれないのですが許してください。)

> DATA <- matrix(1:30,5,6)

という値が入っているDATAがあったとする。
自分が生成した名前にこのデータを持たせたいと思っている。
名前の生成はたとえば、sprintf(paste("data","A",sep="_"))
とすれば生成可能ですね。でもこれは普通、

> my_name <- sprintf(paste("data","A",sep="_"))

のように使い、

> my_name
> "data_A"

となると思います。
このとき、先のDATAの値をdata_Aに持たせるのは
どのようにすればいいか、ということです。
もちろん、

> my_name <- DATA

とすると

> my_name
> (ここに5×6の先の行列が表示される)

なので、先に入れた"data_A"はきえてしまいます。

> DATA <- matrix(1:30,5,6)
> my_name <- sprintf(paste("data","A",sep="_"))
> ?????何らかの操作???????
> data_A
> (ここに5×6の先DATAの行列が表示される)

というような感じに使いたいのですが・・・。
?????何らかの操作???????は何を調べたらわかりますか????
そもそもこういうことは出来るんでしょうか???

  • 題名をつけるのを忘れました。というか、題名のつけ方もわからないくらい混乱?言葉がわからないんです。「自分の作成した名前にデータを関連付けたい」とかでしょうか。なんかちがうかなぁ。 -- みゅー? 2008-02-13 (水) 06:22:43
  • 同一内容の二つのオブジェクト DATA, data_A を作ること無く、一つのオブジェクトを複数の名前で参照したい(ailias)ということでしょうか? -- 2008-02-13 (水) 07:13:59
  • つまりそういうことかもしれません -- みゅー? 2008-02-13 (水) 07:43:03
  • これで,いかがですか?assign(my_name, DATA); data_A -- aa? 2008-02-13 (水) 07:51:21
  • 感動。とってもうれしいです!!!!出来ました。ありがとうございました。assignというのをつかうのですね。ありがとうございました!!! -- みゅー? 2008-02-13 (水) 07:56:57
  • 解決できてよかったです。 -- aa? 2008-02-13 (水) 08:00:41
  • 要するにあらかじめ(恐らく機械的に)作った文字列をオブジェクト名にしたいということのようですね。 -- 2008-02-13 (水) 09:36:46
  • そうです。機械的にバンバンやるのにいつも困っていました。それで、こういうのって、ちゃんと説明するにはどうかくべきなんですかね。題名もおかしいですよね?私が言っているのは「文字列をオブジェクト名にする方法は?」という言い方になるのでしょうかね?読むには読めるのですが、自分では用語が使えません・・・。 -- みゅー? 2008-02-13 (水) 12:57:24
  • ついでといっては何ですが、皆さんがお書きになられているように、水色のボックスで囲まれたところにプログラムを書いて表示したかったのですが、編集から中身を見ても、どのように書けば水色のボックス内にかけるのかよくわかりませんでした。(なのでこんな長ったらしい質問本文になってしまいました。)水色のボックスのコマンドは何ですか? -- みゅー? 2008-02-13 (水) 13:01:51
  • 文の先頭に半角空白を入れるとできます。 -- okinawa 2008-02-13 (水) 13:25:37
  • ありがとうございます!さっそくやってみました。 -- みゅー? 2008-02-13 (水) 14:05:35
  • 因みに水色ボックス内の改行は"~"がいりません。勝手ながら修正いたしました。 -- akira? 2008-02-14 (木) 16:00:10
  • もともと書いてあったものの行頭に半角空白を入れただけだったので"~"が残ってしまっていたのですね。お手数をおかけしました。ありがとうございます。 -- みゅー? 2008-02-14 (木) 21:27:51

plotのx軸を任意の値にしたい

たいち? (2008-02-12 (火) 12:48:47)

こんにちは。
初歩的な質問で恐縮ですが,plot関数でグラフを作るとき,x軸の値を強制的に「4,8,12,16,20」などのように表示させるにはどうしたらよいのでしょうか?デフォルトのままだと「5,10,15,20」となってしまうのですが…。
どうぞよろしくお願いします。

  • 汚いコードで失礼。
    plot(1:20,1:20,axes=F)
    axis(side=1,at=c(4,8,12,16,20));axis(side=2,at=c(4,8,12,16,20)) 
    など。詳細は?par、?plot、?axisなどを参照のこと-- yuta? 2008-02-12 (火) 13:19:47
  • ありがとうございます。これだとまわりの枠が消えてしまいますね? -- たいち? 2008-02-12 (火) 15:11:50
  • plot(1:20,1:20,xaxt="n");axis(1,1:5*4) -- takahashi? 2008-02-12 (火) 15:38:09
  • あ、そういう引数がpar()にあったんですね。強引にbox()で書き込んだりしていました。私も長年の初級者、勉強になりました。 -- yuta? 2008-02-12 (火) 17:54:45

データが無い(エラーの)場合の戻り値の指定

たけ? (2008-02-10 (日) 11:04:03)

どろどろとしたデータの整形をしていまして、例えば

x1 <- matrix(1:6,ncol=3) ;x2 <- matrix(1:4,ncol=2)
colnames(x1) <- c("A","B","C"); colnames(x2) <- c("A","C")

のような、列数・順序が不ぞろいなデータがもともとあって、x1[,"B"]でTRUEを返すことは容易にできますが x2[,"B"]で添字エラーではなくて、Falseを返す方法はありますでしょうか。 
変わりの方法として使われる列名は決まっているので、grep("B",colnames(x2))と検索をかける方法も試してみましたが、logical(0)という戻り値をうまくTrue/Falseにするような扱いができずに悩んでいます。ご助言頂ければ幸いです

  • やりたいことが,いまひとつわかりかねますが,以下のコードでいかがでしょうか。 -- aa? 2008-02-10 (日) 13:00:00
    is.element(colnames(x1), "B")
    is.element(colnames(x2), "B")
  • ありがとうございます。行列の要素の有無を確認する(?)is.element()助かりました。汚いもので参考になるかわかりませんが、実際次のような感じで、ない場合にはTRUEの数=0として返すようにしました。 このあと条件分岐にもっていくのにこれで使えます。ありがとうございます。 -- たけ? 2008-02-10 (日) 22:36:23
    table(factor(is.element(colnames(x2), "B"),levels=c("TRUE","FALSE")))["TRUE"]
  • そんな,回りくどいことしなくても,sum(is.element(colnames(x2), "B")) でいいんじゃ? -- 2008-02-10 (日) 22:55:17
  • any(is.element(colnames(x2), "A")) でもいいかもしれないが -- 2008-02-10 (日) 22:57:25
  • あ”、思いつきで書きましたが、確かに見たいのは0かそれ以上かなのでsumとかanyでいいですね(汗 ありがとうございます。 -- たけ? 2008-02-11 (月) 01:36:48
  • もっと一般にある操作がエラーになるかどうかをチェックするには try 関数の返り値を見る次のような方法が使えます。但しエラーメッセージ出力そのものは抑制できない(?)ようです。 -- 2008-02-11 (月) 12:43:24
    > ifelse(class(try(y <- x2[,"B"])) == "try-error", FALSE, TRUE)
    Error in try(y <- x2[, "B"]) :  添え字が許される範囲外です 
    [1] FALSE
    > y
     エラー:  オブジェクト "y" は存在しません 
    > ifelse(class(try(y <- x1[,"B"])) == "try-error", FALSE, TRUE)
    [1] TRUE
    > y
    [1] 3 4
    PS. エラーメッセージも消せました。try 関数の silent 引数、始めて気づきました。
    > ifelse(class(try(y <- x2[,"B"], silent=TRUE)) == "try-error", FALSE, TRUE)
    [1] FALSE
  • ありがとうございます。try()をsilent=TRUEにすれば一般的にエラーの戻り値を設定することができそうですね。これでパッケージの想定外の邪道な解析にも使えそうです。ありがとうございます。 -- たけ? 2008-02-15 (金) 19:24:13

Cairoで日本語が文字ばけ

okinawa (2008-02-10 (日) 09:30:46)

IntelMac?,OSX10.5,R2.6.1
SVG出力させたいので、Cairoパッケージを導入しました。

library(Cairo)
CairoSVG("/test.svg")
x<-rnorm(1:10)
plot(x)
title(main="試行")
dev.off()


で、出力されたtest.svgをダブルクリックするとsafariがきどうしてSVGが表示されますが、"試行"部分が文字化けします。
いろいろ調べたのですが、解決できませんでした。
どなたか、ご存知の方いらっしゃいませんでしょうか?
よろしくお願いします。

  • 自己解決しました。Cairoでは結局うまくいかなかったので、RSvgDevice?パッケージを使ったところ見事に日本語が表示されました。また、Windows2000&R2.5.1でも文字コードをiconvでUTF-8に変換することで、うまく表示できました。 -- okinawa 2008-02-10 (日) 15:31:38
    Macの場合
    library(RSvgDevice)
    devSVG("/test.svg")
    x<-rnorm(1:10)
    plot(x)
    title(main="試行")
    dev.off()
    Windowsの場合
    library(RSvgDevice)
    devSVG("c:/test.svg")
    x<-rnorm(1:10)
    plot(x)
    title(main=iconv("試行","","utf-8"))
    dev.off()
  • Linuxの場合 (Ubuntu)
    library(Cairo)
    CairoSVG("cairo.svg")
    x<-rnorm(1:10)
    plot(x)
    title(main="試行")
    dev.off()
    
    library(RSvgDevice)
    devSVG("rsd.svg")
    x<-rnorm(1:10)
    plot(x)
    title(main="試行")
    dev.off()
    どちらも日本語表記可能です。
    ただし、InkscapeはCairoSVGでの文字を図と認識し、devSVGでの文字を文字と認識します。
    私はInkscapeで編集する機会が多いので、devSVGを使っています。
    でもCairoSVGは透過型なので便利なこともあります(devSVGにその設定があるのか調べてません)。 -- akira? 2008-02-15 (金) 21:15:28

RのWebService?を作りたい

akira? (2008-02-08 (金) 23:43:05)

WebServer?の勉強も兼ねてRが稼働するWebService?をlocalに建てようと思ってます。
Rweb-jpとかの設定はどうやっているのでしょうか?
apacheはここを参考にしています。お薦めがあれば教えてほしいです。

> sessionInfo()
R version 2.6.1 (2007-11-26)
i486-pc-linux-gnu
locale:
LC_CTYPE=ja_JP.UTF-8;LC_NUMERIC=C;LC_TIME=ja_JP.UTF-8;LC_COLLATE=ja_JP.UTF-8;
LC_MONETARY=ja_JP.UTF-8;LC_MESSAGES=ja_JP.UTF-8;LC_PAPER=ja_JP.UTF-8;LC_NAME=C;
LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=ja_JP.UTF-8;LC_IDENTIFICATION=C
attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
loaded via a namespace (and not attached):
[1] rcompgen_0.1-17
  • どうでもいいけど。あれ,死んでるでしょ? -- 2008-02-08 (金) 23:46:57
  • 個人的には、昔に参考にしたRpadがいいように思います。http://www.rpad.org/Rpad -- okinawa 2008-02-09 (土) 08:58:54
  • windowsですが、昔作ったRwwwのページがあります。参考になるかわかりませんが、WebServer?とRのやりとりをActiveBasic?で作ったCGIでやっています。 -- okinawa 2008-02-09 (土) 11:40:28
  • レスが遅れてすみません。Rの設定の前にServerに思いのほか苦戦しており、基礎から勉強する必要がありそうです。涙 -- akira? 2008-02-15 (金) 21:07:51

自分自身のIPアドレスの取得

okinawa (2008-02-08 (金) 16:33:40)

winXPsp2,R2.5.1
プログラム中で、自分自身(Rが動いているPC)のIPアドレスを取得する必要が出てまいりました。
いろいろ調べたのですが、探せませんでした。
どなたか自分自身(Rが動いているPC)のIPアドレスを取得する関数をご存知ないでしょうか?

  • IPアドレスを知るだけならsystem("ipconfig")でどうでしょうか?IPアドレスを取り出して、それをRの中で別に使うなら、ipadd <- system("ipconfig",intern=T)などとしてRオブジェクト化して、そこからアドレス部分だけを抜き出すとか。 -- ジェットラグ? 2008-02-08 (金) 17:31:05
  • ありがとうございました。おかげさまでできそうです。 -- okinawa 2008-02-08 (金) 18:00:57
  • R中からではありませんが IP Address Lookupにアクセスすると詳細な情報が得られます。iGoogle 用のガジェットを試していて見つけました。 -- 2008-02-08 (金) 23:32:36

回帰分析のsummaryの保存

nob? (2008-02-07 (木) 16:47:36)

Rで回帰分析のスクリプトを書いて実行しています。
スクリプト中

sink(file="summary.txt")
summary(kaiki)
sink()

としているのですが、summary.txtには何も保存されていません(空っぽのファイルはできる)。
コンソール上で1行ずつ入力すると保存できますが、スクリプトで 一気に保存できる方法はありますか? よろしくお願いします。

  • print(summary(kaiki)) -- 2008-02-07 (木) 17:30:00
  • うまくできました。ありがとうございました。 -- nob? 2008-02-07 (木) 19:40:48

Rcmdrでの変数の複数選択

okinawa (2008-02-07 (木) 14:42:40)

winXPsp2,R2.5.1,Rcmdr1.3.5

Rcmdrで重回帰分析やクラスター分析をする場合、変数を複数選択するところが出てきて、マウスでクリックすることで複数選択しますが、1つ置きに選択することができません。(連続したものしか選択できない)
一つ置きに選択する方法があるのでしょうか?

  • ctrl+click -- 2008-02-07 (木) 15:35:05
  • ありがとうございました。できました。 -- okinawa 2008-02-07 (木) 17:05:35
  • "cntl + click"はRcmdrの機能というより、Winの機能なんでしょうね。おそらくMacは違ったりするのでは? -- akira? 2008-02-08 (金) 10:54:57
  • Mac なら,option+click だ。(Linux なら alt+click なのか?)。要するに OS の機能。Shift+click などと同じ部類。R とは無関係。(というか,R も OS の機能を使っているだけ) -- 2008-02-08 (金) 11:11:06
  • Rはsystem(),dir(),file.remove(),dir.create()などシステムを操作できるコマンドが多いので便利ですね。R内から外をのぞいている気分です。 -- akira? 2008-02-08 (金) 22:45:36

パッケージがインストールできない?

sho? (2008-02-05 (火) 01:29:02)
自宅のPCにもRを導入しようとしたのですが、うまくいきません。
OSはビスタで、R2.6.1をインストールしたのちRcmdrのパッケージを読み込み、足りないパッケージをインストールしたのですが以下のようなのが出てきてしまいます。

local({pkg <- select.list(sort(.packages(all.available = TRUE)))
if(nchar(pkg)) library(pkg, character.only=TRUE)})
要求されたパッケージ tcltk をロード中です Tcl/Tkインターフェースのロード 終了済
Please select a CRAN mirror for use in this session ---
utils:::install.packages(missing.packages[present], dependencies = TRUE, 中で警告がありました:
'lib = "C:\Users\■■■\Local Settings\Application Data\R-core\R/R/win-library/2.6"' is not writable
Error in utils:::install.packages(missing.packages[present], dependencies = TRUE, :
unable to install packages
Error in structure(.External("dotTclObjv?", objv, PACKAGE = "tcltk"), class = "tclObj") :
[tcl] error reading bitmap file "C:\Users\■■■\Local Settings\Application Data\R-core\R\R\win-library\2.6\Rcmdr\etc\Rcmdr.xbm".
Error : .onAttach は 'attachNamespace' で失敗しました
エラー: 'Rcmdr' に対するパッケージもしくは名前空間のロードが失敗しました

一体どうしたらよろしいのでしょうか?
よろしくお願いいたします。

  • 手元にVISTAがないのでわかりませんが、Rとパッケージのインストールはすべてインターネットに接続して行っていますか?(ローカルからのインストールはしてないですよね?) -- okinawa 2008-02-05 (火) 14:03:30
  • 触った事ないけど, Vistaの仮想化機能とやらで, Program filesがUsersに引っ越されたのではないでしょうか? rw-FAQ -- なかま 2008-02-05 (火) 18:35:39
  • vistaの設定を変更してAdministratorで入れるようにして(ググってください)、インストールすればいいのかな?(セキュリティチェックも外した方がウザくないと思うが、自己責任で) -- okinawa 2008-02-05 (火) 20:34:14
  • 私もpermissionじゃないかと。"... is not writable"あたりが怪しいのではないですか? -- akira? 2008-02-05 (火) 20:58:43
  • コメントありがとうございます。どうもVistaが勝手にファイルの一部をUsersに移してしまっていたようです。 -- 2008-02-05 (火) 22:52:05
  • 今回vistaの仮想化機能とやらを始めて知った。vistaの評判がなぜ悪いか少し分かった気がする。sudo -suぐらいつけろよM$。 -- okinawa 2008-02-05 (火) 23:23:16
  • vista business(ID,PWはAdministrator権限で作成)が手に入ったのでR2.6.1をインストールしたみた。Usersに場所を作るよみたいなダイアログが出て、作成を許可した。その後サクサク進んで、Rcmdrは無事起動した。とりたてて変な動きはしてないが、単にAdministrator権限でインストールしなかったからなのではないでしょうか?作成しているIDの権限がAdministratorじゃないとうまくインストールできないアプリってたくさんありますよね。officeとか・・・。 -- okinawa 2008-02-07 (木) 16:43:12

R の速度(pvclust)

yamaoyaji? (2008-02-04 (月) 07:23:24)

ライブラリpvclustを用いてデータ解析をしています。
Mac OSX (10.5.1)+R(2.6.1)(Core2duo 2GHz) で解析する場合と
Fedora8(64bit) + R(2.6.1)(Core2duo 3GHz)で同じデータを解析すると約10%程度Fedoraの方が遅いです。Openmpi+Rmpi+snowでクラスタ解析をしても同じCPU数の場合、差は開く一方でした。
Fedoraの方が自由度が高く、Rを最適化できることは重々承知しておりますが、スキルがありません。ソースからのインストールもしてみましたが、あまり変化はありませんでした。
質問させていただきたいのは、なるべくdefaultの設定で早い速度のでるRを
保持できるLinuxのdistributionはどれがお勧めでしょうか。
よろしくお願いします。

  • 遅い原因ですが, OSXのRはatlasを使って32bitだったと思います. Fedora8(x86_64)はBLASとかは標準のままなのではないですか? 32vs64bitだと,10%から25%程度は64bitの方が遅くなりますし, BLASを最適化してあれば部分的に10〜20倍程度は早いかもしれないので, 比較している事自体がなんです. ディストリビューションでデフォルトで解決と言うのは「ありえません」. おちかくに色々詳しい方がいらっしゃれば, そのかたの詳しい物が最適でしょうし, 自力で解決するならば, 最も使い慣れた物が良いでしょう. 個人的にはDebianを進めます(atlasのプチ最適化版が自動で入る程度)が, 多くの人はDebianの親切さを嫌います. -- なかま 2008-02-04 (月) 11:34:26
  • ありがとうございます。Linuxの操作も怪しいのですが、Atlasをダウンロードして試してみましたが、変化はほぼありませんでした。32bitのLinuxを試してみようと思います。 -- yamaoyaji? 2008-02-04 (月) 14:28:53
  • 単に出来合いパッケージを使うのでしたら参考にならないかも知れませんが、最近経験したことを紹介します。単純に行うとす2ヵ月かかる計算を、アルゴリズムの工夫で2時間までに短縮しました。更にメモリが潤沢に使える環境(32GB!)で、あらかじめ計算できる中間変数を全て前もって計算しておいたら所要時間は20秒に。しめしめとばかり8CPUで並列処理したら、なんと計算時間はかえって増えてしまい、がっかりしました。通常のパソコンではなかなかままならないかもしれませんが、メモリが必要なだけ使える威力を実感させられました。 -- 間瀬茂 2008-02-04 (月) 15:02:31
  • (作成者の方がご覧になられているかもしれないのですが)pvclust自体のメモリ消費は多くなく、メモリの観点では64bitを必要とする状況ではありません。驚いたのはOSX(leopardからopenmpiが同梱)ではRmpiもバイナリがあり、容易にクラスタ構築ができることでした。2台までですがCPU数で計算時間が短縮できることが確認でき、dual coreを実感できました。大学のクラスタはLinuxですが、Rを使用している人はあまりおず、練習と思い自分のPCで試していた次第です。 -- 2008-02-04 (月) 15:37:44
  • たまたま見つけたパッケージ作成者です。snowクラスタが構築できるのであれば、並列版のparPvclust関数を使うのが良いと思います。とは言え並列環境を整えるのはなかなか…と思っていたのですが、上の方のコメントによればOSXで試してみる価値はありそうですね。すでに並列でも遅いということであれば、的外れですみません…。 -- 鈴木? 2008-02-05 (火) 00:32:58
  • コメントありがとうございます。parPvclustはcpu数にほぼ比例して、計算時間を削減します。core2duoを2台までですが、cpu=1, 315sec; cpu=2, 170sec; cpu=3,121sec; cpu=4,108secでした。ただrsprngが必須と思うのですがまだ行っておらず、これが難関になりそうです。大学のクラスタは費用がかかるので、とりあえず、amazon ec2で試そうかと思っています。現在までに、Fedora8 64bitと32bitではほぼ差がないこと、atlas sse2(バイナリで入手)で5%程度速くなるが、sse2とsse3ではほぼ変わりないこと、を確認しました。ほかのdistributionもいくつか試そうかと思いますが、クロックが1.5倍もあるのに、速度があまり変わりない事実が受け入れがたい状況です。Rのビルドに際し、「--with-blas='-L/アトラスの場所 -lf77blas -latlas'」よりほかに追加するべきパラメーターがあれば教えていただければ幸いです。 -- yamaoyaji? 2008-02-05 (火) 01:38:36
  • Macのハードが反側的に良いパーツで作られている事は御理解下さいね(ほかは安いでしょう). ハード的に性能差が出る物として,メモリーも上げられますし, デバッグ行を沢山出せば, グラフィックボードも侮れません. Linuxの方になれば, irqが適切に分散されているか(irqbalance)や, あ, そうそうSATAかSATA2かでも性能にはかなり貢献します. ですので, ボトルネックが何か調べない事にはなんとも言えません. 乱数はこのあいだ,Luke Tierney氏が rsprng より rlecuyer が良いと言っていました. atlasの効果は限定的なので比較している物がpvclustならあまり関係ないのかもしれません.(あまり参考にはならないでしょうが, CPU性能が顕著に見れるのはBLASでの性能になるかと) -- なかま 2008-02-05 (火) 18:47:27
  • コメントありがとうございます。OSXはMacmini Core2duo 2G (T7200だと思います)メモリは2G@667で、Linuxの方はデスクトップ機でCore2duo 3G (E8400) メモリは6G@800です。pvclust実行中はあまりコメントは出ないので関係ないと思いますが、グラフィックスはいずれも統合チップMacMini?は950で、LinuxはG33でした。結論という訳ではないのですが、Linuxはdebianも含めて、distributionによる変化はあまりなく、atlas@SSE3でビルドしたRの実行速度はほぼ同じでした。Openmpi+Rmpiで同一PC内でのクラスタもやはり、Linux機の方が遅く、OSXは65−70%(比1core)、Fedora75-80%という結果でした。残念ですがスキルがないのでこの辺であきらめる事にしようと思います。いろいろとアドバイスをいただきありがとうございました。 -- yamaoyaji? 2008-02-06 (水) 03:28:39
  • ではOSXのopenmpiは適度にチューニングされているのではないでしょうか?(Xgridとかもあるし) CPUが同程度であれば, そう考えるのが自然ですよね. -- なかま 2008-02-06 (水) 23:40:13
  • Fedora8だと、Openmpiがパッケージで入手できるようで、そちらは試していませんが、メーカーのチューニングは確実にありそうです。Rについても同一ハードとOSとコミュニティの強みが生かされていると思います。最終的に最近発売されたDual Quad CoreのMacPro?を買う事に決めました。とはいかないのが残念ではありますが、Core あたり単価はそれほど高くないですし、PowerPCMacのRの遅さを知っているだけに、Appleのすごさをかいまみた気がします。ありがとうございました。 -- yamaoyaji? 2008-02-07 (木) 02:07:01
  • amazon ec2でRedHat?が動くようになってたんですね。(茶々入れてすみません) -- okinawa 2008-02-07 (木) 10:20:19
  • Linuxのdistributionに詳しくないのですが、Redhat系ということであれば、ec2で公開されていたFedora core4にRをいれて使っていました。(もちろんpvclustです。)公称Xeon 1.7Gなのですが、実感はもっと遅く、Rの実行速度的にはP3-1.2G@Windowsと同程度か、やや遅い程度でした。FreeNXで接続していましたが、接続自体にストレスは感じませんでした。 -- yamaoyaji? 2008-02-08 (金) 00:17:26
  • まだ、解析サーバとして使えるほど高速ではないということですね。web サービス狙いなのでしょうね。 -- okinawa 2008-02-08 (金) 08:55:02
  • ちょっと, テストしてみました. openmpiはどうしてもloopbackを手元では使わないので(ボトルネックがsocket), lam-mpiに置き換えたところ,高速に動作しました. openmpiはいんふぃにばんどとかブルジョアシステム向けにちゅーにんぐしているのではないでしょうか. lamにすればOSXより早いかもしれませんし, そうじゃなくてもopenmpiより早いです(手元の環境だけかもしれませんが,なんと40%!改善しました) -- なかま 2008-02-08 (金) 19:24:36
  • SSE3でビルドしたRでの実行時間は、Core2duo 3G(E8400) 337sec, AthlonX2 3G(6000) 496secでした。Rmpi+Openmpiで同一PC内で2コア動作の場合、それぞれ、258sec(76%対1コア比)、369sec(74%)でした。Rmpi+lamの場合、237sec(70%対1コア比)、343sec(69%)となり、なかま様のご指摘のとおり、lamの方が早いようです。が、40%とまでは僕の環境ではいきませんでした。なお、上記MacMini?の場合、シングルコア同じものを、シングルコア315sec、2コア201sec (63%)でした。ここはよくわかっていないのですが、Rmpiをインストールするときに、" I'm here and Openmpi”という表示をみていたので、RmpiはOpenmpiでインストールされていると信じていました。いまみてみたら、いつのまにか、Fedoraのパッケージ管理で、lamが入っていて、特になにもせずに、snowライブラリを追加後、makeCluster(3,type="MPI")ができました。RmpiのconfigureからOpenmpiのオプションを削除して、lamだけで、Rmpiをビルドしても速度的には変わりませんでした。これでいいんでしょうか?なお、OpenmpiはFedoraのパッケージ管理からインストールすると変な場所にインストールされるので自力でインストールしました。-- yamaoaji? 2008-02-09 (土) 10:06:46
  • Macならotools(だったか?な,失念しました)でlinuxならldd $R_HOME/library/Rmpi/libs/Rmpi.soで,liblamがでてくれば間違い無くlamでしょう. わたしが計測したプログラムと違いますから, 直接の比較は無意味ですが, 一般論として同一ノード内のMPIならlamの方が早いかもと言う話です. openmpiは `mpirun -np 1 R CMD BATCH hoge.R' lamは `mpiexec -boot N R CMD BATCH hoge.R' で比較しました. openmpiは初心者なので, mcaにもっと良い指示があるのかもしれませんが, マシンが何度かフリーズしたのとで深くは追っていない事も付け加えます. なにかよさげなベンチマークプログラムが出来ればよいのですが, それすら並列化してちゃんと早くなるプログラムと言うのは稀で難儀しています. -- なかま 2008-02-09 (土) 14:06:51
  • Fedora8を再インストール、パッケージから、Lamで始まるものをインストール、そして、Rmpiをダウンロードしたままビルドして試した結果、激しく早くなりました。上記、Core2Duo 3Gで、シングルコア337sec, Rmpi+Openmpiで同一PC内で2コア動作258sec(76%対1コア比)、だったのが、Rmpi+Lamの場合、175secまでに短縮できました。やっと、MacMini?より速くなったので満足しました。なかま先生どうもありがとうございました。このCore2duoと、Athlon X2 6000 (同一PC内で2コア動作の場合、253sec)で、2台でクラスタを組んだ場合、遅いほうの約半分となる130secで計算が終了しました。このような異質のクラスタの場合、遅いほうに時間が合ってしまうのはやむを得ないものと思いますが、おおむね目的は達成いたしました。重ねて御礼申し上げます。-- yamaoyaji? 2008-02-09 (土) 15:40:12
  • データを標準化た数値で対応分析のbiplotグラフを作成しようとしても ”計算結果が NaN になりました”の表示が出ます。 -- 猿並? 2009-01-11 (日) 18:42:24

(密度)関数の線形和

kaneko? (2008-02-02 (土) 16:23:24)

t分布の密度関数の線形和を返す関数を作ろうとしています.
例えば,自由度がそれぞれ10, 15, 5のt分布密度関数dt(x, 10), dt(x, 15), dt(x, 5)に対して,それぞれの自由度で重み付けした関数(の和)を
function(x){10*dt(x, 10)+15*dt(x, 15)+5*dt(x, 5)}
というように作りたいと思っています.

上の例のように加える関数の数が少ないならばすべて書き出せばいいですが,数が多くなる(約20個を想定)と大変なので,自由度のベクトルと密度関数のベクトルの内積(?)のような形でスクリプトが書けないだろうかと悩んでいます.

上記の線形和は,ある検定関数を作るためのものです.なお,Rの使用環境は version 2.6.1をOSXで使っています.

以上,ご教示頂ければ幸いです.

  • 内積を表す %*% を使って、df %*% dt(x, df) でどうでしょう?ただしxはスカラーです。ベクトルの場合はapply系の関数と併用でいけると思います。 -- 鈴木? 2008-02-02 (土) 16:56:16
  • f<-function(x,df)(sapply(df,function(df)df*dt(x,df))) もっとスマートな方法あるかもしれませんが。 -- takahashi? 2008-02-02 (土) 21:22:31

バックスラッシュ奇数個の文字列を

hidee? (2008-02-01 (金) 14:54:01)

バックスラッシュが3個並んだ文字列を作りたいのですが, 単純にダブルクオーテーションのあいだに2つ並べると2つのバックスラッシュが, 奇数個並べると次の文字が奇数個目のバックスラッシュはその次の文字のエスケープに使われてしまい, 結果,生成される文字列はバックスラッシュ偶数個のものしかできません.
余分に生成しておいてsubstr()なんていうのも考えてみたんですが,これも偶数個以外ははねられてしまうようです.
よい方法が思い浮かばないのですが,ご教授いただけませんか.

> "\\\hline"
[1] "\\hline"
Warning messages:
1:  '\h' は文字列で認識されないエスケープです  
2:  "\\\hline" から認識されないエスケープを取り除きました  
> "\\\\hline"
[1] "\\\\hline"
> substr("\\\\hline", 1, 999)
[1] "\\\\hline"
> substr("\\\\hline", 2, 999)
[1] "\\hline"
> sessionInfo()
R version 2.6.1 (2007-11-26) 
i686-pc-linux-gnu 

locale:
LC_CTYPE=ja_JP.eucJP;LC_NUMERIC=C;LC_TIME=ja_JP.eucJP;LC_COLLATE=ja_JP.eucJP;
LC_MONETARY=ja_JP.eucJP;LC_MESSAGES=ja_JP.eucJP;LC_PAPER=ja_JP.eucJP;LC_NAME=C;
LC_ADDRESS=C;LC_TELEPHONE=C;LC_MEASUREMENT=ja_JP.eucJP;LC_IDENTIFICATION=C

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

loaded via a namespace (and not attached):
[1] tools_2.6.1
>
  • "\\\\\\"でOKです。cat("\\\\\\hline", file="hoge.tex")とか。 -- takahashi? 2008-02-01 (金) 15:25:03
  • "\\\\\\" は \\\ なんです. cat("\\\\\\",fill=T)とすると, \\\ と出ます. "\n\n" も cat("\n\n") で見て頂ければ, 「親切にエスケープ!」して出力しているのがおわかりになるのではないかと思います. (そういうものなのです). -- なかま 2008-02-01 (金) 15:30:09
  • takahashiさん,なかまさん.ありがとうございます.ごめんなさい.やりたかったのはコンソール,ファイルへの出力ではなく,l <- paste(a, "\\\\\\hline", sep="") のようなことなのです.これははねられる(というかバックスラッシュ6つのまま.奇数では...)ようなんですけれど,ここにもきっとうまい手があるのでしょうね. -- hidee? 2008-02-01 (金) 15:58:44
  • それでもlは\\\なんです。cat(l)で。 -- takahashi? 2008-02-01 (金) 16:06:45
  • takahashiさん.お付き合いありがとうございました.おかげさまで解決いたしました.catしてみないと実際の中身はわからない,ということでしょうか. -- hidee? 2008-02-01 (金) 16:33:39
  • エスケープのエスケープに混乱しているだけですから, 焦らないでくださいね. writeLines(paste(rep("\\",3),collapse="")) これは一つのバックスラッシュを3個にする例です. -- なかま 2008-02-01 (金) 16:40:17
  • なかまさん,ありがとうございます.このWikiでずっといわれていること.ちゃんとやりたいことを知らせないといけない,というのは分かっていたのですが.実は,Sweaveによる自動レポートを考えていて,そこに出来合いではない表を組みたい,そのために latex の表の行を個別に作成する,その行は,l[1] <- paste(a, "\\\hline") のようなことをして,Sweave の noweb ファイルの中で \Sexpr{l[1]}というように呼び出そう,というのが 実際の問題だったのです.問題の切り分けができていませんでした. 1. cat()でエスケープ後の中身が分かる, 2. \Sexpr{} の段階でさらにエスケープがかかる(ようだ), ということが理解できたところです(2はまだよくわかっていません). いまのところ,cat(file=file) をつかって一旦ファイルに落としてから,latex側でinput(file) で呼ぶことで問題は当面解決です. takahashiさんにも大変お世話になりました.-- hidee? 2008-02-01 (金) 16:56:48
  • 私も悩んだことがあり、質問したことがあります。xtableでなくprint.xtableとか、xtable2はどうですか?結構使えると思いました。 -- akira? 2008-02-01 (金) 18:53:54
  • Hmiscのlatex()だとbooktabsも指定できるし、かなり細かく表をカスタマイズできる。これで足りない表はどんな表? -- 2008-02-02 (土) 01:00:07
  • 参考になるかどうか?(本当のところ二種類の出力の違いが分からぬ ^^;) -- 2008-02-02 (土) 10:00:53
    > a <- "abc"
    > b <- paste(a,'"""', sep="")   # single quoate ではさむ
    > b
    [1] "abc\"\"\""
    > c <- paste(a,"\\\\\\", sep="")
    > c
    [1] "abc\\\\\\"             
    > d <- paste(a,"\"\"\"", sep="")
    > d
    [1] "abc\"\"\""
  • singleQuoteはsingleQuoteで終わり,dowbleQuoteはdowbleQuoteで終わります. '\'(0x5c)で"ああ、エスケープしてんのか"と入力を解釈しますから, '"'も'\"'も同じ結果になります. コンソール出力は*エスケープして*出力してくれます. 例えば, charToRaw?('\\') の \ を一個減らすと, 文字列が完結していない状態になります. わかりにくいのかもしれませんけど, そういう物(極めてロジカル!)としか言いようが無いような... もしかしたら, 説明の上手な方がいらっしゃれば良いですね.(^_^; -- なかま 2008-02-04 (月) 10:50:11

因子に対しては無意味です

LUKE? (2008-01-28 (月) 17:45:57)

時系列データを扱っていいて
二種類のデータを使って試したところ
ひとつだけ
Warning message:
In Ops.factor(left, right) : * 因子に対しては無意味です
というメッセージが出てきます。
データの構造によるものなのでしょうか?
アドバイスをいただけたらと思います。

Book <- read.csv( a.csv', header = TRUE )
nTime1 <- nrow( Book )
flag1 <- Book[-nTime1,] != 0
BookValue1 <- rbind( 0, Book[-1,] * flag1 )

R version 2.6.1 (2007-11-26)
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

  • a.csv がどういうものであるかわからないので,だれも適切なコメントはできないのではないでしょうか。
    おそらくは,データファイル中に数値構成要素以外の文字が紛れ込んでいて,データが factor として読まれているんでしょう。 -- 2008-01-28 (月) 17:49:53
  • 因子Tips大全など読まれたら得心がいくかもしれません。 -- 2008-01-28 (月) 19:01:03
  • エラーはrbindの後に出ますか?read.csvはstringsAsFactor?を指定しないと、要素をfactorにしてdata.frameを作ります。でも、数値は数値のままのはずですが。トレースできるようにa.csvか、str(Book)の結果を見せてください。勝手ながら、少し直しました。 -- akira? 2008-01-29 (火) 08:12:27
  • > 数値は数値のままのはずですが
    曖昧なことは確認してからコメントした方がよろしいかと。
    データフレームのある列がほとんど数値が入っていて,どれか一つでも数値と認識できない要素があると,その列全部が factor になるのです。実際に例を作って確認できますよ。 -- 2008-01-29 (火) 08:26:28
    テストデータ
    まともな列,異常な列
    1,1
    2,2
    3,3
    4,.
    5,5
    実行結果
    > x <- read.csv("テストデータ", header=TRUE)
    > str(x)
    'data.frame':	5 obs. of  2 variables:
     $ まともな列: int  1 2 3 4 5
     $ 異常な列  : Factor w/ 5 levels ".","1","2","3",..: 2 3 4 1 5

ライブラリの使い方(目標はRのフィンメトリックス並実装)

ポンタ? (2008-01-25 (金) 15:40:56)

Rをフィンメトリックス並に実装する方法を知りたく思いメールいたしました。なお、現在rcommanderなどは実装しています。

色々なhpを見て東大のライブラリからrを使って全てのパッケージをインストールすることまではやってみたのですがまず単位根検定の出し方が良く分かりません。(東大のライブラリは全部ダウンロードしました)

できれば多変量ARモデルなども動かしてみたいのですがどのように探し、どのようにセットすればよいのでしょうか?

あと、追加質問ですが、そもそも、ダウンロードしたパッケージは何かしないと使えないものでしょうか・・・
(全くの初心者ですがどなたかご教授いただければ幸いです。)

  • R本で顔を洗って出直すべし。 -- 2008-01-26 (土) 11:23:46
  • 講習とか仮免コースも必要か?初級者と言えども「そもそも、ダウンロードしたパッケージは何かしないと使えないものでしょうか・・・」はあまりにひどい質問。 -- 2008-01-26 (土) 14:14:57
  • library(package name) -- 2008-01-26 (土) 14:16:07
  • 教えて。[フィンメトリックス]ってなんでしょう。ググっても出てこないんだもの。---なあんだ,FinMetrix? でひけばいいのか。 -- 2008-01-26 (土) 20:58:24
  • 単位根は,PP.test()か、tseriesのadf.test()。多変量ARはそのままARに多変量を入れるとyule-walkerで計算してくれますよ。FINMETRIXも知らないようなハナタレがコメントしてるようだけど、気にすることはありませんよ。 -- よもぎ? 2008-01-28 (月) 04:33:52
  • お互い、気持ちよくWikiを使いましょうよ。
    ポンタさんの文面は何もせずにただ質問したように読み取れますので、質問を切り分けて具体的に質問すればもっと建設的な返事が得られますよ。
    おそらく、ポンタさんの質問は「(1)パッケージの使いかた」が先で、「(2)多変量ARモデル」が次で、「(3)フィンメトリクス」でしょう。
    で、(1)は自分で調べるべきで、(2)はやったこと(コードとか)を書いた方が良くて、(3)はフィンメトリクスを知らない人に何か情報を与えた方がよりたくさんの人から回答がもらえる(分野外の人の勉強になる?)のでは?
    ちなみに私も分野外なのでフィンメトリクスをしりませんで、勉強になりました。ありがとう。 -- akira? 2008-01-28 (月) 08:37:49
  • >>お互い、気持ちよくWikiを使いましょうよ。 >>おっしゃる通りです。まったく態度が劣悪な上に何も知らないような方が、初心者に偉そうにする所が、とても気にいらないので、互角になるように書いてみました。今後はここの馬鹿も少しは真面目になって欲しいものですね。 -- よもぎ? 2008-01-29 (火) 07:46:21
  • アホが思い上がってやってるだけののWikiなので上手に活用しましょうねとコメントするほうが適切では? -- とが? 2008-01-29 (火) 11:21:32
  • 皆様、当方の無作法で場を荒らしてしまい大変に失礼しました。今後はこの様なことのない様に気をつけます。ARや単位根無事解決しました。ありがとうございました。 -- ポンタ? 2008-01-29 (火) 11:23:54
  • 態度が劣悪な上級者が,初心者をストレス発散の道具に使うことは,どのような場所でも見られる光景ですが,(1) ハンドルネームぐらいは書くこと,(2) 特定の回答者には質問者からの回答満足度を評価できるようになると,普段このWikiをあまり見ない方にとって,役立つでしょうね。 -- aa? 2008-01-29 (火) 23:12:52

多変量GARCH

たく? (2008-01-16 (水) 18:41:23)

例えば現物と先物のボラティリティを推定したい場合、2変量GARCHモデルを用いるのが一般的と思いますが、

Rには多変量GARCHモデルの関数はないのでしょうか?

検索して見つかった、tseriesパッケージやfSeriesパッケージ内のGARCH関連の関数は、みな1変量用だった気がします。

  • mgarch (multivariate GARCH model) パッケージ。R site search でキーワード "GARCH multivariate" で検索。 -- 2008-01-16 (水) 19:50:27
  • ありがとうございます。こんなパッケージもあったのですね。調べが足りませんでした・・・ -- たく? 2008-01-16 (水) 23:15:28
  • mgarchBEKKというパッケージですね。多変量GARCHモデルの一つであるBEKKモデルが推計できます。ただし、CRANには登録されておらず、最近では作者によるメインテナンスもなされていないので、最新バージョンのRには対応していなかったと思います(このあたりのやりとりは、昨年末にR-SIG-FinanceかR-Helpのメーリングリストで交わされていました。有志による修正もなされていたように記憶しています)。BEKK以外のモデル(例えばDCC)を推計するには、何某かのコードをハックするか、プログラムを自作するしかないでしょう。-- ジェットラグ? 2008-01-18 (金) 09:20:31

複数枚のグラフを、一つのファイルにまとめて保存するには?

Yoshihara? (2008-01-16 (水) 03:12:00)

前例がある内容でしたら申し訳ございません。

forループの中で条件を変化させて複数枚のグラフを出力し、それら全てを一つのファイルにまとめて保存しようと思っております。

例えば以下のようなプログラムで5種類のグラフを作成しても、"graph.pdf"に保存されるのはi=5におけるグラフのみです。

for(i in 1:5){
  name<-paste("No.",i,".pdf",sep="")
  curve(x+i,main=name)
  dev.copy(pdf,file="graph.pdf")                #ファイルの保存
  dev.off()
}

現在は dev.copy(pdf,file=name)として毎回名前を変え保存しておりますが、
グラフ数が増えると処理が面倒になるため、一つのファイル名に、ページを変えることでまとめて保存したいと考えています。

自分なりに調べてみたのですが、行き詰ってしまいました。

どなたかご教授をお願い致します。

  • 次のようなやり方ではいかがですか。 -- 2008-01-16 (水) 08:01:08
    > pdf(file="myplots.pdf", onefile=TRUE)
    > plot(1:10, rnorm(10))
    > plot(1:10, runif(10))
    > dev.off()
  • onefileはデフォルトでTRUEです -- 2008-01-16 (水) 09:01:21
    pdf("output.pdf")
    for(i in 1:5) {
    	name<-paste("No.",i,".pdf",sep="")
    	curve(x+i,main=name)
    }
    dev.off()
  • ご教授ありがとうございます。pdf(),dev.off()の構造を、まだまだ理解しきれていなかったようです。
    望んでいた出力結果が得られ、大変助かりました。 -- Yoshihara? 2008-01-16 (水) 09:14:32

RMySQLパッケージの読み込みエラー

だあ? (2008-01-15 (火) 14:41:37)

RMySQLパッケージをダウンロードした後に読み込もうとすると、
「Rgui:Rgui.exe - エントリーポイントが見つかりません:プロシージャエントリポイントload_defaultsがダイナミックリンクライブラリLIBMYSQL.dllから見つかりません」
というエラーが表示され、読み込むことができません。
MySQL5.0を利用しており、DBIパッケージの読み込みまでは行ったのですが、原因が思い当たる方はいらっしゃいますでしょうか。

Rを自動で起動・終了させるには?

春一番? (2008-01-14 (月) 18:57:22)

初めまして。Rの初心者なので分らないことばかりですが、宜しくお願いします。他のサイトでExcelのデータをRに移動しデータ解析が出来ることを知りました。ソフトウエアは、Visual Basic 2005,Excel2003,R2.20,RExcel v1.35です。私がしようとしていることは、Visual Basic 2005でプログラムを作成し、画面に視標を呈示します。その視標が見えたか見えないか披検者は答えます。答えた瞬間に、その結果をExcelに保存します。Excelに保存されたらすぐにRを起動し最尤法のプロビット分析を用いて50%閾値を求めます。その結果をExcelに戻し、そこからVisual Basic 2005に戻し次の視標を呈示します。これを30回〜40回自動で繰り返したいのです。こんなことは可能なのでしょうか。また、サンプルコードはあるのでしょうか?お忙しいと思いますが何卒宜しくお願い申しあげます。

  • まずExcelを間にかませる意味がわかりません。VBならばRCMD batchでバッチ処理させるか、RDCOMを使ってVBからRを直接起動させたほうがいいように思いますが。(RExcelはRDCOMを利用したものです。RDCOMサーバーをインストールするとVBのsampleがついてます) -- okinawa 2008-01-14 (月) 19:31:10
  • ご教授ありがとうございます。http://cran.r-project.org/contrib/extra/dcom/からIndex for R/Scilab (D)COM Server V2.50 and RExcel V1.75をインストールしました。しかし、エクセルを開こうとするとコンパイルエラーが出てしまいエクセルが開けません。どのように対処したら良いのでしょうか?ご指導宜しくお願い致します。 -- 春一番? 2008-01-14 (月) 20:50:45
  • まず環境を整備しましょう。Rのバージョンが古いのでR2.5.1にしてみてください。その場合古いRはアンインストールしてください。つぎに、エクセルが開かないとは具体的に何をどのように起動したのかを教えてください。(こちらはそちらの実行環境が分かりませんので、すべて具体的に説明するように心がけてください) -- okinawa 2008-01-15 (火) 08:36:50
  • 指標というものがどういうものか分かりませんが、R(とそのグラフィックス機能)だけでできないか、と思ったりするのですが。もしそうなら世話が無い。それと直前のコメント中の R 2.5.1 は R 2.6.1 ですか? -- 2008-01-15 (火) 10:17:19
  • R2.6.1でもいいとは思うのですが、私自身でRDCOM&RExcelとR2.6.1の実働検証をしていませんので、R2.5.1と書きました。 -- okinawa 2008-01-15 (火) 13:35:48
  • 視標はランドルト環と言って眼科で視力検査するときの黒い輪っかのことです。あと、R2.20ですが、CD-Rから入れたのでダウンロードをどのサイトからしたら良いかよくわかりません。お勧めのサイトがありましたら教えて頂けないでしょうか? -- 春一番? 2008-01-15 (火) 21:55:15
  • http://cran.md.tsukuba.ac.jp/ などを参照。
    ランドルト環なら,Rで簡単に描けるでしょう。だとしたら,一から10までRで,済む。 -- 2008-01-15 (火) 22:32:07
  • 業務用に開発を考えているのであれば、VB使うのが正解かと思います。研究目的なら上記にあるようにRcmdrプラグインあたりを使えば開発できそうですね。 -- okinawa 2008-01-16 (水) 10:55:35
  • 返事が遅くなり申し訳ありません。ランドルト環なのですが、将来的には色の濃さを変えたり色そのものを変えたりする予定です。さらに、VBで視力検査以外にも他の検査も開発しようとしています。さらに発展させて臨床の場で使えればと思っています。なので、是非ともVB→R→VBの流れを学びたいのです。明日の朝一で上記のサイトからR2.5.1をダウンロードして実働するか確認したいと思います。 -- 春一番? 2008-01-17 (木) 23:22:33
  • お伺いしているかぎり,[VB→R→VBの流れ]にこだわる必要性が見いだせません(趣味の問題でしょうから,ああだこうだ言う必要はないので,お好きなように) -- 2008-01-18 (金) 00:41:59
  • RDCOMは基本的にCOM(ActiveX)なのでVBからRを叩くのに向いていると思います。また、最近の臨床機器はネットでサーバーに飛ばせとか、Excelでデータを出力させろとか現場の要求が多いのでVBで逃げてた方が無難です。(私は決してVBが好きな訳ではありません。むしろ嫌いな方です。念のため) -- okinawa 2008-01-18 (金) 08:34:01
  • RExcelのインストールですが、http://cran.r-project.org/contrib/extra/dcom/のRsvr250.exeは不具合が有るようです。http://sunsite.univie.ac.at/rcom/download/current/のRsrv250_pl1.exeをお試しください。 -- 知ったかぶり? 2008-01-19 (土) 21:44:13
  • 返事がしばらく出来なくて申し訳ありませんでした。他のことで一杯一杯でRに手がまわりませんでした。今日知ったのですが、Visual Basic 2005からAccessやExcelにデータを写すことが出来るのですが、これはVBにRDCOMが入っていると考えてよいのでしょうか? -- 春一番? 2008-01-25 (金) 12:46:12
  • VBにRDCOMが入っているのではなくて、「アプリケーションの連携に用いる仕組み」がCOM&DCOMということです。VBもAccessもExcelもそれぞれCOMを持っていて、そのAPI(COMAPI)を利用することで連携をさせます。RDCOM&RCOMはRに実装されたCOM(API)です。 -- okinawa 2008-01-26 (土) 14:55:57

foldまたはreduceのような機能はありますか?

lambda? (2008-01-13 (日) 04:22:49)

sumとprodは見つけたのですが、足し算、かけ算以外の任意の演算で畳込みを行うときにはどうすればいいのかわかりません。
Rではベクトル化された関数を使ってmap関数と同等のことが出来たり、論理値ベクトルを[]に入れてfilter関数と同等のことが出来たりしますが、
fold関数等がなくても直接的に畳込みをする方法があったりするのでしょうか?
それともforを使って地道に変数に累積していくしかないんでしょうか…。

  • fold, reduce とは具体的にどういう演算のことを指すのですか。その名も convolve という関数がありますが、もしかしてこれのこと?-- 2008-01-13 (日) 11:22:57
  • 説明が足りなくてすみません。http://d.hatena.ne.jp/blanketsky/20071129/1196329379 にあるような演算です。仮にRにfoldという名前でその関数があったとしたらfold("+",1:10)またはfold("+",0,1:10)と呼び出すと55を返すようなイメージです。 -- lambda? 2008-01-13 (日) 17:50:58
  • 例は,色々な説明ページにもある R で言えば sum 関数なのですが,もっと他の例は(Rで用意されていないような例)を挙げていただくと,それをRならどう料理するかということを回答してくれるんじゃないかと思います。 -- 2008-01-13 (日) 18:08:52
  • 混乱させてすみません、"+"(1,2)→3が出来るので"+"単体で関数が返るものと勘違いしていました。先ほどの例は、fold(function(x,y)x+y,1:10)に訂正させてください。例えば内部処理として、fold<-function(f,x){r<-x[1];for(i in x[-1])r<-f(r,i);r}のような、関数fとベクトルxを引数としてとり、fの値によってsumとしても他の同種の関数としても使えるような関数がRにあるのかどうかが知りたいです。 -- lambda? 2008-01-14 (月) 03:31:22
  • おそらく R なら apply 関数族を使うケースでしょうね。いろんな *apply 関数がありますから、使い方をマスタすれば便利だと思います。 -- 2008-01-14 (月) 06:19:33
    > ft <- function(x) {x+pi}
    > sapply(1:10, ft)
     [1]  4.141593  5.141593  6.141593  7.141593  8.141593  9.141593 10.141593
     [8] 11.141593 12.141593 13.141593
    > sum(sapply(1:10, ft))
    [1] 86.41593
    > sum(sapply(1:10, function(x) {x+pi}))  # 一行で書けば
    [1] 86.41593
    もしくは outer 関数も使えるかもしれません(こっちの方が一般に早い)。
    > outer(1:10,pi,"+") 
               [,1]
     [1,]  4.141593
     [2,]  5.141593
     [3,]  6.141593
     [4,]  7.141593
     [5,]  8.141593
     [6,]  9.141593
     [7,] 10.141593
     [8,] 11.141593
     [9,] 12.141593
    [10,] 13.141593
    > sum(outer(1:10,pi,"+")) 
    [1] 86.41593
    > sum(outer(1:10,pi,"*")) 
    [1] 172.7876
    > sum(outer(1:10,pi,"^")) 
    [1] 4074.216
  • ありがとうございます。sapplyやouterは引数として関数を与えるものという点で非常に近いです。このような関数族の中で、n個の要素からn個の値を返すのではなく、n個の要素から1つの値を返すものはありますでしょうか?例のための例のようで恐縮ですが、5個の数値から1つの文字列を返す例:fold(function(x,y)paste("[",x,",",y,"]"),1:5)→"[ [ [ [ 1 , 2 ] , 3 ] , 4 ] , 5 ]" -- lambda? 2008-01-15 (火) 01:29:33
  • 単独で行うものは無いでしょう。要するに再帰的処理のようですから、Recall 関数を用いて関数を書けば済む事ではありますが。 -- 2008-01-15 (火) 10:13:02
  • やはりないのですか…。ありがとうございます、おかげであきらめがつきました。とりあえず上に書いたfold<-function(f,x){r<-x[1];for(i in x[-1])r<-f(r,i);r}で代用することにします。 -- lambda? 2008-01-16 (水) 02:05:44

SQLファイルから読み込んだベクトル様データのベクトル化の仕方

あーちゃんぱぱ? (2008-01-11 (金) 23:35:13)

全くの初心者です,よろしくお願いします.
MySQLのデータベースからデータを読み込んで解析を行おうとしているのですが,利用したいデータの構造が,"120, 500, 554, 578" という様なベクトル構造をしている為に読み込むと文字列として認識されてしまいます.なんとかして,このデータからベクトル c(120, 500, 554, 578)を得たいのですがどうすれば良いのでしょうか?解決法を教えて下さいよろしくお願いします.

  • コンマで区切られている為に文字列になってしまうのでしょうか? -- あーちゃんぱぱ? 2008-01-12 (土) 00:45:48
  • ご呈示いただいた,データを基に解決例を挙げてみます。あと恐縮ですが,「あーちゃんぱぱ」さんの記載している,多重のコメントや,Wikiの書式ミスは,印象が悪くなってしまいますので,ご自身で消去して下さい。 -- aa? 2008-01-12 (土) 00:56:20
    a <- "120, 500, 554, 578"
    as.numeric(strsplit(a, ",")[[1]])
  • aaさんありがとうございました,大変参考になりました. -- あーちゃんぱぱ? 2008-01-12 (土) 01:37:49
  • scan(textConnection(a, "r"),sep=",") -- 2008-01-12 (土) 09:38:25

Rcmdrのダウンロード

SIS? (2008-01-11 (金) 17:15:44)

記載場所が違っていたら申し訳ありません。
windows版 R 2.4.1をインストール後、Rcmdrをダウンロードしようとしたところ、一部の関連パッケージはインストールできたのですが、ほとんどのパッケージについて

URL 'http://cran.md.tsukuba.ac.jp/bin/windows/contrib/2.4/Rcmdr_1.2-9.zip' を試しています
以下にエラーdownload.file(url, destfile, method, mode = "wb") :
URL'http://cran.md.tsukuba.ac.jp/bin/windows/contrib/2.4/Rcmdr_1.2-9.zip' を開けません
追加情報: Warning message:
開けません:HTTP ステータスは '403 container violation' です
download.packages(pkgs, destdir = tmpd, available = available,  中で警告がありました:
download of package 'Rcmdr' failed

といったエラーが出てしまいました。 googleなどを検索したのですが、どのようにすれば解決するかが分かりません。 解決策をお教えください。

  • Rをインストールした手順、パッケージをインストールした手順、OSのバージョンを詳細に説明してください。 -- okinawa 2008-01-13 (日) 11:14:21
  • ご返答が遅くなって申し訳ありません。OSのバージョンはwindowsXP SP2になります。Rのインストールは筑波のミラーサイトよりwindows ⇒base⇒old⇒R 2.4.1の順で入り、R-2.4.1-win32.exeを選んで実行。インストールは日本語で行い、「次に」を順に押していって、インストールしました。パッケージのインストールは「パッケージのインストール⇒サイトで筑波を選択⇒Rcmdrを選択」の順序で行いました。その結果が上記質問にある内容になります。よろしくお願いいたします。 -- SIS? 2008-01-14 (月) 18:10:55
  • 追記 パッケージのインストールはR 2.4.1を立ち上げた後にRから行いました。 -- SIS? 2008-01-14 (月) 18:13:45
  • 手順は問題ないようですね。だとすると単にネットワークがうまくつながっていないように見受けられますが・・・。http://cran.md.tsukuba.ac.jp/bin/windows/contrib/2.4/Rcmdr_1.2-9.zipをブラウザで実行させるときちんとダウンロードできますか?できる=>Rの再インストール、できない=>ネットワークの設定確認&ブラウザにproxyや変なcacheをいれていないかの確認 -- okinawa 2008-01-15 (火) 15:32:40
  • okinawa様コメントありがとうございます。ブラウザでダウンロードをしようとしたところForbidden by content security scanner The content security scanner detected a container size or limit violation in the URL http://cran.md.tsukuba.ac.jp/bin/windows/contrib/2.4/Rcmdr_1.2-9.zip. The content has been removed.というメッセージが出ました。会社のPCを使用しており、セキュリティソフトとしてウィルスバスター コーポレートエディションが入っているのですが、それが問題なのかも知れません。他にも色々確認してみます。 -- SIS? 2008-01-16 (水) 09:25:49
  • たぶんセキュリティに引っかかっているのでしょう。セキュリティツールにcran.md.tukuba.ac.jpを許可するように設定しないとうまくいきそうにないですね。 -- okinawa 2008-01-16 (水) 11:02:25
  • 単にプロキシの問題では?? -- 通りすがり? 2008-06-03 (火) 18:42:44

tapplyを使ったグラフ作成

tukey? (2008-01-11 (金) 11:47:06)

以下のように、ある区分(以下の例では、"TYPE")ごとにヒストグラムを作成することを考えておりますが、タイトルにどの区分かを表示したいと考えておりますが、どのようにすればよいか教えてください。
それぞれの区分のタイトルに、
Histogram of TYPE=1
Histogram of TYPE=2
と表示したいと考えております。

以下に簡単なプログラムの事例を載せます。

AGE<-c(30,80,90,77,65,33)
TYPE<-c(1,1,1,2,2,2)

myhist <- function(x){
	hist(x,main=paste("Histogram of TYPE=",1))
}

tapply(AGE,TYPE,myhist)
  • myhistの中でsubstitute(x)を表示させると"X","[["に続いてTYPEの何番目の水準かという数字が出てくるので,上の場合ならmyhistの中を
    	hist(x,main=paste("Histogram of TYPE=",substitute(x)[[3]]))
    とするだけで可能です([3]より上の方が良いので訂正しました。また,失礼ながらコードの書式を勝手に直させていただきました)。 -- 中澤? 2008-01-11 (金) 12:37:26
  • 中澤先生。ご教授ありがとうございました。2日ほどいろいろ調査して分かりませんでした。大変助かりました。 -- tukey? 2008-01-11 (金) 13:01:25
  • TYPEが1から始まる連続する整数値とは限らないと思う -- 2008-01-11 (金) 14:23:54
  • その場合は,TYPEをfactorにしておいて,levels(TYPE)の添え字にすればいいです。 -- 中澤? 2008-01-11 (金) 14:30:03
  • 申し訳ございませんが、具体的なプログラムをご教授頂けないでしょうか? -- tukey? 2008-01-11 (金) 16:46:45
  • 例えば,次のようになります。-- 中澤? 2008-01-11 (金) 17:50:03
    AGE<-c(30,80,90,77,65,33)
    TYPE<-as.factor(c("M","M","M","F","F","F"))
    LTYPE<-levels(TYPE)
    
    myhist <- function(x){
    	hist(x,main=paste("Histogram of TYPE=",LTYPE[substitute(x)[[3]]]))
    }
    
    tapply(AGE,TYPE,myhist)
  •  -- 2008-01-13 (日) 14:36:35
    invisible(mapply(function(x, main) hist(x, main=main),
    split(AGE, TYPE), paste("Histogram of TYPE=", levels(TYPE))))

プロビット分析で出てくるエラーについて

kuro? (2008-01-10 (木) 05:46:11)

はじめまして。
プロビット分析を行なっていて出てくるエラーの意味について教えて下さい。

当方、MASSパッケージを読み込んで、順序プロビット分析(polr()関数を使う)を行なっています。以下は、Rのコンソール画面です。

> library(MASS)
> data<-read.table("data.dat",header=TRUE)
> data[1:3,]
  popul TVnews selfLR ClinLR DoleLR PID age educ income vote reldist
1     0      7      7      1      6   6  36    3      1    1      -5
2   190      1      3      3      5   1  20    4      1    0       2
3    31      7      2      2      6   1  24    6      1    0       4
> summary(polr(as.ordered(ClinLR) ~ TVnews+selfLR+PID+age+educ+income, data=data))


と入力すると、

 Error in svd(X) :  'x' に無限値か欠測値があります 


と表示されます。
このエラーが何を意味しているか分からないのですが、ご存知の方がいらっしゃったら教えて下さい。よろしくお願いします

  • そのままの意味でしょう。データに NA もしくは Inf 値が紛れ込んでいませんか。 data2 <- data[complete.cases(data),] として NA 値のあるケースを除いて試してみられたら。 -- 2008-01-10 (木) 07:19:40
  • かぶってますね。
    エラーの意味はpolr関数の途中でsvd関数を使っていて、svdが処理する引数XにNAかInfがあるということです。たとえば
    x <- matrix(1:12, ncol=4)
    svd(x) # エラーはでない
    x[1,1] <- NA
    svd(x) # エラー
    ということです。
    ところで、polrにはsvdを使うのですか?Googleで調べると、良く似た質問がありました。また、ソースコードはこれこれです。たどってみて、どこで引数Xが出てくるかチェックしてはどうですか?もしかすると、polrに適さないデータ構造なのかもしれませんよ。 -- akira? 2008-01-10 (木) 07:21:08
  • akiraさま、ご親切にご教授、本当にありがとうございます。 当方、500個の同じデータ構造のデータセットをpolrにかけているのですが、答えが得られるものと、得られないものがあります。なので、データ構造に間違いがあるという訳ではなさそうです。これから、ご教授頂いた事を精査してまたご報告に参ります。ありがとうございます! -- kuro? 2008-01-11 (金) 06:06:19
  • すみません。正確でなかったです。polrの内部処理でXが出るのですが、このXにNAかInfが生じるデータと生じないデータがあると思います。そしてXにNAかInfがあるとsvdがエラーになるります。 -- akira? 2008-01-11 (金) 16:20:29
  • > データ構造に間違いがあるという訳ではなさそうです
    データ構造ではなく,データの性質に問題がある(そう言うものも含めてデータ構造というのなら別ですが)ものがあるということではないでしょうか? -- 2008-01-13 (日) 18:29:08
  • >>データ構造ではなく,データの性質に問題がある(そう言うものも含めてデータ構造というのなら別ですが)ものがあるということではないでしょうか?\br ご返信ありがとうございます。調べてみると、順序プロビットの場合、うまくモデルに適合しない場合に解が出ないことがあるようです。\br上記式polr(as.ordered(ClinLR) ~ TVnews+selfLR+PID+age+educ+income, data=data) では、得られる潜在変数を1,2,3の値をとる質的変数に落とすために,2つの閾値で区切るのですが、データがモデルにうまく当てはまってない場合には、1と2を区切る閾値と2と3を区切る閾値の値が逆転してしまって答えが出なくなるので、そのエラーではないかと思っています。 -- kuro? 2008-01-17 (木) 10:47:41

[getOption("max.print") を越えました -- 末尾 190 行を省略します]

竹の山? (2008-01-08 (火) 22:28:33)

昨日から始めた初心者です。
900行X150列程度のデータのテキストファイルを分析したいので、

x >- read.table(“G1.txt”, header=TRUE)
でRに読み込んで、その結果を

x
で見ようとすると全部は見れません。これはアーカイブにある「R Consoleの表示容量について」の内容と同じですが、sink 関数を使って作ったテキストファイルの最後に以下のようなメッセージが出て少略されてしまいます。

[getOption("max.print") を越えました -- 末尾 190 行を省略します]]


R version 2.6.1 (2007-11-26)
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

  • ご教示通りやることが出来たようで成功です。有難うございました。今後もよろしくお願いします。 -- 竹の山? 2008-01-08 (火) 22:49:31
  • 自問自答?それとも、直前の回答が消されてしまった?回答はおそらく -- 2008-01-09 (水) 00:21:12
    > old.op <- options(max.print=999999)
    > old.op
    $max.print
    [1] 99999                         # 既定値
    
    > options()$max.print
    [1] 999999

ベクトルを割り当てることができないのはメモリ不足が原因?

Saito? (2008-01-06 (日) 23:27:04)

WindowsXPでR2.6.1を使って一般化線形モデルによる解析を行っています。
データを読み込んでさぁ解析といったところで、次のようなメッセージがでました。

x=read.table("a.txt",header=T)
result=glm(A~.,data=x)
エラー:  サイズ 294.8 Mb のベクトルを割り当てることができません 

初級Q&Aの"Step関数の実行"など、似たような事例はあったのですが解決には至りませんでした。
ただ、そのやり取りの中で出てきた「WindowsのBoot.iniに/3GBスイッチをつける」 という箇所のみ調べてもできなかったので、
それで解決するというのならおしまいなのでしょうが(汗)
ちなみにglmではなくbiglmだとできるのですが…。

result2=biglm(A~B+C+D+...+Z,data=x)
step(result2)
以下にエラー UseMethod("extractAIC") : 
"extractAIC" に適用可能なメソッドがありません 

というメッセージが出てstepしても何故かできないし(一応extractAICも調べましたが…よくわかりませんでした)、そのあとのモデル選択ができないんです…。
つまり、エラーが出なくなった上でstep関数等でモデル選択ができるような解決方法、
をどなたかご存知でしたらご教授お願いします。ちなみに

> memory.size(T)
[1] 801.5625

また、memory.limitは4095に設定してあります。
よろしくお願いします。

  • メモリはどれだけ積んでいますか? -- 2008-01-07 (月) 09:43:49
  • あ、すみません1.00GB RAMとなっています。 -- Saito? 2008-01-07 (月) 11:56:15
  • やはりメモリ不足でしょうね(そもそも1GBしかメモリがないのに4GBのメモリ使用を指定しても無意味でしょう。それと memory.size(T) の出力はバイト単位のようですが、801.5625 とは面妖な。801MBの意味ですか?)。データが大きければ作業途中にも大量のメモリを使うでしょうから.。biglm にせよ glm にせよ、すべての説明変数を一度に使わず、最初は一つ、次に二つ、等試して良さそう(AIC等の適合度が情報として得られるというのが大前提ですが)な組み合わせを調べるのが一つの方法かもしれません(その際データそのものも不要な変数を削ってスリムにする必要があるかもしれません)。step関数も基本的には変数を増減させて試行錯誤しているわけですから。biglm の出力には有効(そう)な変数と無効(そう)な変数をチェックする情報はありませんか。 -- 2008-01-07 (月) 14:04:03
  • なるほど。やはりメモリ不足ですか。memory.size(T)の単位は801MBの意味だと思います。KB等にも直せるのでしょうか?何分初心者なもので…(汗)え〜っとつまり話をまとめると、不足分のメモリを増やす方法はないので少しずつ変数を加えて最適なモデルを探したり(力づくのstep関数?)最初からある程度変数を減らすなりして解析、ということでしょうか?つまり上記の「ベクトルが作成されません」というエラーが出たらお手上げ、という解釈ですよね?ちなみにglmの場合はAICは出るのですが、biglmの場合は出ないんですね。biglmの出力で出てくるのは Coef,(95%CI),SE,p値の4つですね。p値を見て捨てていくことも可能かもしれませんが、一応AICとかも見たいので…。 -- Saito? 2008-01-07 (月) 15:09:18
  • memory.limit(size=NA)ではダメですか?あと、Winはメモリ食いなので、定期的にgc();gc()をした方が良いですよ -- akira? 2008-01-07 (月) 17:57:26
  • Rは物理メモリのみ使います。(仮想メモリは使わない)あなたのWindowsXPに余計なアプリやサービスが立ち上がっていませんか?また、実行中にタスクマネージャーでRgui.exeがどれくらいメモリを食べているのか確認してみてください。状況から察するに、あなたのPCはあなたのデータを解析する環境に無いと思います。トリックを使うのではなく解析環境をきちんと整えた方がいいような気がします。 -- okinawa 2008-01-07 (月) 18:21:57
  • memory.limit(size=NA)とすると1024と表示されましたがそれでいいのでしょうか…?gc()もやってみましたがダメでした。Windowsで余計なサービスは立ち上がっていないと思いますが、タスクマネージャの"プロセス"でしか見れないようなやつは動いています。いくつかプロセスを終了させてしまっても差し支えないのでしょうか。ちょっとその辺りに疎いものでわかりません…。 -- Saito? 2008-01-07 (月) 19:48:19
  • 物理メモリを増やすかデータを減らすかです。統計解析うんぬん以前の話になっているのでこれ以上回答できかねます。以上。 -- okinawa 2008-01-07 (月) 20:49:46
  • memory.limit(size=4095)とか(4096以上はよさげなメッセージが出ます)してみて下さい. Rはデフォルトでは, 仮想メモリ+物理メモリ-512MB 又は 物理メモリのいずれか小さいサイズが設定(for win32)されます. win32は標準では2GBまでしかユーザ空間では扱えません. バイナリに3GBのフラグを立てて、OSも3GBスイッチを有効にして始めて3GBまで扱えます(付近に詳しい人がいないと理解不能かも). 詳しくはhelp("Memory-limits")近辺を参照して下さい. ただ、swapするような環境だと、実質使いものにはならないので、ソースを改変してこまかく実行するようにするか、Linux等の64bit空間が使えるOSの利用を試してみてはいかがでしょうか. R for Win64はまだ使えるような状態ではないような気がします. -- なかま 2008-01-07 (月) 22:14:39
  • アドバイスありがとうございます。ちょっと試してみて、後日報告いたします。 -- Saito? 2008-01-08 (火) 13:29:50
  • できました。できなかった原因は、ファイルとファイルをmergeでくっつけていたのですが、そのときに同じ要因なのにカテゴリー変数と連続変数が一緒になっている箇所があり、そのため項目数が一気に増大してしまったためというお粗末なものでした。お騒がせして大変申し訳ありませんでした。 -- Saito? 2008-01-08 (火) 21:22:55
  • 投稿の基本どおり、データやコードをきちんと載せないと無駄な回答を引き出しますので、今後はちゃんと乗せてください。(私や他の回答者の方の時間を無駄に使わせないでください) -- okinawa 2008-01-09 (水) 09:03:32

添付ファイル: filenls.png 1625件 [詳細] filedouble_pkg_instlr.jpg 1307件 [詳細] filepackage.png 1391件 [詳細] fileboard.png 1633件 [詳細] fileboxplot.png 1406件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2015-03-01 (日) 01:15:59 (1634d)