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


●● 目次 ●●

参照は,個々の項目をクリック(質問への回答・コメントの参照も,個々の項目をクリック)


まずは,「投稿における注意事項」を読んでください。
これに従わない場合には回答が得られにくい場合があります。

●● 新規投稿 ●●  




NAの置換について

なっつ? (2014-09-18 (木) 16:59:06)

お世話になります。
以下のようにdat中のNAを空文字に置換します。実際にはNAは数千個含まれますが、例として2つだけにしています。

dat <- matrix(1:9000000, 3000, 3000)
dat[1, 2] <- dat[2, 1] <- NA
dat[is.na(dat)] <- ""

この処理で目的は達成できるのですが、最後のdat[is.na(dat)] <- "" が単なる代入処理にしては計算時間が長いので、もっと短くならないかと思っています。よい方法がありましたらご教示ください。
宜しくお願いします。

  • バイトコンパイルすると幾分時間が短縮されるみたいですよ。システムは11分の1に短縮されたものの、ユーザが変わらないので、半分にもならないみたいだけど。 -- 2014-09-19 (金) 10:33:35
    > library(compiler)
    > f <- function(x){x[is.na(x)] <- "";x}
    > fc <- cmpfun(f)
    > dat[1, 2] <- dat[2, 1] <- NA; system.time(f(dat))
       ユーザ   システム       経過
         0.398      0.099      0.644
    > dat[1, 2] <- dat[2, 1] <- NA; system.time(fc(dat))
       ユーザ   システム       経過
         0.386      0.009      0.396
  • いや, ""を付値する事によって何が起きているかを見て下さい. 最初の行のdatをstr(dat)で見て, 三行目を実行したのち str(dat) して何が変わったのか(このコンバートの為の時間です)... と言うか, そもそも何がしたいのかがわかんないからコメント出来ないんだと思います. 例えば表示するのに NA が邪魔なのなら, print(dat,na.print="") ですむんです. でもそんなでかいの表示しても見たくないし? -- なかま 2014-09-19 (金) 11:09:54
  • あと, このくらいのバイトコンパイルでは殆ど差が無いはずですので(たぶん殆どメモリのアロケート)三回程度実行してみると良いと思います. -- なかま 2014-09-19 (金) 11:18:46
  • datをcsvファイルとして保存してエクセルで編集したいのですが、NAが含まれるセルを空欄として扱いたいのでこの質問をしました。要素数は同じでも行列と配列では4倍も処理時間が違うのですが、こういうものなのでしょうか。 -- なっつ? 2014-09-19 (金) 11:39:35
    dat <- matrix(1:9000000, 3000, 3000)
    dat[1, 2] <- dat[2, 1] <- NA
    system.time(dat[is.na(dat)] <- "")
    
    a <- 1:9000000
    a[1] <- a[2] <- NA
    system.time(a[is.na(a)] <- "")
  • 私のコンピュータは非力なので,「2014-09-19 (金) 10:33:35」さんのような1秒以下の実行時間がうらやましいです。それと,R を立ち上げて,最初に実行するときと2回目以降で所要時間がずいぶん違うのです。しかし,2回目以降ならば,行列であろうとベクトルであろうと,実行時間は実質的に同じです。
    3000×3000の行列をExcelで編集とは,恐るべし。この列とこの列でこういう計算をしてここに結果を...なんて,GUI でやることを考えると,気が遠くなりそうです...
    エクセルで読むなら,NA を含むままファイルに書き出して,普通のエディタで読み込んで,NAを""に全置換し再度セーブしてから,Excelで読めばよいでしょう。しかしまあ,write で書き出すだけでシステムも含めた経過時間が68秒でしたよWWW入出力ってのは,単なる計算処理の1000倍くらい遅いのは常識。Excel に読み込むのにも時間がかかる。 -- 河童の屁は,河童にあらず,屁である。? 2014-09-19 (金) 12:07:07
    > dat <- matrix(1:9000000, 3000, 3000)
    > dat[1, 2] <- dat[2, 1] <- NA
    > system.time(dat[is.na(dat)] <- "")
       ユーザ   システム       経過  
        29.090      0.367     29.192 
    > 
    > a <- 1:9000000
    > a[1] <- a[2] <- NA
    > system.time(a[is.na(a)] <- "")
       ユーザ   システム       経過  
         3.954      0.039      3.961 
    > 
    > dat <- matrix(1:9000000, 3000, 3000)
    > dat[1, 2] <- dat[2, 1] <- NA
    > system.time(dat[is.na(dat)] <- "")
       ユーザ   システム       経過  
         3.949      0.012      3.930 
    > 
    > a <- 1:9000000
    > a[1] <- a[2] <- NA
    > system.time(a[is.na(a)] <- "")
       ユーザ   システム       経過  
         3.951      0.012      3.930
  • それなら, write.tableでいいんじゃないでしょうか na引数が効果ありますよ. -- なかま 2014-09-19 (金) 13:18:30
    > dat <- matrix(1:9000000, 3000, 3000)
    > dat[1, 2] <- dat[2, 1] <- NA
    > system.time(dat[is.na(dat)] <- "")
       ユーザ   システム       経過  
        22.318      0.184     22.573 
    > system.time(write.table(dat,"hoge.csv",sep=",",na="",row.names=F, col.names=F))
       ユーザ   システム       経過  
         5.096      0.108      5.214
  • 1回目と2回目で計算時間が異なるとは初めて知りました。これ以上の高速化は無理そうですね。ありがとうございました。 -- なっつ? 2014-09-19 (金) 13:33:33
  • na引数というものがあるのですね。確かにこれなら私の目的を果たせます。ありがとうございました。 -- なっつ? 2014-09-19 (金) 13:43:39
  • たぶんNAのところに""を代入しようとすると、vectorやmatrix全体が文字列に型変換されてしまうのも遅くなる原因の1つと思います。 -- 2014-09-22 (月) 14:01:05

Error in View(fev) : X11 dataentry cannot be loaded

Back? (2014-09-18 (木) 04:47:26)

Mac(OS10.9.4) でRを最近使用し初めました。エクセルのファイル(データは、サンプルグループが1から3あって、それぞれのグループの身長の平均を数値化したものを例として使用)を.csvのフォームでRに呼び込み、データを表示させ、View()を入れてみたのですが、毎回”Error in View(fev) : X11 dataentry cannot be loaded”メッセージが表示されます。他のファンクション(dim, names, tail, class)に関しては全く問題ありません。今の所、View()の時だけエラーが出ます。Windowsの場合は全く問題無く表示されたので、Mac特有の問題かと思うのですが、どなたか解決方法ご存知でしょうか?

  • たぶんAbout X11 and OS Xから辿ってXQuartzをインストールすれば動くと思われる. -- なかま 2014-09-18 (木) 09:34:06
  • 別のアプローチとして、R.appではなくRStudio.appを使うとXQuartzを入れなくても、MacOSXで期待通りに表計算ソフト風に表示できますよ。 -- 2014-09-18 (木) 14:01:54
  • お教え頂きありがとうございます。XQuartzを入れてみて、それでもエラーが発生したらRStudioを使ってみます。 -- Back? 2014-09-18 (木) 22:04:20

線形混合モデルの収束

初心者? (2014-09-02 (火) 23:16:29)

初めまして。R勉強中の者です。
lme4パッケージに含まれるlmerという関数で線形混合モデルを用いた解析を試みております。

lmer(formula= Y ~ X1+X2+X3+X4+X5+(X1+X2+X3+X4+X5|Random))	

といった形で、ランダム効果を組み込んだ計算をさせたいのですが、

警告メッセージ: 
1: In optwrap(optimizer, devfun, getStart(start, rho$lower, rho$pp),  :
 convergence code 1 from bobyqa: bobyqa -- maximum number of function evaluations exceeded
2: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
 Model failed to converge with max|grad| = 33.3731 (tol = 0.002)
3: In checkConv(attr(opt, "derivs"), opt$par, ctrl = control$checkConv,  :
 Model failed to converge: degenerate  Hessian with 4 negative eigenvalues

となり、計算できません。
ランダム効果が複雑なため、計算を近似的に収束させるパラメータ(関数の最大数, 計算の繰り返し数)を指定すらばよいのかと思うのですが、このエラーからでは指定法が分からず悩んでおります。
尚、過去のバージョンでは、maxFN, maxIterという引き数で直接指定できたと情報を得ているのですが、現行版のパッケージ'lmer4'では、これらの書式が廃止されているようで、使えないようです。
ご存知の方がいらっしゃいましたら、ご教授いただければと思います。

  • 質問の前にオンラインヘルプを見るのは最低限の努力でしょう。
    lmer の引数に control というのがあり,a list (of correct class, resulting from lmerControl() or glmerControl() respectively) containing control parameters, including the nonlinear optimizer to be used and parameters to be passed through to the nonlinear optimizer, see the *lmerControl documentation for details. と書かれていますよ。「詳しくは *lmerControl を見よ」とも書かれています。 -- 河童の屁は,河童にあらず,屁である。? 2014-09-03 (水) 05:57:52
  • ご指摘ありがとうございます。 lmerControl()のヘルプを参考に
    lmer(formula= Y ~ X1+X2+X3+X4+X5+(X1+X2+X3+X4+X5|Random),
    control=lmerControl(optCtrl=list(maxfun=3000, maxiter=1000)))
    とする事で指定できました。まだエラーの嵐ですが、汗をかいてみたいと思います。 -- 初心者? 2014-09-03 (水) 10:50:56

困っています「不正なマルチバイト文字があります」

こまったちゃん? (2014-08-28 (木) 07:38:58)

『Rによるやさしい統計学』でRを勉強しています。
「TukeyHSD(aov(統計テスト2~指導法2))」という関数を打ち込んだところ、

TukeyHSD(aov(統計テスト2~指導法2))
以下にエラー grepl("\n", lines, fixed = TRUE) : 
  '<87><e5><b0>取ウ包シ<92>' に不正なマルチバイト文字があります

と表示されました。 ブログなどに書いてある対策を見ましたが、よくわかりませんでした。 誰かわかる方、いらっしゃいますか?

  • 別の人です。TukeyHSD関数では日本語は使えないみたいですね。私の知る限り、TukeyHSD(aov(データフレーム名[,列番号]~データフレーム名[,列番号])とするしかないようです。 -- 別の,こまったちゃん? 2014-08-28 (木) 07:39:53
  • Mac OS X, R 3.1.0 なら問題なくできましたけど -- 2014-08-28 (木) 07:47:29
    > 統計テスト2 <- iris[,1]
    > 指導法2 <- iris[,5]
    > TukeyHSD(aov(統計テスト2~指導法2))
      Tukey multiple comparisons of means
        95% family-wise confidence level
    
    Fit: aov(formula = 統計テスト2 ~ 指導法2)
    
    $指導法2
                          diff       lwr       upr p adj
    versicolor-setosa    0.930 0.6862273 1.1737727     0
    virginica-setosa     1.582 1.3382273 1.8257727     0
    virginica-versicolor 0.652 0.4082273 0.8957727     0
  • Ubuntu 14.04.1 LTSとDebian sidでそれぞれ試してみましたけど問題ありませんよ。OSは何ですか? -- 2014-08-28 (木) 10:03:53
  • Windows 7, R 3.1.1, statsパッケージ3.1.1で、上記のサンプルは当初の質問にある通り実行できません。 -- 別の,こまったちゃん? 2014-08-28 (木) 11:20:24
  • 最短で現実的な解決方法は、変数名にCP932でエンコードされた文字列(つまり、日本語)を使わないことだと思いますよ。「統計テスト2」を「stat.test2」に、「指導法2」を「inst2]に変更して再度試してみてください。 -- 2014-08-29 (金) 10:28:16
  • 変数名に日本語を使わなかったら、できました!ありがとうございます!ちなみにWindows 7, R 3.1.1です。質問を移動していただいた方、回答者の方々、ありがとうございました。 -- 質問人? 2014-08-29 (金) 13:44:09
  • 解決してよかったです。Windowsマシンを用意して、問題箇所を追いかけてみましたが、TukeyHSD()がmodel.tables.aov()を内部で呼び出しており、model.tables.aov()の中にあるreplications(paste("~", xx), data = mf)でエラーになっています。このreplications()は第1引数が文字列の場合だとas.formulaで式に変換するようで、as.formula()が実行時にエラーになっています。解決したみたいなので、これ以上は掘りませんが、参考まで。 -- 2014-08-29 (金) 13:58:52
  • あれ? srcfilecopy の if 文の中の grepl("\n", lines, fixed = TRUE) で起きてるんじゃない? -- 2014-08-29 (金) 14:43:01
  • その通りでした。掘り下げないと言いましたが、気になってさらに調べると、as.formula()から呼ばれたformula.character()の中にparse(text = x)があり、これがエラーになっていました。parse()は内部でsrcfilecopy()を呼んでおり、このsrcfilecopy()の内部の「grepl("\n", lines, fixed = TRUE)」でエラーが発生してるようです。この処理は、keep.sourceがTRUEの時に実行されるため、下記のようにするとエラーは解消しました。 -- 2014-08-29 (金) 16:50:51
    > .Platform$OS.type; R.Version()$version.string
    [1] "windows"
    [1] "R version 3.1.1 (2014-07-10)"
    > options(keep.source = FALSE)
    > TukeyHSD(aov(統計テスト2~指導法2))
      Tukey multiple comparisons of means
        95% family-wise confidence level
    
    Fit: aov(formula = 統計テスト2 ~ 指導法2)
    
    $指導法2
                          diff       lwr       upr p adj
    versicolor-setosa    0.930 0.6862273 1.1737727     0
    virginica-setosa     1.582 1.3382273 1.8257727     0
    virginica-versicolor 0.652 0.4082273 0.8957727     0

caretパッケージのチューニングパラメーター調整方法について

最近機械学習について興味をもちだしたもの? (2014-08-26 (火) 13:27:23)

caretパッケージのチューニングパラメーター調整方法についてなのですが、最新のパッケージでは createGridがなくなりました。
expand.grid でやってる例が多いのですが、自分でパラメーターをふる場合、どうやって範囲をきめたら良いのでしょうか?
手法によって異なると思うのですが(例えば deep learning と randomForestの場合)

また createGridはなぜ無くなったのでしょうか?

http://topepo.github.io/caret/training.html

を読むと自動でパラメーターをふる関数が用意されてるみたいです。これが新しくできたから createGrid がなくなったのでしょうか?

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

パッケージurcaの結果の取り出し(扱い)

うどん? (2014-08-24 (日) 17:55:11)

 win7のR x64 2.15.0でパッケージurcaを使い、下記のサンプルの実行とsummaryにより得られた(略)内のtestと10pct等の数値を比較したく、取り出したいのですが、names()を実行するとs4であるとのエラーが出ました。s4を調べ本サイトで示されていましたスロットの内容を見ましたが、結果の取り出しに関するものがありませんでした。取り出し方法をお教えいただけるとありがたいです。
 よろしくお願いいたします。

library(urca)
data(denmark)
sjd <- denmark[, c("LRM", "LRY", "IBO", "IDE")]
sjd.vecm <- ca.jo(sjd, ecdet = "const", type="eigen", K=2,
                  spec="longrun", season=4)
summary(sjd.vecm)
(略)
VValues of teststatistic and critical values of test:

          test 10pct  5pct  1pct
r <= 3 |  2.35  7.52  9.24 12.97
r <= 2 |  6.34 13.75 15.67 20.20
r <= 1 | 10.36 19.77 22.00 26.81
r = 0  | 30.09 25.56 28.14 33.24
(略)
  • どうも,基本的なところが理解できていないようで。(読んでも分からなかったのかな??)
    大ざっぱに言えば,s3 は $ で区切るけど,s4 は @ で区切る(うん??そんなもんじゃないって??) -- 河童の屁は,河童にあらず,屁である。? 2014-08-24 (日) 20:49:00
    > str(sjd.vecm)
      :
      ..@ cval     : num [1:4, 1:3] 7.52 13.75 19.77 25.56 9.24 ...
      ..@ teststat : num [1:4] 2.35 6.34 10.36 30.09
    > sjd.vecm@teststat
    [1]  2.352233  6.342730 10.361950 30.087451
    > sjd.vecm@cval
             10pct  5pct  1pct
    r <= 3 |  7.52  9.24 12.97
    r <= 2 | 13.75 15.67 20.20
    r <= 1 | 19.77 22.00 26.81
    r = 0  | 25.56 28.14 33.24
  • 早速にお教え頂きありがとうございます!@までは試しましたが、str(sjd.vecm)の表示内容を充分に読めていませんでした。本当に助かりました。m(__)m -- うどん? 2014-08-25 (月) 09:15:33

barplot()で棒の上の真ん中にデータを書きたい

木偶 坊? (2014-08-20 (水) 10:04:08)

初めまして、教えてください。Windows 8, R version 2.9.2 を使用しています。
barplot()関数を使って処理しています。データ数を棒グラフ上に記述したいのですが、真ん中("centre")に記述できません。左("left")にも記述できません。
R version 3.1.1をダウンロードしてやってみましたが、同じです。変わりません。
ご教示をお願いします。

setwd("f://Rdata")
par(new = FALSE)
par(mar = c(2, 4, 3, 0))
par(mgp = c(2, 0.8, 0))
par(lwd = 2)
par(mfrow = c(1, 1))
par(cex = 1.2)
par(ps = 14)
par(xpd = FALSE)
par(pty = "s")
par(xaxs = "r")
dta <- c(13278, 8860, 9082, 9435, 7222,
         5431, 5091, 6193, 5557, 3716)
main = "人口の多い都道府県(H25末資料)"
par(bg = "white")
y   <- dta/10
xlab = ""
ylab = "人口(万人)"
ylim = c(0,1500)
barplot(y, angle = 45, beside = FALSE, horiz = F, density = 16,
        col = rainbow(10), main = main, ylim = ylim, ylab = ylab,
        space = 0.1, width = 0.91, adj = 0.5,
        names = c("東京","大阪","神奈川","愛知","埼玉","北海道",
                  "福岡","千葉","兵庫","静岡"))
mn <- y
x  <- 1:10
text(x, mn, format(justify = "left", mn, adj = 0, trim = TRUE, width = 0),
     pos = 3, offset = 0.5, lty = 0, col =  "blue") 
axis(2, at = NULL, labels = TRUE, tick = FALSE)
rm(y, dta)
  • とぉってもユニークなプログラムの書き方と投稿の仕方で,少し修正しました。
    解決法は簡単です。barplot のオンラインヘルプを見ると分かりますが,戻り値は描かれる棒の中心座標になっているので,text 関数の x 座標に,その戻り値を使うのです。 -- 河童の屁は,河童にあらず,屁である。? 2014-08-20 (水) 10:30:42
    x <- barplot(y, 以下略
      中略
    mn <- y
    #x  <- 1:10 使わないので,コメントアウト
    text(x, mn, 以下略。なお,label の format や offset も指定不要と思います。
  • 河童の屁は,河童にあらず,屁である。先生早速ありがとうおございました。助かりました。 -- 木偶 坊? 2014-08-20 (水) 11:08:21

行列の各列を複数のキーと見做してソート

kddoi? (2014-08-19 (火) 17:38:52)

以前こちらのウェブサイトでお世話になりました。再度、困ったことがあり質問させてください。
行列の各列を複数のキーと見做してorderの引数として与え、ソートしたいと思っております。ただ、与えられる行列の列数が一定ではないため、任意の数の列数に対応したいのですが、そのような方法が分からずに苦労しております。
まず、次のようなことができることが最終目標です。
以下のプログラムではorderにa[,1],a[,2]を別々に与えているので上手く動いているのですが、これを関数として実装する際、引数の列数は可変を想定しております。
よって最終的には、a[,1]やa[,2]のように列を指定することなくorderが正しく動作することを目指しております(以下は最初からソートされている例です)。

cov <- c(1, 1, 1, 2, 2, 2, 1, 2, 3, 1, 2, 3)
dim(cov) <- c(6, 2)
cov[order(cov[, 1], cov[, 2]), ]

最初、orderが引数にリストを取ってくれないかと思ったのですが、「型 'list'('orderVector1' における)は未実装です 」と言われてしまいます。ただ、order自体が引数として「...」として複数の引数を受け取っているので、pairlistとして作成すれば何とか騙せないかと思ったのですが、この方針では今のところ上手く動かせて
おりません。
どうしても駄目ならば、文字列処理で

cmd <- ""
cmd <- paste("cov[order(cov[, 1]", sep="")
for (i in 2:ncol(cov)) {
  cmd <- paste(cmd, ",cov[,", sep="")
  cmd <- paste(cmd, i, "]", sep="")
}
cmd <- paste(cmd, "),]", sep="")
eval(parse(text=cmd))

などと行うことも検討しているのですが、もう少しよい方法がありましたら何卒教えてくださりますよう、お願いいたします。

  • サンプルコードはこなれていないものの,その方向で行くのも一法でしょう。
    別法として,ソートキーの各列を使って固定カラムの文字列を作り,それに基づいてソートするというのもあるかも。paste(sprintf("%2i", x[, col]), sep="") などとして。sprintf("%2i", x[, col])の部分はソートキーが取る値にもよるので,若干汎用性が落ちるが,取る値が決まっていれば案外簡単。。 -- 河童の屁は,河童にあらず,屁である。? 2014-08-19 (火) 20:47:42
  • ありがとうございます。確かにその方法もありますね。各列を基準化して、その隣の列は最大値+1を掛けて…とかも一瞬考えたのですが、面倒と思って断念していたところでした。文字列だと実装が楽そうです。ともあれ、ソートキーを一次元に落とすろいうやり方は一つの方針として有効ですね。 -- kddoi? 2014-08-20 (水) 07:39:28

DB連携:SQL文のシングルクオテーションの無視あるいは除去の仕方

registar? (2014-08-18 (月) 19:02:27)

DBに問い合わせるSQL文の中に、下記のソースのwhere id='8888'の様にシングルクオテーションが入ってる場合、そのシングルクオテーションを無視してSQL文を実効出来るようなコマンドはありませんか?お手数ですが御指導の程何卒宜しくお願い申し上げます。

drv <- JDBC(rjdbc_driver, rjdbc_jar_file, rjdbc_id_quote)
conn <- dbConnect(drv, rjdbc_url, rjdbc_user, rjdbc_passwd)
dataframe_resource <- dbGetQuery(conn, "select id, aid, bid from xxx where id='8888'")

他の言語と連携させてデータを取ってきているためシングルクオテーションが入ってしまっていてR側で無視したい状況です。rjdbc_driver, rjdbc_jar_file, rjdbc_id_quote, rjdbc_url, rjdbc_user, rjdbc_passwd には任意の値を入れてあります。

  • 上の3行のような文字列が得られるということですか?して,そこからシングルクオーテーションを除いてコマンド発行したい?
    得られた文字列からシングルクオートを取り除いた文字列(3行)を生成する関数を用意して(sub 関数で文字削除すればよいだけ),その結果を発行すればよいだけでは(手作業でしてもよいだろうし) -- 河童の屁は,河童にあらず,屁である。? 2014-08-18 (月) 21:14:31

重回帰分析における応答変数の前提条件

初心者? (2014-08-13 (水) 02:25:24)

glmの説明について調べると必ずと言って良いほど重回帰分析では応答変数に正規分布を仮定したが、glmでは応答変数に他の分布を仮定して云々と書かれています。
しかし重回帰分析の応答変数に何らかの分布を仮定しなくとも最小二乗法で係数推定ができるはずなので(最小二乗法で解を求める方法は何度か確認しました)正規分布の仮定をおく理由がわかりません。
質問1 仮定をおく理由を教えてください
質問2 誤差項は正規分布を仮定していますが上記と関係しているのでしょうか?
質問3 lmの結果に応答変数の正規性検定結果は含まれていませんでしょうか。

  • 重回帰分析の関数はlmで、glmは一般化線形モデルと思いますが、どちらのことを指しておりますでしょうか?線形モデルの枠組みで最小二乗法を使って点推定値を求めるだけでしたら、正規性の仮定は不要だったはずです。ただし検定には必要です。膨大な内容に関する質問をやや整理しきれていない状態で一度に質問されているように思うので、もう少し整理をして質問をすると答え易くなると思います。またlmの結果に関する質問はhelpで調べれば片付く話だと思います。 -- kddoi? 2014-08-20 (水) 07:55:28
  • >ただし検定には必要です。 ダウト。正規分布の必要性はなく、単にそういう仮定をおいて検定しているだけ。 -- 2014-08-22 (金) 23:36:07
  • glmの枠組みで線形回帰やった場合とlmで線形回帰やった場合で結果は同じになるのに、何故glmではわざわざ応答変数の正規性を仮定しないとダメなのっ質問でしょう、質問者の言いたいことは。 -- 通りすがり? 2014-08-22 (金) 23:42:23
  • glm の場合には,色々な応答変数があり,そのなかで「正規分布の場合はこんな風にやるよ」,「二値変数の場合はこんな風にやるよ」...というだけです。 -- 河童の屁は,河童にあらず,屁である。? 2014-08-23 (土) 11:59:33

Rの顔認識パッケージ

(2014-08-12 (火) 00:36:35)

大量の画像について、顔認識して顔の特徴分析をしようと思っています。
画像から顔の認識をして、目鼻口眉輪郭などの特徴量を計算するパッケージはありますでしょうか。
どうぞよろしくお願いします。

  • RcppでopenCVを呼び出せばできると思います。但し具体的なコードの書き方はここの優秀な方々にお任せします。すみません。。 -- 2014-08-18 (月) 20:53:56
  • プログラム書く能力低いなら、コマンドラインで実行できるプログラムを作って(参考になるページはやまほどあるから) -- 最近機械学習について興味をもちだしたもの? 2014-08-26 (火) 14:01:33
  • それをバッチファイル、あるいはシェルプログラムで画像に適用して、データをはきださせて、そのデータをRに取りこんで処理するのが良いと思う。 -- 最近機械学習について興味をもちだしたもの?? 2014-08-26 (火) 14:02:54

fftw3のインストール

まさし? (2014-08-08 (金) 09:45:40)

R言語でのfftw3のインストール方法を教えていただけないでしょうか?私もいくら調べても発見することができませんでした。よろしければインストール方法を教えていただければ幸いです。

  • 「R言語にlibfftwをインストールする」のではなく、まさし(たけし?)さんがお使いのパソコン(のOS)にインストールするのです。libfftwのインストール自体はRとは直接関係ありません。というか無関係です。これは、共有ライブラリをOSにインストールするというごく一般的なパソコンの基本操作の話で、Rの話ではないです。まさしさんはOSを明記していらっしゃいませんが、LinuxやMacOSXなら下記の通りです。
    Linux (Ubuntu/Debian)の場合
    $ sudo apt-get install libfftw3-dev
    MacOSX (MacPorts?)の場合
    $ sudo port install fftw-3
    Windowsの場合は公式サイトにあるWindows Installation Notesを参考にされてはいかがでしょうか。私はWindowsユーザではないし、Windowsが手元にないので確認できませんが、Windows7 64bitの共有ライブラリ(*.dll)のコピー先をざっと検索してみたところ、ここに書いてあるように、あり得ないくらいトリッキーな仕様みたいです。これは、はまっちゃう人が続出しても仕方がない。Windowsユーザの常識かも知れないが、吃驚しました。 -- 2014-08-08 (金) 10:08:12
  • OSにlibfftw と libfftw3-dev をインストールできたら Rを起動して install.packages(c("fftw","fftwtools")) でfftwとfftwtoolsパッケージをインストールできるよ。 (ネット接続してから実行) -- 最近機械学習について興味をもちだしたもの? 2014-08-26 (火) 14:08:25
  • OSにlibfftw と libfftw3-dev をインストールできたら Rを起動して install.packages(c("fftw","fftwtools")) でfftwとfftwtoolsパッケージをインストールできるよ。 (ネット接続してから実行) -- 最近機械学習について興味をもちだしたもの? 2014-08-26 (火) 15:11:18
  • OSにlibfftw と libfftw3-dev をインストールできたら Rを起動して install.packages(c("fftw","fftwtools")) でfftwとfftwtoolsパッケージをインストールできるよ。 (ネット接続してから実行) -- 最近機械学習について興味をもちだしたもの? 2014-08-26 (火) 15:11:29

biOpsのimgFFT()関数を用いた画像のフーリエ変換

たけし? (2014-08-07 (木) 10:14:22)

R言語にあるbiOps内のimgFFT()関数を用いて、あるパッケージRImageBook?内のhouses.pngをフーリエ変換しようと試みたのですが、以下のエラーが発生します

houses <-readImage(system.file("images/houses.png", package="RImageBook?"))
housesb <- E2b(houses)
housesbfft <- imgFFT(housesb)
str(housesbfft)
以下にエラー imgFFT(housesb) : Sorry, fftw not available
str(housesbfft)
以下にエラー str(housesbfft) : オブジェクト 'housesbfft' がありません

このエラーからimgFFT()関数での処理で失敗していると判断しました
以下imgFFT()関数の処理内容です

function (imgdata, shift = TRUE)
{
if (!FALSE)
  stop("Sorry, fftw not available")
imgmatrix <- array(imgdata)
depth <- if (attr(imgdata, "type") == "grey")
  1
  else dim(imgdata)[3]
width <- dim(imgdata)[2]
height <- dim(imgdata)[1]
res <- .C("fft_image", image = as.complex(imgmatrix), width = as.integer(width),
height = as.integer(height), depth = as.integer(depth),
PACKAGE = "biOps")
imgdim <- c(height, width, if (depth == 3) depth else NULL)
img <- array(res$image, dim = imgdim)
if (shift)
  imgFFTShift(img)
else img
}
environment: namespace:biOps>
OS
Windows7 64bit
R インストールパッケージ:R 2.15.3
ImageMagick
インストールパッケージ:ImageMagick-6.7.6-9-Q16-windows-dll.exe
GTK2
インストールパッケージ:gtk2-runtime-2.16.6-2010-05-12-ash.exe
EBImage
インストールパッケージ:EBImage 3.12.0.zip
RImageBook
インストールパッケージ:バージョン 3.0.1 の R の下で造られたもの
参考にした本
Rで学ぶデータサイエンス デジタル画像処理 共立出版

助言お願いいたします

  • 「Sorry, fftw not available」ということは、libfftw3が見つからないという意味だと思いますが、libfftw3が本当に(所定の位置に)インストールされているのか確認するのが先です。imgFFT()の先頭にあるif (!FALSE)は常に真で、これによりimgFFT()の処理がその場で直ちに停止するようになっていますが、これはlibfftwの存在をチェックしてimgFFT()の定義に書き込む仕組みがあるのだと想像します。Rパッケージが外部ライブラリに依存している場合は、その外部ライブラリを別途インストールする必要があります(外部ライブラリを同梱しているケースもありますが)。なお、biOpsパッケージのヘルプには「Fast Fourier Transform methods and filters also available if fftw3 installed.」と書かれています。これは、libfftw3がインストールされていなければFourier変換の関数を使えないという意味です。-- 2014-08-07 (木) 10:15:48
  • ご意見ありがとうございます。回答を基にlibfftwをインストールしようと試みたのですがいくら調べてもR言語にlibfftwをインストールする方法を発見することができませんでした。よろしければlibfftwのインストールの方法を教えていただけないでしょうか? -- たけし? 2014-08-08 (金) 01:16:13

重積分を含む関数を最大化するパラメータの推定方法について

ishi03? (2014-08-05 (火) 11:07:31)

R初心者のishi03と申します。
この質問の背景をご説明致します。
私は,理系出身ではありますが,これまで解析的なことを全く行ったことが無いのですが,以下のような関数を最大にするパラメータk1,k2を求める必要に迫られています。
関数は,

f(k1,k2)=-N*(ln(4*pi)-N*(ln(d(k1,k2)))+k1*a+k2*b
d(k1,k2)=( (4*pi)^(-1))*∫[0→2*pi]∫[0→pi]{sin[θ]*exp( (sin[θ]^2)*(k1*(cos[φ])^2+k2*(sin[φ])^2))}dθdφ
k1≦k2≦0,N,a,bは事前に与えられている定数

で定義されています。
k1,k2を求める上で,関数f(k1,k2)を最大にする必要があるので,Rのoptim関数を使用するのだろうと考え,以下に示すようなコードを記述してみたのですが,

Nelder-Mead direct search function minimizer
以下にエラー optim(par = initial, fn = f, control = list(fnscale = -1, trace = TRUE)) : 
cannot coerce type 'closure' to vector of type 'double'

との結果が返って参ります。
どうにか,こちらのk1,k2を算出することはできませんでしょうか。お教えいただけますと幸いです~。 以下に記述しましたコードを示します。

# 事前に定義される定数(仮で設定)
n <- 10
τmin <- 10
τint <- 5

# d(k1, k2)を関数で定義
library(cubature)
d <- function(x, k1, k2)
{sin(x[1]) * exp(((k1 *(cos(x[2]))^2 + k2 * (sin(x[2]))^2) * (sin(x[1]))^2)}
d_int <- adaptIntegrate(c, c(0, 0), c(pi, 2 * pi))

# f(k1, k2)を関数で定義
# k1,k2 の条件を逸した場合は異常値を返すようにしてみました。(←良い方法があればお教え頂きたいです。))
f <- function(par) {
k1 <- par[1]
k2 <- par[2]
if (k1 > k2 || k2 > 0) {return(-20000)}
return(function(par) {
k1 <- par[1]
k2 <- par[2]
N <- n
a <- τmin
b <- τint
-N * log(4 * pi) - n * log(d_int) + k1 * a + k2 * b})}

# 最大化する k1,k2 の算出
initial <- c(0, 0)
opt <- optim(par=initial, fn=f, control=list(fnscale=-1, trace=TRUE))

なお,使用環境はR version 3.1.1 (2014-07-10),win7の64bitになります。
大変申し訳ありませんが,宜しくお願い申し上げます。

  • プログラム的におかしな所がいくつかあるので,書き換えてみた。数式に余分な括弧があると,かえって見にくい( (sin(x[1]))^2 など)。少なくとも,adaptIntegrate は f 関数内で計算しないと意味がない。また,f の return では,関数定義を返すことになってしまっている??結果として「正しく」書き換えられたかどうかは私には分からないが,一応,動くことは動くようになった。 -- 河童の屁は,河童にあらず,屁である。? 2014-08-05 (火) 14:35:06
    # 事前に定義される定数(仮で設定)
    n <- 10
    τmin <- 10
    τint <- 5
    
    # d(k1, k2)を関数で定義
    library(cubature)
    d <- function(x, k1, k2)
    # {sin(x[1]) * exp(((k1 *(cos(x[2]))^2 + k2 * (sin(x[2]))^2) * (sin(x[1]))^2)}
      {sin(x[1]) * exp((k1 * cos(x[2])^2 + k2 * sin(x[2])^2) * sin(x[1])^2)}
    # d_int <- adaptIntegrate(c, c(0, 0), c(pi, 2 * pi))
    
    # f(k1, k2)を関数で定義
    # k1,k2 の条件を逸した場合は異常値を返すようにしてみました。(←良い方法があればお教え頂きたいです。))
    f <- function(par) {
    k1 <- par[1]
    k2 <- par[2]
    if (k1 > k2 || k2 > 0) {return(-20000)}
    # return(function(par) {
    # k1 <- par[1]
    # k2 <- par[2]
    N <- n
    a <- τmin
    b <- τint
    d_int <- adaptIntegrate(d, c(0, 0), c(pi, 2 * pi), k1=k1, k2=k2)$integral
    -N * log(4 * pi) - n * log(d_int) + k1 * a + k2 * b
    # })
    }
    
    # 最大化する k1,k2 の算出
    initial <- c(-0.3, -0.2)
    opt <- optim(par=initial, fn=f, control=list(fnscale=-1, trace=FALSE, maxit=10000))
    opt
  • 修正箇所は#で表記頂きましたおかげで大変分かり易く理解できました。関数の定義方法についても,今後また勉強したいと思います。有難うございます。 -- ishi03? 2014-08-05 (火) 21:57:14

パッケージ内の関数の中身を見ることができない

kamo? (2014-07-31 (木) 12:34:11)

RHmmというパッケージにHMMFitという関数があり、その中身は

HMMFit

と入力すると見ることができるのですが、HMMFitの中にはBaumWelch?という関数が使われており、その中身を見ようとすると、

> BaumWelch
Error: object 'BaumWelch' not found

となってしまい、関数が見つかりません。BaumWelch?の中身を見る方法はありますでしょうか。もしくは作者のほうでパッケージ内の関数の中身を見えないようにする設定ができ、今回それに該当しているのでしょうか。
Google検索で似たようなケースがないか調べてみましたが、見つかりませんでした。ご教授よろしくお願いします。

  • S3ならR-FAQ-3.10.jp.pdfの7.26(45ページ)を見て下さい. パッケージ名と:::(コロン3個)関数名で見れます. S4の場合は showMethods("メソッド名", class="クラス名", includeDefs=TRUE)とかで見ます. ついでに言えばソースパッケージをダウンロードして解凍すれば全部見られます. CRANではソースを隠匿することを禁じられています. -- なかま 2014-07-31 (木) 13:03:29
  • install.packages("fortunes"); library(fortunes); fortune(250) # 冗談です -- なかま 2014-07-31 (木) 13:22:51
  • ありがとうございます。 -- kamo? 2014-07-31 (木) 14:22:43
  • ソースを活用して効率的に進められそうです。メソッド、クラスなどもあまり理解できていませんので、もう少し勉強します。 -- kamo? 2014-07-31 (木) 14:25:59

文字列ベクトルの各要素の長さを統一する

名無し? (2014-07-30 (水) 20:20:49)

c("123","abcd","xy") という文字列ベクトルに対して各要素の長さを5に統一し、不足部分は"*"で穴埋めしたいです。
処理後の文字列ベクトル c("**123","*abcd","***xy") formatCやsprintfについて調べて見ましたが、数値ベクトルのゼロサプレスはみつかるものの、文字列ベクトルのケースは見つかりませんでした。
ご教示お願いいたします。

  • 文字列の長さが5より長かったらどうしたいですか?
    まあ,それはどうでもよいし,それはあなたが決めればよいか....
    取りあえずは
    > x <- c("123","abcd","xy")
    > sapply(x, function(z) paste(substr("*****", 1, 5-nchar(z)), z, sep=""))
        123    abcd      xy 
    "**123" "*abcd" "***xy" 
    > x <- c("", "1", "12", "123", "1234", "12345", "123456", "123456789")
    > sapply(x, function(z) paste(substr("*****", 1, 5-nchar(z)), z, sep=""))
                          1          12         123        1234       12345       123456   123456789  
        "*****"     "****1"     "***12"     "**123"     "*1234"     "12345"     "123456" "123456789" 
    どうですかね? -- 河童の屁は,河童にあらず,屁である。? 2014-07-30 (水) 22:00:02
  • ありがとうございます。文字列の長さが5を超える場合はそのまま出力しようと思っています。後だしですみません。sapplyと自作関数の組み合わせは思いつきませんでした。ありがとうございました。 -- 名無し? 2014-07-30 (水) 22:37:30
  • 文字列の途中に空白がないならベタな方法もあります -- 2014-07-30 (水) 22:40:00
    > x <- c("123","abcd","xy","55555555")
    > gsub(' ','*',sprintf("%5s",x))
    [1] "**123"    "*abcd"    "***xy"    "55555555"

Rstudio ServerでのmailRパッケージ使用について

saka? (2014-07-30 (水) 18:52:04)

Rstudio Server(CentOS, R version 3.0.2)を使い、mailRパッケージでメール送信をしたいと思っています。
以下のようなスクリプトで(メールアドレス等はダミー)、デスクトップのRstudio(win, Version 0.98.953, R version 2.15.1)だと実行できるのですが、Rstudio Serverだとエラーになります。
考えられる理由や解決法が分かれば、ご教授お願いできませんでしょうか。よろしくお願いします。

 send.mail(from = "sender@gmail.com",
           to = c("recipient1@gmail.com", "recipient2@gmail.com"),
           subject = "Subject of the email",
           body = "Body of the email",
           smtp = list(host.name = "smtp.gmail.com", port = 465,
                       user.name = "gmail_username", passwd = "password",
                       ssl = TRUE),
           authenticate = TRUE,
           send = TRUE)

Rstudio Serverでのエラー表示

 org.apache.commons.mail.EmailException: Sending the email to the
 following server failed : smtp.gmail.com:465
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1410)
    at org.apache.commons.mail.Email.send(Email.java:1437)
    at java.lang.reflect.Method.invoke(libgcj.so.10)
    at RJavaTools.invokeMethod(RJavaTools.java:386)
 Caused by: javax.mail.MessagingException: IOException while sending
 message;
   nested exception is:
   javax.activation.UnsupportedDataTypeException: no object DCH for
   MIME type text/plain; charset=ISO-8859-1
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1182)
    at javax.mail.Transport.send0(Transport.java:254)
    at javax.mail.Transport.send(Transport.java:124)
    at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1400)
    ...3 more
 Caused by: javax.activation.UnsupportedDataTypeException: no object DCH
 for MIME type text/plain; charset=ISO-8859-1
    at javax.activation.ObjectDataContentHandler.writeTo(libgcj.so.10)
    at javax.activation.DataHandler.writeTo(libgcj.so.10)
    at javax.mail.internet.MimeBodyPart.writeTo(MimeBodyPart.java:1593)
    at javax.mail.internet.MimeMessage.writeTo(MimeMessage.java:1839)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1134)
    ...6 more
 NULL
 Error: EmailException (Java): Sending the email to the following server
        failed : smtp.gmail.com:465
  • Rstudio Server は*全く*無関係ですね, CentOS上のJavaのruntimeの問題です. 今お使いのGCJのJAVAでは多くの物が動かないでしょう. お好みのOpenJDKのruntimeをCentOSに入れて, JAVAの設定は"alternative centos java" なんかでググって下さい. -- なかま 2014-07-31 (木) 10:32:47
  • 御助言ありがとうございました。アドバイスの通り調べてみます。板違い失礼しました。 -- saka? 2014-07-31 (木) 12:10:28

rApache環境下のJavaライブラリ使用について

清水? (2014-07-28 (月) 23:01:43)

CentOSサーバ上でrApache環境を構築して、RプログラムをWeb環境で動作させています。
同環境下で、Apache POIライブラリ使用によるExcelファイル作成の必要性があったため、CRANのrJavaライブラリを使用しなければなりません。
そのままではrJavaライブラリをローディングできないので、http://www.r-bloggers.com/making-rapache-load-rjava/にあるように、rApache_rJava.confファイルを作成して、libjvm.soへのパスを通すことにより、library(rJava)によるライブラリのローディングが可能になりました。
しかし実際にライブラリを使用するためには.jinit()を発行する必要があり、これを記述したRページにアクセスした瞬間「このページは表示できません」となり、hs_err_pid#####.logに膨大なログが吐かれます。
Rソースは単純に以下のような内容で、環境変数の不足を疑って追加しても全く変化がありません。

library(rJava)
.jinit()

1000行近くあるログの先頭は以下のような内容です。

# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (malloc) failed to allocate 2555904 bytes for committing reserved memory.
# Possible reasons:
#   The system is out of physical RAM or swap space
#   In 32 bit mode, the process size limit was hit
# Possible solutions:
#   Reduce memory load on the system
#   Increase physical memory or swap space
#   Check if swap backing store is full
#   Use 64 bit Java on a 64 bit OS
#   Decrease Java heap size (-Xmx/-Xms)
#   Decrease number of Java threads
#   Decrease Java thread stack sizes (-Xss)
#   Set larger code cache with -XX:ReservedCodeCacheSize=
# This output file may be truncated or incomplete.
#
#  Out of Memory Error (os_linux.cpp:2726), pid=13829, tid=140457446467552
#
# JRE version:  (7.0_51-b13) (build )~
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.51-b03 mixed mode linux-amd64 compressed oops)
# Failed to write core dump. Core dumps have been disabled. To enable core dumping,
# try "ulimit -c  unlimited" before starting Java again
---------------  T H R E A D  ---------------
Current thread (0x00007fbecf6e1000):  JavaThread "Unknown thread" [_thread_in_vm, id=13829, 
stack(0x00007fff9ed8f000,0x00007fff9ee8f000)] 
Stack: [0x00007fff9ed8f000,0x00007fff9ee8f000],  sp=0x00007fff9ee88fd0,  free space=999k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0x992f4a]  VMError::report_and_die()+0x2ea
V  [libjvm.so+0x4931ab]  report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x9b
V  [libjvm.so+0x81338e]  os::Linux::commit_memory_impl(char*, unsigned long, bool)+0xfe
V  [libjvm.so+0x81383f]  os::Linux::commit_memory_impl(char*, unsigned long, unsigned long, bool)+0x4f
V  [libjvm.so+0x813a2c]  os::pd_commit_memory(char*, unsigned long, unsigned long, bool)+0xc
V  [libjvm.so+0x80daea]  os::commit_memory(char*, unsigned long, unsigned long, bool)+0x2a
V  [libjvm.so+0x98e849]  VirtualSpace::expand_by(unsigned long, bool)+0x1c9
V  [libjvm.so+0x98e9cd]  VirtualSpace::initialize(ReservedSpace, unsigned long)+0xcd
V  [libjvm.so+0x58a8e3]  CodeHeap::reserve(unsigned long, unsigned long, unsigned long)+0x143
V  [libjvm.so+0x420cf0]  CodeCache::initialize()+0x80
V  [libjvm.so+0x5a9605]  init_globals()+0x45
V  [libjvm.so+0x94ef8d]  Threads::create_vm(JavaVMInitArgs*, bool*)+0x1ed
V  [libjvm.so+0x6307e4]  JNI_CreateJavaVM+0x74
---------------  P R O C E S S  ---------------

"Unknown thread"が赤表示になっていてこれが原因と思われますが、対処法が全く不明です。
原因と対処法についてご教授願います。

  • とりあえず, SELinuxを無効にして再起動してみたらどうなりましたか?. -- なかま 2014-07-29 (火) 18:12:17
  • なかまさん回答ありがとうございます。SELinuxをpermissiveにすると動くようになりました。しかし、どのようなポリシーに反するのかが/var/log/audit/audit.logに吐かれないので、SELinuxを有効にしたままで動作させるための設定ができません。これについてお分かりであるか、情報元があれば教えてください。 -- 清水? 2014-07-30 (水) 11:03:20
  • では, 再度有効にしてログを見ればわかるのでは? -- なかま 2014-07-30 (水) 12:45:57
  • なぜかブラウザを再読み込みしたら同じ投稿されてしまいました。SELinuxの有効/無効に関わらず/var/log/audit/audit.logには何も吐かれませんし、ここ最近何回もエラーを出しいるのにこのログファイルのタイムスタンプは変化していません。 -- 清水? 2014-07-30 (水) 13:16:37
  • 原因が分からずに自己解決しました。ログが出ない理由はauditdデーモンが動いていないからと分かり動作させると、ログには何も吐かれずに正常動作しました。その状態から元の状態(SELinux有効でauditdデーモンが動いていない)に戻しても正常動作したため、結局原因不明です。しかしSELinux関連であることは確からしいのでなかまさんありがとうございます。 -- 清水? 2014-07-30 (水) 13:56:31

Not runとは

macy? (2014-07-27 (日) 18:00:29)

パッケージのマニュアル等を見ると、実行文の例文のところに

# Not runという文字をよく見かけます。
このNot runはどういう意味でしょうか?

例文なので、実行するなという意味ではないような気がしたもので。
常識的なことかと思うのですが、教えて下さい。

Examples
 ## Not run:
 # 略
 ## End(Not run)
  • Writing R Extensionsのexamplesをご覧ください. そのままでは実行できない(例えばデーターベースやネットワーク関係は環境によって異なるので, 他には長時間かかるような処理)場合などで, examplesや R CMD checkの時に実行して欲しくない例題を囲みます. これらを翻訳したマニュアル上では 上記のように Not runで囲われます. -- なかま 2014-07-27 (日) 22:02:32
  • 理解しました。なかまさん、ありがとうございます。 -- macy? 2014-07-27 (日) 22:13:08

文字ベクトルの各要素の長さを調べたい

初心者(R10日目)? (2014-07-27 (日) 16:18:06)

以下のような文字ベクトルvがあるときに各要素の長さを取得する方法があれば教えてください。
v <- c("a","xyz","pq","")

各要素の長さとはc(1,3,2,0)を指します。

  • sapply(v, nchar) さらに,名前をはぎ取りたいなら unname(sapply(v, nchar)) -- 河童の屁は,河童にあらず,屁である。? 2014-07-27 (日) 16:38:08
  • ありがとうございました -- 初心者(R10日目)? 2014-07-27 (日) 22:42:48

時間帯にまとめた時系列グラフを描きたい

しまだ? (2014-07-23 (水) 15:16:29)

ある水辺で飛来してくる水鳥をカウントし、データフレーム(data)に入れました。
中身は以下のとおり,indsは水鳥の個体数、my_time2は観測時刻です。

   inds            my_time2
1    22 2013-03-13 08:00:00
2     6 2013-03-13 08:00:00
3     6 2013-03-13 08:16:00
4    13 2013-03-13 08:28:00
5     4 2013-03-13 08:32:00
6     2 2013-03-13 11:37:00
7     2 2013-03-13 11:45:00
8     3 2013-03-13 11:56:00
9     3 2013-03-13 12:05:00
10    3 2013-03-13 12:24:00
11    2 2013-03-13 15:47:00
12    2 2013-03-13 15:49:00
(以下、略)

ここから(たとえば30分毎、あるいは1時間毎に個体数をまとめた)時系列グラフを作成する方法が分かりません。。。。histは時刻も使えるようですが・・・

  • 以下のようなのがベースになるかも。30分ごとにしたければ 3600 を 1800 にするが如し。 -- 河童の屁は,河童にあらず,屁である。? 2014-07-23 (水) 18:33:56
    x <- as.integer(data$my_time2) %/% 3600
    num <- c(by(data$inds, x, sum))
    time <- names(num) <- as.POSIXct(as.integer(names(num)) * 3600,
                                     origin = "1960-01-01")
    num
    time
    plot(time, num, type = "b")
  • ありがとうございました。当初POSIXctとPOSIXltの区別がつかず、さらにbyの使い方も初めて知りました。大変勉強になりました。 -- しまだ? 2014-07-24 (木) 17:58:53

条件判断が上手くいきません

のびたき? (2014-07-17 (木) 18:43:24)

初めまして、お世話になります。
以下のような条件判断で失敗しています。

> a <- matrix(c(0.3, 0.15, 0.35, 0), ncol = 2, nrow = 2)
> sum(a) == 0.8

右辺も左辺もどちらも0.8なのでTRUEになるはずと期待しているのですが、FALSEが出力されます。
どのように直せばいいのかご教示ください。よろしくお願いいたします。

  • Rでは通常,数値を浮動小数点として数値を扱います.
    > a <- matrix(c(0.3,0.15,0.35,0),ncol=2,nrow=2)
    > # 格納された16進表記
    > sprintf("%A",sum(a))
    [1] "0X1.9999999999999P-1"
    > sprintf("%A",0.8)
    [1] "0X1.999999999999AP-1"
    > options(digits=22) # もうちょっと人間向けに
    > sum(a)
    [1] 0.7999999999999999333866
    > 0.8
    [1] 0.8000000000000000444089
    これはFAQとしてR-FAQの7.31にあります. たとえば
    > TRUE == all.equal(sum(a), 0.8)
    [1] TRUE
    などとすると良いでしょう -- なかま 2014-07-17 (木) 22:01:40
  • なるほど、よくわかりました。ありがとうございました。 -- のびたき? 2014-07-18 (金) 10:41:22

CPU数・コア数と計算速度について

LOL? (2014-07-10 (木) 09:51:51)

お世話になります。

数百万回for文を繰り返すような解析を行う必要が生じたため、WindowsからLinuxサーバー上で解析をすることになりました。
CPU数が2倍、コア数が4倍になるので大体8倍ぐらいの計算速度になるのかと予想したのですが、実際は2倍程度にしかなりませんでした。
とてもがっかりしたのですが、こういうものなんでしょうか?

  • foreach %dopar%を使えば、速くなるかも?forだと、マルチコアで計算してくれません。 -- まあくん? 2014-07-10 (木) 12:48:46
  • Rにはマルチコア用の関数というものが存在しているのでしょうか。foreachのヘルプファイルを見てみましたが、単にforをforeachに変更するだけでは機能しそうに無いですね・・・。multicoreをインストールすれば自動的にマルチコアで計算してくれるのでしょうか。 -- LOL? 2014-07-10 (木) 13:27:59
  • http://cran.r-project.org/web/packages/doParallel/ -- まあくん? 2014-07-10 (木) 14:36:43
  • 情報ありがとうございます。私のプログラムではfor文が入れ子になっていること、複数のデータフレームに計算過程を代入していたり、複数のif文で処理を分岐させていることなどから、foreachに書き換えることは難しそうです。ループ範囲を8分割し、Rを8個立ち上げて処理させたほうが簡単かと思いました。 -- LOL? 2014-07-10 (木) 15:09:58
  • 推測ですが, 最初の「実際は2倍程度」早くなったのはCPU本体のキャッシュのサイズが増えたとか、行列演算があればLinuxでATLAS等の最適化BLAS(Windowsは標準ではRefBLAS)が使われたために効率があがったのではないでしょうか. 最後のコメントの「ループ範囲を8分割し」と言うのは分割出来ると言う意味ですから, 標準で入っているパッケージ parallelのmulticore関数(mclapplyなど)を使えば効率よく並列化出きると思います. そもそもforをお使いのご様子なので, applyやifelseなどのベクトル関数の適用を検討されればそれだけで10倍程度(もちろんケースバイケース)は早くなる可能性があります. 並列化の検討と言うのは一番最後にするのが良いでしょう. -- なかま 2014-07-11 (金) 01:39:23
  • 手前味噌ですが、私の「Rプログラミングマニュアル(改訂第二版)」にはRの推奨パッケージ parallel を用いた並列処理を特に一章を設けて解説しています。バイトコンパイル(これにも一章)も検討の余地があるかもしれません。中間さんがおっしゃるようにそれ以前の工夫が必要な気がしますが。 -- 間瀬? 2014-07-11 (金) 08:15:23
  • >中間様
    もともとC言語でプログラミングの勉強を始めたせいか、for文やif文を多用する癖があります。2〜3行程度のfor文をapplyにすることは可能なのですが、for文の行数が200行ほどあるうえにif文も組み込まれているので、applyやifelseで表現できずに悩んでいます。
    >間瀬様
    ぜひ拝見させて頂きます。for文とforeachの出力があまりにも異なるので、ネットの情報ではいまいち使い方がイメージできませんでした。 -- LOL? 2014-07-11 (金) 09:58:39
  • 「Rプログラミングマニュアル」ですが、現在改定前版と改定後版が混在しているようなのでご注意ください。Amazonの頁は写真がきゅうはんのままで、一見値段(しかも間違い?)以外は変更が無いように見えます。Amazonに修正を依頼しましたが、何故か駄目と言われました(?!)。パッケージパラレルには自動的に並列処理を実行してくれる関数が有ります。コア数の指定が必要ですが、既定では少な目に設定されてしまいます。 -- 間瀬? 2014-07-13 (日) 08:27:28

linuxでのパッケージのインストール

SS? (2014-07-02 (水) 09:26:06)

linux(CentOS)を使用しています。
パッケージをインストールする際に、インストールするディレクトリを指定したいのですが、どのようにすればよいのでしょうか。

また、間違ったフォルダにインストールしたとして、単にmvでパッケージを移動するだけではダメなのでしょうか。

どなたかご回答宜しくお願いします。

  • linux に特殊事情があるのかも知れないけど,普通は install.packages 関数の lib 引数(character vector giving the library directories where to install the packages)じゃないの?
    > 間違ったフォルダにインストールしたとして、単にmvでパッケージを移動するだけではダメなのでしょうか。
    ダメかどうか,やってみればわかるのでは? -- 2014-07-02 (水) 11:38:54
  • mvではダメでした。install.packagesに引数があるのですね。確認してみます。 -- SS? 2014-07-02 (水) 14:59:24
  • 追記です。mvでパッケージを移動した後にlibry()の引数lib.locにディレクトリを指定したら正常に読み込めました。ありがとうございました。 -- SS? 2014-07-02 (水) 15:54:27
  • mvするのは最終手段だと思います。通常は、.libPaths()で既存のインストール先を確認して、install.packages("hoge", lib = .libPaths()[3])などとします。ルート権限が必要なインストール先なら、$ sudo RでRを起動してから、パッケージをインストールします。全く新規のインストール先なら、あらかじめmkdirでディレクトリを作成しておいてから、install.packages("hoge", lib="インストール先")にします。 -- 2014-07-03 (木) 11:35:02

Williams検定のP値について

HY? (2014-07-01 (火) 14:12:39)

過去の質問(未解決)にもありましたが、Rを使ってWilliams検定のP値を正確に出せません。
multcomp パッケージでの Williams 検定について

RでP値まで求めたいのですが、P値を計算できた方いらっしゃいますか?
以下は検証したデータです。

入力データ
bpdown <- data.frame(
  medicine=factor(rep(1:4, each=10)),
  sbpchange=c(153, 153, 152, 156, 158, 151, 151, 150, 148, 157,
              158, 152, 152, 152, 151, 151, 157, 147, 155, 146,
              153, 146, 138, 152, 140, 146, 156, 142, 147, 153,
              137, 139, 141, 141, 143, 133, 147, 144, 151, 156))
#SimCompを使う方法
library(SimComp)
SimTestDiff(data=bpdown, grp="medicine", resp="sbpchange",
            type="Williams", base=1, covar.equal=T)

#[結果]
#  comparison  endpoint margin estimate statistic p.value.raw p.value.adj
#1        C 1 sbpchange      0   -9.700    -4.180      0.0002      0.0003
#2        C 2 sbpchange      0   -7.650    -3.806      0.0005      0.0008
#3        C 3 sbpchange      0   -5.367    -2.832      0.0075      0.0142

#multcompを使う方法
res1 <- aov(sbpchange ~ medicine, data=bpdown)
library(multcomp)
res2 <- glht(res1, linfct = mcp(medicine = "Williams"))
summary(res2)

#[結果]
#Linear Hypotheses:
#         Estimate Std. Error t value Pr(>|t|)    
#C 1 == 0   -9.700      2.321  -4.180  < 0.001 ***
#C 2 == 0   -7.650      2.010  -3.806  0.00111 ** 
#C 3 == 0   -5.367      1.895  -2.832  0.01410 *  

SASを使える方にお願いしてP値を計算していただいた場合、「毒性・薬効データの統計解析」のP64と同じ計算結果になります。

[SAS計算結果]
OBS        t          wp        wtc   
 1     -0.34471    0.63384    1.68830        
 2     -1.37884    0.95606    1.76560        
 3     -2.31242    0.99785    1.79073        

また、以下の青木先生のソースコードでt値は計算できましたが、得られたt値をpmvt関数にセットしても、やはり求めたいP値は計算できず...
ウィリアムズの方法による平均値の多重比較

一個飛びに0を入れるには、どうすれば良いですか?

のざわ? (2014-07-01 (火) 11:35:21)

お世話になります。
たとえば以下を

   1,2,3,4,5

こんな風にしたい

   1,0,2,0,3,0,4,0,5,0

あるいは

   1,0,0,2,0,0,3,0,0,4,0,0,5,0,0

と0を2個(あるいは複数)
これをforやwhileなどループを使わずに作る方法はありませんか?

  • あるよ。 -- 河童の屁は,河童にあらず,屁である。? 2014-07-01 (火) 11:39:12
    x <- 1:5
    c(rbind(x, numeric(length(x))))
    c(rbind(x, numeric(length(x)), numeric(length(x))))
    とか
    c(rbind(x, matrix(0, 1, length(x))))
    c(rbind(x, matrix(0, 2, length(x))))
    c(rbind(x, matrix(0, 10, length(x))))

R version3.1.0でのrandomForest関数があるパッケージ名

pararel? (2014-06-19 (木) 21:50:04)

Warning in install.packages :
  package ‘randomForest’ is not available (for R version 3.1.0)

install.packages("randomForest")を実行すると上記の表示がされます。
R version 3.1.0でのrandomforest関数のパッケージ名を教えていただきたいと思います。

何卒よろしくお願い申し上げます。

  • randomForest ですが... Windows でも Mac でも問題なくできますけどね。あなたの OS はそもそも,何? -- 河童の屁は,河童にあらず,屁である。? 2014-06-20 (金) 09:58:57
  • .Rprofile などに生存してない options(repos="http://essrc.hyogo-u.ac.jp/cran/") を書いてあるもしくはミラーの選択で生きてないミラーを選んだ、あるいはRからのネットワーク接続がウィルス対策ソフトにブロックされてる、最悪ネットにつながってなかったなど、ネットワーク経由でインストールする場合失敗するとたいていこのメッセージを得ます. ブラウザでファイルだけ手動で取ってきて手動でインストールするとインストール出来ませんか? -- なかま 2014-06-20 (金) 11:11:12
  • ネットワークの再起動をしたらインストール出来ました。
    どうやらDNSでの名前解決の問題だったようです。お騒がせしてしまい申し訳ありません。お二方とも御丁寧な御指導をいただきまして誠にありがとうございます。追記:ちなみにOSはLINUXです。 -- paralel? 2014-06-20 (金) 16:43:52

txt ファイルからNetCDF ファイル

ロビン? (2014-06-08 (日) 14:01:41)

txt ファイルからNetCDF ファイルに変換したいのですが,Rを用いてできるでしょうか?

  • できるかできないかという二元論で言えば、RNetCDFパッケージを使って変換できます。ただし、それぞれの変数を定義したりかなりの作業量になります。RNetCDF(NetCDF データベース R インターフェース)パッケージ中のオブジェクト一覧?も参照 -- 2014-06-20 (金) 11:12:49

sem のsummaryが例示と違う

SK? (2014-06-07 (土) 13:48:25)

はじめまして。semをまず動かしてみようと
http://www.okada.jp.org/RWiki/?R%A4%C7%B6%A6%CA%AC%BB%B6%B9%BD%C2%A4%CA%AC%C0%CF%A1%A6%B9%BD%C2%A4%CA%FD%C4%F8%BC%B0%A5%E2%A5%C7%A5%EB#j12acd36
の「潜在変数を仮定するモデル 」をそのまま実行させました。
およそ同じような結果になるのですが、summaryで表示される項目が全く異なります。
Goodness-of-fit indexやRMSEA index など、例示されているものがごっそり抜けています。
また、結果の最後のInterationが17ではなく15になります。
なにか設定とかが足りないでしょうか。
以下が結果です。

> ans <- sem(model, cor(dat), 10)
> summary(ans)

 Model Chisquare =  1.925355   Df =  5 Pr(>Chisq) = 0.8593742
 AIC =  21.92536
 BIC =  -9.58757

 Normalized Residuals
      Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
-0.3976000 -0.0000002  0.0155300  0.1221000  0.2435000  0.6971000 

 R-square for Endogenous Variables
    v1     v2     v3     v4     v5 
0.6297 0.0809 0.4573 0.0583 0.0506 

 Parameter Estimates
        Estimate Std Error    z value   Pr(>|z|)             
path1  0.7935558 0.4882341  1.6253592 0.10408604 v1 <--- F1
path2 -0.2843858 0.3849962 -0.7386717 0.46010637 v2 <--- F1
path3 -0.6762525 0.4525192 -1.4944171 0.13506663 v3 <--- F1
path4 -0.2414672 0.3860898 -0.6254172 0.53169727 v4 <--- F1
path5  0.2248359 0.3864879  0.5817413 0.56074096 v5 <--- F1
s1     0.3702693 0.6626860  0.5587401 0.57633909 v1 <--> v1
s2     0.9191248 0.4485423  2.0491376 0.04044867 v2 <--> v2
s3     0.5426826 0.5322169  1.0196644 0.30788765 v3 <--> v3
s4     0.9416935 0.4546109  2.0714275 0.03831887 v4 <--> v4
s5     0.9494489 0.4567576  2.0786712 0.03764758 v5 <--> v5

 Iterations =  15 

利用環境Windows7Pro64bit R i386 3.1.0

> sessionInfo() 
R version 3.1.0 (2014-04-10)
Platform: i386-w64-mingw32/i386 (32-bit)

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

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

other attached packages:
[1] sem_3.1-4   car_2.0-20  Rcmdr_2.0-4

loaded via a namespace (and not attached):
[1] MASS_7.3-31      matrixcalc_1.0-3 nnet_7.3-8       tcltk_3.1.0      tcltk2_1.2-10   
[6] tools_3.1.0
  • プログラムが変わったからから,結果もいろいろ変わったのでしょう(デバグされたり,エンバグされたり,速度・計算精度が改善されたり改悪されたり)。そのつど,最新のオンラインヘルプも参照すべきでしょう。
    sem の summary で呼ばれるのは summary.msemObjectiveML になります。
    ? summary.msemObjectiveML を読めば分かりますが,以下のようにすればよいでしょう。 fit.indices で,必要なものだけを指定することができます。 summary(ans, fit.indices=c("GFI", "AGFI", "RMSEA", "NFI", "NNFI", "CFI", "RNI", "IFI", "SRMR", "AIC", "AICc", "BIC", "CAIC")) -- 河童の屁は,河童にあらず,屁である。? 2014-06-07 (土) 15:27:33
  • さっそくに教えていただきありがとうございます!できました。結果も変わるんですねぇ。ヘルプも見るようにしてみます。 -- SK? 2014-06-08 (日) 10:28:52

フィッシャーの判別分析について

K? (2014-06-02 (月) 16:32:32)

お世話になります。フィッシャーの判別分析を行うためMASSパッケージのldaを使用しています。以下のように1変数で判別式を求めるという処理をしているのですが、ldaが出力する判別クラスと、係数と定数項をldaから回収して作成した判別式による判別クラスが一致しません。


library(MASS)
dat <- data.frame(value=c(9.43,9.43,9.47,9.50,9.60,9.62,9.62,
       9.65,9.66,9.69,9.72,9.72,9.72,9.75,9.78,9.78,9.78,9.81),
       class=c(rep("A",5),rep("B",13)))
z <- lda(class~., dat)
dat <- cbind(dat, predict(z, dat)$class)
colnames(dat)[ncol(dat)] <- "pred"

datは以下のようになります。classは真のクラス、predはldaの判別クラスです。

   value class pred
1   9.43     A    A
2   9.43     A    A
3   9.47     A    A
4   9.50     A    A
5   9.60     A    B
6   9.62     B    B
7   9.62     B    B
8   9.65     B    B
9   9.66     B    B
10  9.69     B    B
11  9.72     B    B
12  9.72     B    B
13  9.72     B    B
14  9.75     B    B
15  9.78     B    B
16  9.78     B    B
17  9.78     B    B
18  9.81     B    B

ここで、変数をxとしたときの判別式は以下のように計算されるそうです。

#係数の算出
coeff <- z$scaling
#定数項の算出
const <- apply(z$means %*% z$scaling, 2, mean)


0 = coeff*x - const
x = const/coeff = 146.5764/15.26728 = "9.600692"


この結果から、"9.600692"を判別面としてpredのクラスが決められているはずなのですが、5番目のpredがAではなくBになっており、ldaの判別クラスと一致しません。なぜこのような不一致が生じるのでしょうか?

特定のパッケージのことで回答しづらいと思いますが、何でも構いませんのでご助言宜しくお願いします。

なお、係数や定数項の求め方は以下の書籍やホームページの記載によりました。
http://www.morikita.co.jp/books/book/536
http://homepage2.nifty.com/nandemoarchive/GLM/tahenryou_03_discrim.htm
http://entertainment-lab.blogspot.jp/2012/12/r.html

環境はWin 7, R 3.0.2, MASS 7.3-29です。

  • > "9.600692"を判別面としてpredのクラスが決められているはず
    というのが何を意味しているのか私には分かりませんが,事前確率を考慮したベイズ確率による判別を行っていますので,単純に係数と定数項から計算される判別値だけで所属判定をしているのではありません。debug(predict) としたあと,predict(z) とし,途中の計算結果を表示させながら計算過程を辿ると宜しいでしょう。
    以下に概略を示しておきますが,z$x ではなく,z$posterior で判別しているのです。 -- 河童の屁は,河童にあらず,屁である。? 2014-06-02 (月) 17:52:30
    > library(MASS)
    > dat <- data.frame(value=c(9.43,9.43,9.47,9.50,9.60,9.62,9.62,
             9.65,9.66,9.69,9.72,9.72,9.72,9.75,9.78,9.78,9.78,9.81),
             class=c(rep("A",5),rep("B",13)))
    > z <- lda(class~., dat)
    
    ここからデバッグ
    
    > debug(predict)
    > predict(z)
    debugging in: predict(z)
    debug: UseMethod("predict")
    
    ng = 2
    
    dm
             LD1
    A -2.5292791
    B  0.9727997
    
    prior
            A         B 
    0.2777778 0.7222222 
    
    x
       value
    1   9.43
    2   9.43
    3   9.47
    4   9.50
    5   9.60
    略
    
    dist <- matrix(0.5 * rowSums(dm^2) - log(prior), nrow(x), length(prior), 
       byrow = TRUE) - x[, 1L:dimen, drop = FALSE] %*% t(dm)
    
               A          B
    1  -4.080144  4.0907860
    2  -4.080144  4.0907860
    3  -2.535536  3.4967058
    4  -1.377080  3.0511458
    5   2.484441  1.5659455
    略
    
    dist <- exp(-(dist - apply(dist, 1L, min, na.rm = TRUE)))
    
                  A            B
    1  1.000000e+00 0.0002827549
    2  1.000000e+00 0.0002827549
    3  1.000000e+00 0.0024001077
    4  1.000000e+00 0.0119356523
    5  3.991190e-01 1.0000000000
    略
    
    posterior <- dist/drop(dist %*% rep(1, ng))
    
                  A           B
    1  9.997173e-01 0.000282675
    2  9.997173e-01 0.000282675
    3  9.976056e-01 0.002394361
    4  9.882051e-01 0.011794873
    5  2.852645e-01 0.714735492
    略
    
    cl <- factor(nm[max.col(posterior)], levels = object$lev)
    
     [1] A A A A B B B B B B B B B B B B B B
    
    exiting from: predict(z)
    
    $class
     [1] A A A A B B B B B B B B B B B B B B
    Levels: A B
    
    $posterior
                  A           B
    1  9.997173e-01 0.000282675
    2  9.997173e-01 0.000282675
    3  9.976056e-01 0.002394361
    4  9.882051e-01 0.011794873
    5  2.852645e-01 0.714735492
    略
    
    $x
               LD1
    1  -3.38424667
    2  -3.38424667
    3  -2.77355554
    4  -2.31553720
    5  -0.78880937
    略
  • ご回答ありがとうございます。事前確率を指定した場合と指定しなかった場合では、判別結果は異なりますが、係数や定数項はまったく同一でした。ご指摘のように、単に判別式で判別しているのではなく、事前確率というものを評価に組み込んでいるようです。上記の参考書やサイトは最終的な判別に使用されていない不正確な判別式を図示しているのですね。危ないところでした。ところで、事前確率というものを大学でほとんど学ばなかったのですが、「手元のデータセットではクラスAとBは50%ずつ存在する。しかし、真の母集団はクラスAが10%、クラスBが90%である」という場合に、真の母集団と手元のデータセットでは分散や郡内平均値が異なるために、判別式の係数や定数項を補正したうえで判別しているという解釈でよいのでしょうか? -- K? 2014-06-02 (月) 19:13:07
  • 事前確率を考慮するか(どのような事前確率を採用するのか),距離(判別値)だけで判別するのか,事後確率を求めて判別するかということで,複数個の解があるのです。そのどれを採用するかによるわけです。その前に,二次の判別関数を使うのか線形なのかというのもあるし,ロジスティック判別なんてのもあるし。
    なお,「判別式の係数や定数項を補正」しているわけではないので誤解のないように。debug(predict) で何をやって,結果がどうなっていくのかをトレースするべし。
    なお,ついでにいっておけば,MASS の ldr は 2 群判別の場合も正準判別分析の計算式で行っておりますけど(当然,2群の場合は,両者の判別関数値は比例関係にあるので,同じ結果になります)。このあたり,説明するのは面倒くさいのですよね。だからということでもないけど,たいていの場合に,説明は通り一遍。 -- 河童の屁は,河童にあらず,屁である。? 2014-06-02 (月) 19:32:49
  • 事前確率に関する計算をする箇所は特定できても、どのような計算をしているのかは相当な知識が無いと理解できなさそうですね。少し勉強してみます。 -- K? 2014-06-02 (月) 19:56:35

biOpsのインストールについて

ay? (2014-05-29 (木) 15:39:32)

MacのOS X Mavericks‎でRを使用しています。

画像処理を行うため、biOpsが必要になったのですが、ターミナルで
install.packages("biOps", repos="http://cran.md.tsukuba.ac.jp/", type="source")
を入力したところ以下のようなメッセージが表示されました
sudo port install ImageMagick?
 ♥ チョキチョキ,チョッキンと切り取り

警告メッセージ: 
In install.packages("biOps", repos = "http://cran.md.tsukuba.ac.jp/",  :
パッケージ ‘biOps’ のインストールは、ゼロでない終了値をもちました 

また、biOpsのサイト(http://cran.r-project.org/web/packages/biOps/index.html)へ行ってみると
OS X Mavericks binaries: r-release: not available
と書かれていました。MavericksでのbiOpsの使用は不可能なのでしょうか?
ご存知の方いらっしゃいましたらよろしくお願いします。

  • ご存じも何も,"OS X Mavericks binaries: r-release: not available" なんだから,使用不可です。というか,Mac 用のリポジトリにもないし。 -- 河童の屁は,河童にあらず,屁である。? 2014-05-29 (木) 16:06:25
  • わかりました。早急な回答ありがとうございます。 -- ay? 2014-05-29 (木) 16:38:32
  • 私もMarvericksを使っています。また同じくMacPorts?ユーザです。確かにCRANにはbiOpsのバイナリを置いていませんが、インストールできますし、問題なく使えます。「使用不可」というのは間違いです。type="source"を付けてパッケージをコンパイルしている人に対して、バイナリがないから「使用不可」と断言するのは適切ではないと思います -- S? 2014-05-30 (金) 13:30:55
    $ sw_vers
    ProductName:	Mac OS X
    ProductVersion:	10.9.3
    BuildVersion:	13D65
    MacPorts?でbiOpsパッケージに必要なPortを事前に入れておいてから、Rの中からbiOpsパッケージをインストールします。
    > install.packages("biOps", repos="http://cran.md.tsukuba.ac.jp/",
       type="source", configure.vars = 'LDFLAGS=-L/opt/local/lib')
    URL 'http://cran.md.tsukuba.ac.jp/src/contrib/biOps_0.2.2.tar.gz'
       を試しています
    [snip]
    * DONE (biOps)
    [snip]
    正常にインストールされれば、biOps.soは次のようになっています。
    $ otool -L /Library/Frameworks/R.framework/Versions/3.1/
        Resources/library/biOps/libs/biOps.so
    /Library/Frameworks/R.framework/Versions/3.1/Resources/
        library/biOps/libs/biOps.so:
    	biOps.so (compatibility version 0.0.0,
              current version 0.0.0)
    	/opt/local/lib/libtiff.5.dylib (compatibility version 8.0.0,
              current version 8.0.0)
    	/opt/local/lib/libjpeg.9.dylib (compatibility version 11.0.0,
              current version 11.0.0)
    	/opt/local/lib/libfftw3.3.dylib (compatibility version 8.0.0,
              current version 8.4.0)
    	/Library/Frameworks/R.framework/Versions/3.1/Resources/
              lib/libR.dylib (compatibility version 3.1.0,
              current version 3.1.0)
    	/System/Library/Frameworks/CoreFoundation.framework/
              Versions/A/CoreFoundation (compatibility version 150.0.0,
              current version 855.16.0)
    	/usr/lib/libSystem.B.dylib (compatibility version 1.0.0,
              current version 1197.1.1)
    もし、libtiff.5.dylibが表示されなければ、正常にインストールできたように見えても、正常にコンパイルできていないためにreadTiff()は使えません。libjpeg.9.dylibやlibfftw3.3.dylibも同様です。なお、MacPorts?ユーザは、外部ライブラリに依存するパッケージのインストールでいちいちCFLAGS, CPPFLAGS, CXXFLAGSを指定せずにすむように、/Library/Frameworks/R.framework/Resources/etc/Makeconfを書き換えておくと便利です。
    $ diff /Library/Frameworks/R.framework/
          Resources/etc/Makeconf{.orig,}
    18c18
    < CFLAGS = -Wall -mtune=core2 -g -O2 $(LTO)
    ---
    > CFLAGS = -Wall -mtune=core2 -g -O2 $(LTO) -I/opt/local/include
    20c20
    < CPPFLAGS = -I/usr/local/include -I/usr/local/include/freetype2
       -I/opt/X11/include
    ---
    > CPPFLAGS = -I/usr/local/include -I/usr/local/include/freetype2
       -I/opt/X11/include -I/opt/local/include
    23c23
    < CXXFLAGS = -Wall -mtune=core2 -g -O2 $(LTO)
    ---
    > CXXFLAGS = -Wall -mtune=core2 -g -O2 $(LTO)
       -I/opt/local/include
    69c69
    < LDFLAGS = -L/usr/local/lib
    ---
    > LDFLAGS = -L/usr/local/lib -L/opt/local/lib
  • 回答ありがとうございます。早速試してみます! -- ay? 2014-05-30 (金) 20:05:22
  • ぎゃふん。
    作者(メインテイナー)がバイナリを用意できない(用意しない)ということは,何らかの理由があると思い,使用できないと書きました。
    作者も Mavericks でコンパイルできなかったのだとすれば,「こういう風にすればコンパイルできるよ」と教えてあげると,世界中の biOps 使用希望者が喜ぶと思います。 -- 河童の屁は,河童にあらず,屁である。? 2014-05-31 (土) 03:59:37
  • CRANパッケージ登録処理の事情を説明すると、メンテナが手元のMavericksマシンでコンパイルできても、CRAN側のマシンでコンパイルできないとバイナリの配布はできません。外部ライブラリを使うパッケージのメンテナにとって、それが悩みで、他のUNIX系のOSとは異なり、外部ライブラリのインストール形態が多様なMacOSXの場合は、全てのケースに対応することができないために、バイナリ配布を諦める結末になることが多いです。外部ライブラリのソースをパッケージのソースに同梱して解決を図る人もいます(ただし、同梱した外部ライブラリをコンパイルする際に、さらに別の外部ライブラリに依存するなど再帰的で複雑な関係がある場合は解決しません)。今回のbiOpsパッケージのケースでは、依存するlibtiff, libjpeg, libfftw3は既にシステムにインストールしている可能性が高い汎用的な外部ライブラリであるため、また、biOpsパッケージインストール時にそれらの外部ライブラリが必ずコンパイルに成功するのように工夫や検討をしなければならないため、同梱をためらったと推測できます。 -- S? 2014-05-31 (土) 12:31:02

行列の列への掛け算について

mao? (2014-05-29 (木) 11:33:02)

お世話になります。以下のような行列の列1,2,3にcofの1,2,3番目の要素をそれぞれ掛け算したいと考えています。

matrix(1:9,3,3)
cof <- 2:4

このとき、どのような処理をすればよいでしょうか。*や%*%を使ってみましたが、期待の結果が得られません。
宜しくお願いします。

  • 質問が曖昧ですが,* を使ってうまくいかなかったということは,以下のようなことをしたいのかな? -- 河童の屁は,河童にあらず,屁である。? 2014-05-29 (木) 11:51:16
    >  x <- matrix(1:9,3,3)
    >  cof <- 2:4
    >  t(t(x)*cof)
         [,1] [,2] [,3]
    [1,]    2   12   28
    [2,]    4   15   32
    [3,]    6   18   36
  • ありがとうございました。転値して転値するのですか。意外な処理です。 -- mao? 2014-05-29 (木) 12:01:21
  • > 意外な処理です。
    意外でもなんでもない,定石中の定石です。
    質問が曖昧だと言ったのは,あなたがやりたいことは「行列の各行ベクトルに cof を掛ける」ということです。普通に x*cof としたときの結果をよく見れば,「行列の各列ベクトルに cof が掛けられている」ことがわかるでしょう。だったら,x を転置してから cof を掛ければ,元の x の行ベクトルに cof を掛けることになる。そして,結果をもう一度転置すれば元の行列と同じになるということ。正確に問題を捉えれば,解決法は自ずと分かるという例。 -- 河童の屁は,河童にあらず,屁である。? 2014-05-29 (木) 12:44:02
  • 確かにそうなりますね。for文で列ごとに処理するよりだいぶ早くなりました。 -- mao? 2014-05-29 (木) 13:12:24
  • cofをmatrix(rep(2:4, 3), 3, byrow=TRUE)としておけば、x*cofでOKです。 -- 2014-05-29 (木) 18:00:29

Rstudioが起動できない

永野? (2014-05-26 (月) 19:11:52)

Windows8でRstudioをインストールした後、実行しようとしたところ、「Fatal error:ERROR system error 5(アクセスが拒否されました)…」なるメッセージが表示され、起動することができませんでした。
どなたか対処方法をご存じの方がいらっしゃいましたら、ご指南のほどよろしくお願いいたします。

  • ご質問から随分時間が経ってしまったので解決済みかもしれませんね。私も同じ現象で困っております。一応、アイコンを右クリックし「管理者として実行(A)」で起動できます。これから設定を調べてみるつもりです。 -- xx?? 2014-08-06 (水) 08:59:39

データフレームから特定の列を抜く

paul? (2014-05-17 (土) 21:31:42)

お世話になります。

あるデータフレームの列を除こうとしています。
抜こうとしている列は数値で、その全値を足しこんだ総和が”0”のときの列を抜くようにデータフレームを再定義しようとしたときに、どうもうまくその列を抜けていません。以下のように実施しています。

Base01 <- Base00[, (colSums(Base00[,14:50]) != 0)]

colSumsで見たと結果で0となっている列が排除されていないようでした。
スマートな方法はありますでしょうか。
ちなみに、行を対象にした特定の行排除には以下のように実施して、期待通りの結果となりました。

Base01 <- subset(Base01, rowSums(Base00[,14:50]) != 0)
  • あのね。あなたがやったことがはっきりわからないのよ。だから,なんで,あなたがやったことが旨くいかなかったのかもわからないのよ。あなたが遭遇したエラーが再現できる最小限のデータとそのプログラムを提示すれば,解決策は明らかになるでしょう。というか,そのような準備をしている過程で,あなた自身で解決方が見つかるということもあるでしょう。
    まあ,それでも分からないと言うことなら,以下のようにすれば,あなたの思うような結果が得られることはわかるでしょうか????わからないか.... -- 河童の屁は,河童にあらず,屁である。? 2014-05-17 (土) 21:54:00
    > Base00 <- data.frame(a=1:5, b=-2:2, c=rnorm(5))
    > Base00
      a  b          c
    1 1 -2  2.3755710
    2 2 -1 -1.5356930
    3 3  0  0.3075105
    4 4  1 -2.2391591
    5 5  2 -0.8341275
    > Base01 <- Base00[, colSums(Base00[,1:3]) != 0]
    > Base01
      a          c
    1 1  2.3755710
    2 2 -1.5356930
    3 3  0.3075105
    4 4 -2.2391591
    5 5 -0.8341275
  • 原因がわかりました。やりかたは間違っておりませんでした。DFの中でcolSumsのみの場合、数値で正しく計算されているようですが、上記のように判定する項として組み入れる場合、元のDFの中に数値意外の列が(1:13のところで)まざっていたため、抜き出しのところで不都合が生じていたようです。 -- paul? 2014-05-17 (土) 23:26:32

カテゴリカルな多変量解析

? (2014-05-06 (火) 12:26:35)

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

質問項目のデータを用いて主成分分析を適用したかったのですが、順序尺度(6件法)であることも考慮してカテゴリカルな主成分分析を行いたいと考えました。
SPSSでは「カテゴリカル主成分分析」という分析方法が使えると伺ったのですが、現在持ちあわせておりません。

そこでR、できればRコマンダーで分析できれば、と考えたのですが手順がいまいち分かりませんでした。Rコマンダーのデフォルトでは相関行列を使うか・分散共分散行列を使うかの選択しかなかったため、項目が不等分散であったことも考慮して、まずはスピアマンの相関行列を作成しました。

この相関行列に主成分分析を適用したいと考えたのですが、Rコマンダーでそのようなことは可能でしょうか。できないようでしたら、Rでの解決方法もご指導いただけましたら幸いに存じます。

また、このような方法はカテゴリカルな主成分分析と言えるのでしょうか…

的外れな質問でしたら、大変申し訳ございません。
どうぞよろしくお願い申し上げます。

  • SPSS で言うカテゴリカル主成分分析は,最適尺度法のことであり,それは,対応分析(コレスポンデンスアナリシス)とか,数量化III類とか,双対尺度法とか,と本質的に同じもの。あなたのやろうとしているものとは違います。
    相関係数行列から主成分分析を行うには,相関係数行列を生み出す多次元正規分に従うデータ行列を MASS パッケージの mvrnorm で作ればよいだけのことですから。また,スピアマンの順位相関係数行列でもよいかも知れないけど,ポリコリック相関係数も検討するとよいかも。 -- 河童の屁は,河童にあらず,屁である。? 2014-05-06 (火) 21:00:21

scan関数の挙動について

dengaku? (2014-05-06 (火) 01:25:02)

お世話になります。

windows7で32bit版のR3.1.0を使用しております。

R3.1.0でscan関数に以下のような処理を行わせると、半角文字を処理する場合と、全角文字を処理する場合では、
出力結果が異なることに気がつきました。

どうも、区切り文字で区切る全角文字が1文字の場合、改行コードが加えられ、区切り文字で正しく要素毎に
分割されない場合があるようです。

scan(text = "a,b,c", what="character", sep=",")
Read 3 items
[1] "a" "b" "c"

scan(text = "ab,cd,e", what="character", sep=",")
Read 3 items
[1] "ab" "cd" "e"  

scan(text = "あ,い,う", what="character", sep=",")
Read 1 item
[1] "あ,い,う\n"

scan(text = "あい,うえ,お", what="character", sep=",")
Read 3 items
[1] "あい" "うえ" "お\n"

scan(text = "あい,うえ,おか", what="character", sep=",")
Read 3 items
[1] "あい" "うえ" "おか"

R3.0.3以前では、上記のような全角文字を対象とした場合でも、半角文字の処理結果と同じように、改行コードが
加えられることなく、下記のように区切り文字で正しく区切られた結果が出力されておりました。

x <- scan(text="あ,い,う",what="character",sep=",")
Read 3 items
x
[1] "あ" "い" "う"

もし、私と同様の結果が再現されるようでしたら、教えていただきたいのですが、
全角文字を対象とした場合のR3.1.0のscan関数の出力結果は、正しい出力結果なのでしょうか。
それとも、バグなのでしょうか。
何卒、よろしくお願い致します。

  • Win8 64bitのR3.1.0で上記のバグっぽい現象が再現しました。MacOSX 10.8.5のR3.0.2だと改行コードが付与されるバグっぽい挙動はなかったです。 -- 通りすがりの仮面ライダー? 2014-05-08 (木) 11:13:54
  • Win7 64bitのR3.1.0でも再現。こちらの方法なら逃げられますね -- 2014-05-09 (金) 06:44:59
     > strsplit("a,b,c ",",")
     [1] "a"  "b"  "c "
     > strsplit("あ,い,う",",")
     [1] "あ" "い" "う"
     > strsplit("あい,うえ,お",",")
     [1] "あい" "うえ" "お"
  • どうせなら,完璧に。unlist(strsplit("あい,うえ,お",",")) でしょ -- 河童の屁は,河童にあらず,屁である。? 2014-05-10 (土) 19:54:13
  • コメント、本当にありがとうございます。恐らくバグであると思いますが、unlist関数、strsplit関数 を利用して同じことができることがわかりました。 -- dengaku? 2014-05-11 (日) 17:27:44

エラー 解釈

まる? (2014-04-30 (水) 09:32:08)

お世話になっております。
Rでエラーが出て、計算ができません。
IRTの段階反応モデル(grm)を行った際に、以下のエラーが出ました。

以下にエラー log.pr[xj, ] : 添え字が許される範囲外です

これは何を意味するエラーなのでしょうか。

ご教授願います。

  • 文字通り,「添え字が許される範囲外」です。具体的には,log.pr の行数より xj が大きい。例えば,
    > (a <- matrix(1:12, 3)); a[5,]
         [,1] [,2] [,3] [,4]
    [1,]    1    4    7   10
    [2,]    2    5    8   11
    [3,]    3    6    9   12
     以下にエラー a[5, ] :  添え字が許される範囲外です 
    a は3行4列なのに,5行目を参照しようとした。ということ。 -- 河童の屁は,河童にあらず,屁である。? 2014-04-30 (水) 09:46:56
  • ご教授ありがとうございます。大変勉強になりました。初歩的なことで申し訳ありません。また、解決策としては何が考えられるのでしょうか。以前同様の形式のデータセットではうまくいったのですが。解決策等、何かご存知でしたらよろしくお願い申し上げます。 -- まる? 2014-04-30 (水) 21:42:33
  • > 解決策としては何が考えられるのでしょうか
    あなたのデータか,あなたの使い方が間違っているのでしょう。
    あなたが使ったデータとプログラムを提示しない限り,解決策など提示できないでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-04-30 (水) 21:45:01

文字列の結合について

しよう? (2014-04-24 (木) 16:53:07)

a1, a2, a3....a10という変数があり、この中に文字列が格納されています。

a1 <- c("AAA","BBB")
a2 <- c("CCC","DDD")
a3 <- c("EEE","FFF")
a4 <- c("GGG","HHH")
a5 <- c("III","JJJ")
a6 <- c("KKK","LLL")
a7 <- c("MMM","NNN")
a8 <- c("OOO","PPP")
a9 <- c("QQQ","RRR")
a10 <- c("SSS","TTT")

このとき、a1〜a10をすべて結合したいのですが、

c(a1,a2,a3,a4,a5,a6,a7,a8,a9,a10)

と入力するのは醜いです。何かよい方法は無いでしょうか。
宜しくお願いします。

  • 「醜い」って言っても,そもそもあなたが文字列を10個の変数に分けて入れたのだから,それらを引用するには10個の変数名を使うしかないでしょう。10個ならまだよい方で,もし1000000個の変数なら,どうします。変数に文字列を代入する代入式を1000000回書くわけはないでしょう。「代入式は必要回数書くのでc(a1, a2, ..., an)の部分だけでも効率的に書きたい」ということなら話は別なんですけどね。まあ,代入のあと,以下に示すようにすれば,変数名を全て書かなくてもよくはなります。しかし,これでも,十分「みっともないプログラム」でしょう?
    ans <- NULL
    for (i in 1:10) {
    	eval(parse(text=paste("ans <- c(ans, a", i, ")", sep="")))
    }
    ans
    いずれにしても,少なくとも,データを変数にではなく,リストや配列として用意すれば,まだましです。なぜ,そんな風に,変数を使わなければならなくなったのかをよく考えてみてください。
    「データ構造+アルゴリズム=プログラム」なのです。この質問のすぐ下にある「長さの異なるベクトルをcbindで結合する」も同じ問題をかかえている質問ですよ。あなたの場合は,作業が簡単で c だけですむということ。下の問題だと,関数を引用するときに結局 Cbind(a1, a2, a3, ..., a100000) のように,変数名を列挙するしかないのです。だから,データの格納方法を再考する余地はないのか?と逆質問しているのです。 -- 河童の屁は,河童にあらず,屁である。? 2014-04-24 (木) 17:36:58
  • まだお返事がないので,その間に。
    もし,同じようなデータ(例えば,文字列が*1*行*に*収められている)が,ファイル名の形式が一定の規則(たとえば "a[0-9]+\.dat")に従って作られているなら,R で処理する前にコンソールで cp a*.R > files みたいに 1 つのファイルにして,それを R で読み込んで処理するなんてふうにすれば,簡単この上ないということなんですけどねえ。R しかわからないということなら,かえって,大変かな。 -- 河童の屁は,河童にあらず,屁である。? 2014-04-24 (木) 21:54:09
  • ファイルは一行の文字列で複数のフォルダに保存されています。名称にある程度の規則性はありますが、いくつか例外があるのでR上で順番を入れ替えるという処理をしています。確かにリストを使ってリストの要素に各文字列を格納しておけば楽そうですね。ちょっとやってみます。 -- しよう? 2014-04-25 (金) 08:55:02
  • できました!最後にunlist()すれば簡単に結合できますね。listは[[]]が多くていまいち使い方がわかっていませんでしたが、今後は活用したいと思います。ありがとうございました。 -- しよう? 2014-04-25 (金) 09:31:20

長さの異なるベクトルをcbindで結合する

J? (2014-04-23 (水) 09:48:29)

お世話になります。Win7, R3.0.2を使用しています。
以下のように長さの異なるベクトルa,bをcbindすると、同じ長さになるようにベクトルaの要素が繰り返されます。

a <- c(1, 2, 3)
b <- c(4, 5, 6, 7, 8)
cbind(a, b)

ここで、繰り返されるaの要素を0またはNAにしたいのですが、何かよい方法は無いでしょうか。実際のデータでは10個ほどの長さの異なるベクトルをcbindしようとしているので、それに対応できるような方法を探しています。
お手数ですが、ご教示宜しくお願いします。

  • 「実際のデータでは10個ほどの長さの異なるベクトル」ということは,不定個数ということですか。しかし,10個ものベクトルを個々の変数として扱おうというのですか?あなたの特定の状況に対応するうまいやり方があると思いますけどね。
    取りあえず,以下のような関数を作れば,あなたの要求は満たせると思いますが。(ようするに,プログラムを書けば何でもできる) -- 河童の屁は,河童にあらず,屁である。? 2014-04-23 (水) 10:54:13
    Cbind <- function(...) {
    	x <- list(...)
    	len <- max(sapply(x, length))
    	sapply(x, function(y) c(y, rep(NA, len - length(y))))
    }
    実行例
    > Cbind(1:3, 20:24, 40:41)
         [,1] [,2] [,3]
    [1,]    1   20   40
    [2,]    2   21   41
    [3,]    3   22   NA
    [4,]   NA   23   NA
    [5,]   NA   24   NA
    > Cbind(c(2, 3, 1, 5), c(4, 3, 6), c(9, 4, 2, 5, 3, 1), c(7, 6))
         [,1] [,2] [,3] [,4]
    [1,]    2    4    9    7
    [2,]    3    3    4    6
    [3,]    1    6    2   NA
    [4,]    5   NA    5   NA
    [5,]   NA   NA    3   NA
    [6,]   NA   NA    1   NA
  • ご回答ありがとうございました。ベクトル数は今後データを追加していくので増えていく予定です。ご提示いただいた関数でカラムが結合される理由がちょっとわからないので、分析させてください。 -- J? 2014-04-23 (水) 14:04:15
  • こんなのもあり。 -- Null? 2014-04-24 (木) 11:32:12
    > a1 <- 1:2; a2 <- 1:3; a3 <- 1:4
    > maxl <- max(length(a1),length(a2),length(a3)); maxl
    [1] 4
    > length(a1) <- maxl; length(a2) <- maxl; length(a3) <- maxl; 
    > A <- cbind(a1,a2,a3); A
         a1 a2 a3
    [1,]  1  1  1
    [2,]  2  2  2
    [3,] NA  3  3
    [4,] NA NA  4
    > A[is.na(A)] <- 0; A
         a1 a2 a3
    [1,]  1  1  1
    [2,]  2  2  2
    [3,]  0  3  3
    [4,]  0  0  4
  • 繰り返しはプログラムに書くのではなくコンピュータにやらせる -- 河童の屁は,河童にあらず,屁である。? 2014-04-24 (木) 13:54:41
    Cbind2 <- function(...) {
    	x <- list(...)
    	len <- max(sapply(x, length))
    	sapply(x, function(y) {length(y) <- len; y})
    }

> adf.test(○○) 以下にエラー NCOL(x) : オブジェクト '○○' がありません  と出てしまいます

クマ? (2014-04-23 (水) 00:13:16)

MacでR version 3.1.0を使っておりまして、CSVで「○○」という時系列データを読み込みました。

> dat <- read.csv("FCsuii.csv", na.strings="*")

複数の変数がありますが、読み込みは成功しておりました。 そのあと変数のうちの一つ「kaiinsuu」を分析するためにパッケージ tseries_0.10-32をインストールして

> adf.test(kaiinsuu)

を入力したところ

以下にエラー NCOL(x) : オブジェクト 'kaiinsuu' がありません

と出ました。
CSVデータは読み込めているが変数を関数で処理できない状態になっています・・・いったい、どんな作業が足りていないんでしょうか?ご教示いただければ幸いです。
よろしくおねがいいたします。

  • dat はデータフレームなので,kaiinsuu を使いたいのなら dat$kaiinsuu としなきゃだめなのでは?(投稿法を確認してね。めちゃくちゃになっていたよ) -- 河童の屁は,河童にあらず,屁である。? 2014-04-23 (水) 08:29:01
  • ありがとうございます!dat$kaiinsuuで解決いたしました。また、投稿不備失礼しました。引き続きよろしくおねがいいたします。 -- クマ? 2014-04-23 (水) 11:03:15
  • with()を使う方法もあります -- 2014-04-23 (水) 12:14:07
    > with(dat, adf.test(kaiinsuu))
  • ありがとうございます!勉強になります。引き続きよろしくおねがいします! -- クマ? 2014-04-24 (木) 02:19:31

R3.0以降で*.rファイル内に大きなベクトルを記述すると実行に時間がかかる

H? (2014-04-14 (月) 18:58:53)

お世話になります。Windows 7上でRを使用しております。

R 2.15からR 3.1へのアップグレードをすると、一部のプログラム(*.rファイル)の実行が極端に遅くなってしまうことに気がつきました。R 2.15では1秒未満でしたが、R 3.1では10秒以上を要します。

遅くなってしまうのはこのようなこのようなプログラム(*.rファイル)です。少し大きめの数値ベクトルを定義し、そのベクトルの要素数をprint()するだけのプログラムです。

ベクトル部分を別ファイルに書き出しておいて、scan()すれば1秒程度で実行できます。ただ、できれば1ファイルのままの方が管理しやすいので、1ファイルのままで高速化する方法にお心当たりがございましたら、ご教示いただけないでしょうか。

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

なお、この現象はWindows 7 32bitと64bitの2つのPCで再現することを確認しました。。RGuiのR Consoleへのドラッグ&ドロップ(sourceコマンド)で、実行・テストしています。

  • keep.source=FALSE にすればよいのではないでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2014-04-14 (月) 19:17:15
  • お見立て通りでした。options(keep.source=FALSE)を1度実行しますと、それ以降は2.15と同等の実行速度となりました。大部悩んでいたのですが、お教えいただいたオプションで魔法のように直りました。まことにありがとうございました。 -- H? 2014-04-14 (月) 19:39:10

Ubuntuでのパッケージ・インストールエラー

nnet? (2014-04-12 (土) 18:21:11)

Ubuntu 12.04 LTSで、
R version 3.1.0 (2014-04-10)を使用しています。
パッケージRSNNSをインストールしようとして、以下のように入力しました。

install.packages("RSNNS")

すると、次のようなメッセージが出て、インストールできません。

kr_io.cpp: メンバ関数 ‘krui_err SnnsCLib::krio_writeSiteDefinitions()’ 内:
kr_io.cpp:930:25: エラー: 書式が文字列リテラルでは無く、かつ書式引数ではありません
[-Werror=format-security]
(中略)
cc1plus: some warnings being treated as errors
make: *** [kr_io.o] エラー 1
ERROR: compilation failed for package ‘RSNNS’

コンパイルに失敗しているようですが、対処方法がわからず苦慮しています。
どなたか、対策をお教えいただければ幸いです。

  • 3.0.3の時はどうでしたか?今、Ubuntuが手元にないのですが、MacOSX Mavericks + R 3.0.3だと、確かにkr_io.cppの930行ほかに警告がでますが、エラーはなく最終的にコンパイルできています。 -- 2014-04-12 (土) 19:43:44
  • 実は、私はWinddows XP難民で、最近ubuntuに避難してきたばかりの者です。 XPのときは、3.03下で問題なくRSNNSを使用していました。 (もっとも、コンパイル済みのバイナリ・パッケージを使っていたわけですが。) -- nnet? 2014-04-12 (土) 20:26:03
  • Mac OS X 10.9.2 ビルド 13C64,R version 3.1.0 beta (2014-03-29 r65337) -- "Spring Dance" では,インストールできました。 -- 2014-04-12 (土) 23:10:23
    > install.packages("RSNNS", type="source")
     URL 'http://cran.md.tsukuba.ac.jp/src/contrib/RSNNS_0.4-4.tar.gz' を試しています 
    [snip]
    kr_io.cpp: In member function ‘krui_err SnnsCLib::krio_writeSiteDefinitions()’:
    kr_io.cpp:930: warning: format not a string literal and no format arguments
    [snip]
     installing to /Library/Frameworks/R.framework/Versions/3.0/Resources/library/RSNNS/libs
    ** R
    ** data
    ** demo
    ** inst
    ** preparing package for lazy loading
    ** help
    *** installing help indices
    ** building package indices
    ** installing vignettes
    ** testing if installed package can be loaded
    sh: rm: command not found
    * DONE (RSNNS)
    sh: rm: command not found
    [snip]
  • ご返信ありがとうございます。 ご示唆の通り、 install.packages("RSNNS", type="source") としてみましたが、同じくエラーとなってインストールできませんでした。 -- nnet? 2014-04-12 (土) 23:42:02
  • UbuntuなどUnix系(MacOSXを除く)では、install.packagesのtypeの既定値はsourceなので、省略しても、指定しても同じです。RSNNS resultsにある通り、Linux環境で正常にコンパイルが通ることを確認してリリースされているので、コンパイルが出来ないのは理解できません。念のための確認ですが、依存パッケージは事前に入れてますよね?「methods, Rcpp (≥ 0.8.5)」と書いてありますが。 -- 2014-04-12 (土) 23:52:40
  • 下記のとおり、依存パッケージはどちらもインストール済みです。 -- nnet? 2014-04-13 (日) 09:42:25
    > library() 
    ... 
    Rcpp                    Seamless R and C++ Integration 
    ... 
    methods                 Formal Methods and Classes
  • こちらではインストールできています。 -- 2014-04-14 (月) 09:55:48
    $ lsb_release -dc
    Description:	Ubuntu 13.10
    Codename:	saucy
    $ R --version | head -1
    R version 3.1.0 beta (2014-03-28 r65330) -- "Spring Dance"
    nnetさんとはUbuntuのバージョンが違いますがRSNNSをインストールできています。
    > packageVersion("Rcpp")
    [1] ‘0.11.0’
    > install.packages("RSNNS", .libPaths()[2], "http://cran.md.tsukuba.ac.jp")
     URL 'http://cran.md.tsukuba.ac.jp/src/contrib/RSNNS_0.4-4.tar.gz' を試しています 
    [snip]
    kr_io.cpp: In member function ‘krui_err  SnnsCLib::krio_writeSiteDefinitions()’:
    kr_io.cpp:930:25: warning: format not a string literal and no format arguments [-Wformat-security]
     sprintf( buf, fmt_hdr1 );
    [snip]
    installing to /usr/lib/R/site-library/RSNNS/libs
    ** R
    ** data
    ** demo
    ** inst
    ** preparing package for lazy loading
    ** help
    *** installing help indices
    ** building package indices
    ** testing if installed package can be loaded
    * DONE (RSNNS)
    [snip]
    「DONE (RSNNS)」と表示されたらインストールできています。上記の通りkr_io.cppのところで「警告」はでますが、「エラー」はありません。なお、兵庫教育大のCRANミラーをデフォルトにしていますが現在止まっているので、筑波大学に変更するためにreposオプションをつけました。libオプションを.libPaths()[2]にしているのは、こちらの都合です。As it isでペーストするために、それらのオプションを削除せずにそのまま書き込んでいます。
  • 当方はR 3.1.0 on Ubuntu 12.04 LTS 32-bitで、質問者さんと同じ「エラー」が出て失敗します。Ubuntuのバージョンに関連した問題(g++の仕様変更等?)に思われます。 -- 2014-04-14 (月) 10:22:04
  • [解決しない助言だったので削除します] 書き込んだ本人 -- 2014-04-14 (月) 10:32:02
  • いろいろとご教示いただき、ありがとうございます。今晩、帰宅したら早速試してみます。 -- nnet? 2014-04-14 (月) 11:48:29
  • Rを3.1.0 beta (2014-03-28 r65330)から、3.1.0 (2014-04-10)にバージョンをあげたら、エラーを再現できしました!
    で、ベタな方法ですがsrc/Makevarsに「PKG_CXXFLAGS=-Wno-format-security」を足すととりえず解決しました。もっとスマートな方法を模索するものの、RSNNSの作者が"--configure-vars"や"--configure-args"に配慮していないので、難しいかもしれません。とりあえず解決した手順を書いておきます。 -- 2014-04-14 (月) 11:50:45
    $ tar xvzf RSNNS_0.4-4.tar.gz
    $ cd RSNNS/src
    $ gedit Makevars
    PKG_CPPFLAGSの下にでも「PKG_CXXFLAGS=-Wno-format-security」を追記して上書き保存。geditは終了。
    $ cd -  #元のディレクトリ戻る
    $ sudo R CMD INSTALL -l "/usr/local/lib/R/site-library" RSNNS
    これでコンパイルが通ると思います。nnetさんは、上記で成功したら、是非、RSNNSの作者さんにkr_io.cppの不具合についてバグレポートしてあげてください。別のアプローチも紹介しておきます。Rのパッケージをコンパイルするときに使われるCXXFLAGSなどの環境変数は、/etc/R/Makeconfにあります。これを事前に編集します。
    $ grep format-security /etc/R/Makeconf | sed '/^#/d'
    CFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
       -Werror=format-security -D_FORTIFY_SOURCE=2 -g $(LTO)
    CXXFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
       -Werror=format-security -D_FORTIFY_SOURCE=2 -g $(LTO)
    CXX1XFLAGS = -g -O2 -fstack-protector --param=ssp-buffer-size=4 -Wformat 
       -Werror=format-security -D_FORTIFY_SOURCE=2 -g
    このCXXFLAGSの「-Werror=format-security」を「-Wno-error=format-security」に書き換えると、RSNNSのコンパイルに成功しました。
  • nnetです。早速、帰宅して試してみました。 まず、第1の方法(Makevars)です。
    sudo R CMD INSTALL -l "/usr/local/lib/R/site-library"
        RSNNS  * installing
    *source* package ‘RSNNS’ ... 
    file src/Makevars’ has the wrong MD5 checksum  
    と、いきなり叱られ(ファイルサイズが当初と異なっているので、おっしゃるとおりなのですが)、それが理由かどうかわかりませんが、以前と同様にインストールは失敗しました。そこで、お示しいただいた第2の方法(Makeconf)をトライしました。すると、警告は相変わらず山のように出たものの、それ以降、コンパイルは更に進行し、「おおお・・・」と息を飲んで見つめていると、無事インストールに成功しました! 感謝です!解決策をお教えいただいた方、それ以外にもいろいろと一緒に悩んでいただいた方、皆様に感謝いたします。 折を見て(4月17日のUbuntuの次期バージョン14.04 LTSでの具合を確かめてからでしょうか)、RSNNSの作者さんへバグレポートを送ってみたいと思います。本当に、ありがとうございました。 -- nnet? 2014-04-14 (月) 23:39:48

スペクトルの図の色について

お花見さん? (2014-04-12 (土) 11:50:58)

ウエーブレットのパワースペクトルの色の説明で,色が1から0の値に対応していることが凡例で示されています.
この1から0の値は,何でしょうか?信頼係数とか有意水準と関係するのでしょうか?

2013年1月−7月の過去ログ

taipapa? (2014-04-07 (月) 14:01:38)

こちらでお尋ねすることかどうか分からないのですが,Q&A (初級者コース)の2013年1月〜7月の過去ログが削除されているようです.私の勘違いでしょうか,あるいはどこかにアーカイブされているのでしょうか?

ggplot2 で時系列データの時間を色相環で表したい

Time? (2014-04-06 (日) 12:03:05)

ggplot2 で x 座標、y 座標、時刻の情報を持ったデータを、散布図で描画しようとしています。
このとき、時刻情報をプロットの色、しかも色相環に準じた色でプロットしたいです。
例えば、0時が緑、6時が黄色、12時が赤、18時が青、24時が緑というパターンです。
ところが下記のように、色が補色に向かって変わっていくプロットは簡単にかけるのですが、なかなか色が元に戻るようにできません。
この目的を達成できるような関数があればお教え下さい。
よろしくお願い致します。

require(ggplot2)
data <- data.frame(Time <- 0:24, x <- rnorm(25, 0, 3), y <- rnorm(25, 0, 3))
(g <- ggplot(data, aes(x = x, y = y)) + geom_point(aes(colour = Time)))
             + scale_colour_gradient2(low = "green", mid = "red", high = "green")
  • データフレームで Time <- 0:24 などは,はなはだマズイでしょう。Time = 0:24 とすべし。
    望むものかどうかはよくわからないけど,訳の分からないggplotなんか使わなくても,「キレイナ」図が描けますよ。Windows だから汚いのか,ggplot だから汚いのか...両方なんでしょうかね。
    ggplot のどこがいいのか,教えて欲しい。 -- 2014-04-06 (日) 18:38:18
    data <- data.frame(Time = 0:24, x = rnorm(2。5, 0, 3), y = rnorm(25, 0, 3))
    plot(x, y, col=rainbow(24)[as.integer(data$Time)], pch=19, xlim=c(-10, 5))
    legend("bottomright", legend=0:23, col=rainbow(24)[1:24], pch=19, bty="n")
    rainbow.png
  • ありがとうございます!!"<-" と "=" についてのご指摘もありがとうございました。以後、気を付けます。 -- Time? 2014-04-07 (月) 07:21:51
  • hsv()で角度で彩度指定できるので、色相環の好きな場所からぐるっと一周できます。 -- 2014-04-08 (火) 05:14:52
  • rainbow()も内部でhsv()を使っているんだけどね:p -- 2014-04-08 (火) 15:59:02
    まず、"green"のRGBを調べて、HSVに変換してみます。
    > col2rgb("green")
          [,1]
    red      0
    green  255
    blue     0
    > rgb2hsv(r = 0, g = 255, b = 0)
           [,1]
    h 0.3333333
    s 1.0000000
    v 1.0000000
    これでgreenのhの値が分かりました。これでぐるっと、hを回して色を作成します。
    > k <- seq(from = 0.3333330, to = 1 + 0.3333330, length.out = 25)[1:24]
    > cols <- hsv(h = ifelse(k < 1, k, k - 1)) 
    この色を使って描画する。
    > plot(y~x, data = data, col=cols[as.integer(Time)], pch=19, xlim=c(-10, 5))
    > legend("left", legend=0:23, col=cols, pch=19, bty="n", ncol = 3)
    20140408.png
    これだと、「6時が黄色、12時が赤、18時が青」の要件は満たしていない。
    > rgb2hsv(col2rgb(c("yellow", "red", "blue")))[1, ]
    [1] 0.1666667 0.0000000 0.6666667
    これらの値を中間に挟んでseq()で上のkを分割作成して結合する。
  • ifelse(k < 1, k, k - 1) はk1でOK。6時を黄色にするにはseq(1+1/3, 1/3, ...)でOK。要するにcols<-hsv(seq(1+1/3, 1/3, len=24)1)でOK。 -- 2014-04-08 (火) 16:35:33
  • "<-" はなぜだめなのでしょうか?  =と同じ意味だと思いますが. -- 2014-04-12 (土) 11:54:26
  • 関数の引数に代入する場合、「<-」と「=」は意味が違います。違いを理解した上であえて使うのはよいと思うのですが、分からないのであれば、関数の引数に「<-」を使うのは禁止と考えた方がよいでしょう。 -- 2014-04-12 (土) 23:11:52
    > x <- LETTERS[1:3]
    > x
    [1] "A" "B" "C"
    > mean(x = 1:3)
    [1] 2
    > x
    [1] "A" "B" "C"
    > mean(x <- 1:3)
    [1] 2
    > x
    [1] 1 2 3

SLmiscパッケージについて

もみも? (2014-04-04 (金) 17:13:02)

RのSLmiscをインストールしたいんですが。tar.gzだからなのかDLしRのフォルダにおいてもうまくインストールしてくれません。

k-means法のkを導き出すのにギャップ統計量を使った機械的な方法を採りたくてSLmiscが必要なのですが。

・SLmiscにかわるパッケージ
・SLmiscをどうにかインストールする方法

どなたか教えていただければ幸いです。

  • http://ciel344.blog.fc2.com/blog-entry-69.html -- 2014-04-04 (金) 18:42:16
  • どうしてもインストールできないならば
    ftp://cran.r-project.org/pub/R/src/contrib/Archive/SLmisc/ から, SLmisc_1.4.1.1.tar.gz を,ダウンロードして,解凍する。出てきた SLmisc ディレクトリの R ディレクトリにR の「ソースプログラム」があるので,それを Source コマンドなりで入力すれば,使えるのでは? マニュアルは man ディレクトリにあるし。 足りぬ足りぬは工夫が足りぬ -- 河童の屁は,河童にあらず,屁である。? 2014-04-05 (土) 11:06:08
    > source('~/SLmisc/R/kmeansGap.R', chdir = TRUE)
    > source('~/SLmisc/R/gapStat.R', chdir = TRUE)
    > x <- rbind(matrix(rnorm(150, sd = 0.1), ncol= 3), # man の examples の例
    +               matrix(rnorm(150, mean = 1, sd = 0.1), ncol = 3),
    +               matrix(rnorm(150, mean = 2, sd = 0.1), ncol = 3),
    +               matrix(rnorm(150, mean = 3, sd = 0.1), ncol = 3))
    > 
    > res <- kmeansGap(x = x, nstart = 10)
    > plot(res)
    gapstat.png

legendについて

ヒスト? (2014-03-31 (月) 10:30:10)

お世話になります。以下のように実線・ダッシュ・ドットの凡例を作りたいのですが、pchに指定できるのは一文字だけのようで、ダッシュを表現できません。

plot(rnorm(10), type="l", lty="solid", ylim=c(-1, 1))
lines(rnorm(10), lty="dashed")
lines(rnorm(10), lty="dotted")
legend("topleft", pch=c("−", "--", "・"), c("A", "B", "C"), bg="white")

何か良い方法はありませんでしょうか。WinXP、R3.02です。
宜しくお願いします。

  • そのような機能は誰も必要とするものであり,実装されていないはずはないと考え,人に聞く前に,オンラインヘルプをもう一度じっくり読む。全部読み切れないなあというなら,legend の引数の名前だけでもながめ,関連しそうなものがあればそれを読む。今回の場合,ちゃんと,lty, lwd なんて,そのものずばりの引数があるじゃああ〜りませんか。
    legend("topleft", legend=c("Alpah","Beta","Charlie"), lty=c("solid","dashed","dotted"), bg="white") -- 河童の屁は,河童にあらず,屁である。? 2014-03-31 (月) 11:34:22
  • 確かにltyはヘルプに「the line types and widths for lines appearing in the legend」と書かれていますね。ltyは凡例の枠のタイプを指定するものだと思っていました。ありがとうございました。 -- ヒスト? 2014-03-31 (月) 13:19:58
  • それは、box.lty -- 2014-03-31 (月) 13:34:25

決定係数R2について

sun? (2014-03-28 (金) 10:10:06)

決定係数R2の値から直線性を判断しようと思っています.
R2の値がいくら以上は直線と決めたいんですが,その値の決め方に困っています.(例えばR2=0.97以上を直線とする.)

アドバイスをいただけたらうれしいです.

  • 決定係数は直線性を表す統計量ではないので,それでもって直線性を判断することはできないでしょう。 -- 2014-03-28 (金) 16:27:16
  • 便宜上,直線と曲線に分類する時の,客観的な根拠として使えると思うのですが,その境界値の決め方に困っています. -- 2014-03-28 (金) 17:08:05
  • 無理なものは無理なんです。反例を,見れば分かるでしょう。上は直線関係ですがR2=0.92程度,下は曲線関係ですがR2は0.98程度とそれより高いです。
    直線回帰の場合,決定係数は単純に説明変数と被説明変数の積率相関係数の二乗なのだから,直線関係,曲線関係だけじゃなく,独立変数が従属変数の分散のどれくらいを説明するかということなので,いろいろな場合が存在する訳です。 -- 2014-03-28 (金) 17:55:57
    set.seed(123)
    n <- 1000
    layout(matrix(1:2, 2))
    old <- par(mgp=c(1.6, 0.8, 0), mar=c(3, 3, 0.5, 0.5))
    x <- rnorm(n, 50, 10)
    y <- jitter(20 * x + 30, amount=100)
    plot(x, y)
    a <- lm(y~x)
    abline(a, col=2)
    text(80, 500, sprintf("R2 = %.5f", summary(a)$r.squared), pos=2)
    y2 <- x^2
    plot(x, y2)
    a <- lm(y2~x)
    abline(a, col=2)
    text(80, 1000, sprintf("R2 = %.5f", summary(a)$r.squared), pos=2)
    par(old)
    layout(1)
    R2.png
  • 具体的な例まで示していただきありがとうございます.直線形,上に凸の曲線で比べています.この場合は直線形は1に近くなり,上に凸の曲線の方が明らかに1より小さい値を示します.そこでこの境界値を決めようと考えていますが無理でしょうか. -- 2014-03-28 (金) 19:35:41
  • 上に凸だろうが下に凸だろうが,同じでは?下に示したものは,上下反転しただけdすけど。あなたの限られたデータではそうであるかも知れないけど,要するに,一般化は出来ないということでは? -- 2014-03-28 (金) 20:45:55
    R2-2.png
  • 示していただいた反例には本当に驚きました.まさかこんな反例があるとは思ってもみませんでした.上の例と異なるのは,データ数が15個くらいと少ない点です.そして上に凸の場合は明らかに,直線に近い場合より値が小さくなります.一般化ができないなら,決定係数の値による,直線と曲線の分類は,論文などに書けないでしょうか.便宜上,直線と曲線を分ける,他の統計的な方法はありますか? -- 2014-03-28 (金) 21:06:23
  • 何回も書くけど,決定係数は「独立変数が従属変数の分散のどれくらいを説明するかということ」だけなので,直線相関とか曲線相関とは何の関係もないこと。更に言えば,R2の本来の意味は直線相関のときにのみいえることであり,曲線相関のときにまで敷衍できるものではない。だからこそ,曲線相関分析のときに「疑似R2 係数」なるものが,しかも複数,定義される(要するに,どれもこれも,帯に短したすきに長しということ)ということ。 -- 2014-03-28 (金) 21:06:26
  • > 決定係数の値による,直線と曲線の分類は,論文などに書けないでしょうか.便宜上,直線と曲線を分ける,他の統計的な方法はありますか?
    だから,一般的には,そういうものはないでしょうということ。
    しかし,あなたの特定のデータについては,特定の曲線モデルがあるわけでしょうから,それと直線モデルを比べて,どちらがより妥当かという問いには答えが出るでしょう。そもそも,どんな曲線モデルかについても,あなたは何にも述べていないのだから,第三者に分かるわけがない。
  • 参考にして考えてみます.ありがとうございました. -- 2014-03-29 (土) 10:06:56
  • 直線は曲線の特殊な場合だから「適切なモデルを仮定すれば」尤度比検定でいけるんでは? -- 2014-04-03 (木) 08:42:02

ggplot2の凡例について

paul? (2014-03-26 (水) 14:28:20)

ggplot2で凡例を出す所でつまずいております。
データフレームは下記です。

head(testdf)
                 time   rl   wl
1 2014-10-27 04:43:51 0.55 0.14
2 2014-10-27 05:03:53 0.98 0.07
3 2014-10-27 05:35:28 2.25 0.11
4 2014-10-27 06:17:47 0.48 0.22
5 2014-10-27 06:48:58 0.09 0.24
6 2014-10-27 07:21:01 0.25 0.21

下記のように実行していますが、グラフは期待通りきちんと表示されますが凡例はでてきませんでした。さまざま文献で出てくるものと出てきてないものなどコードを見ましたがどのようにしたらでてくるのかがつかめておりません。
ggplot2のバージョンは0.9.3.1です。R version 3.0.2 (2013-09-25)です。

ggplot(testdf, aes(time,rl)) 
 + geom_line(color = 4, size = 1.5 , alpha=0.5) 
 + geom_line(aes(y=wl),colour = 3, size = 1.5, alpha=0.5) 
 + theme(axis.text.x = element_text(angle=90)) 
 + xlab("Time") + ylab("ms") +  ggtitle("Title Sample") 
 + scale_x_datetime(breaks=date_breaks("30 min"),labels=date_format("%H:%M:%S"))

何か指定が足りていないところなどありますでしょうか。

  • theme(legend.position = "right")を入れても出てきませんでした・・・。 -- paul? 2014-03-26 (水) 14:57:04
  • http://www.cookbook-r.com/Graphs/Legends_%28ggplot2%29/ -- 2014-03-26 (水) 23:24:13
  • ありがとうございます。しかしながら折れ線グラフで、凡例そのものがでてきていないので。。meltでのデータフレームの変換が必要なのでしょうか・・・ -- paul? 2014-03-27 (木) 01:06:56
  • aesの中に色を書く -- 2014-03-27 (木) 15:56:06
    testdf <- data.frame(time = as.POSIXct(c("2014-10-27 04:43:51",
                             "2014-10-27 05:03:53",
                             "2014-10-27 05:35:28",
                             "2014-10-27 06:17:47",
                             "2014-10-27 06:48:58",
                             "2014-10-27 07:21:01")),
                         rl = runif(6), wl = runif(6))
    library(ggplot2)
    library(scales)
    ggplot(testdf, aes(time)) +
      geom_line(aes(y = rl, color = "4"), size = 1.5, alpha=0.5) +
      geom_line(aes(y = wl, color = "3"), size = 1.5, alpha=0.5) +
      theme(axis.text.x = element_text(angle=90)) +
      xlab("Time") + ylab("ms") +  ggtitle("Title Sample") +
      scale_x_datetime(breaks=date_breaks("30 min"),labels=date_format("%H:%M:%S"))
    20140327.png
    melt()を使うなら次のように。
    library(reshape)
    t2 <- melt(testdf, id="time")
    ggplot(t2, aes(time, value, colour = variable)) + 
      geom_line(size = 1.5, alpha=0.5) +
      scale_colour_manual(values=c("green", "blue")) +
      theme(axis.text.x = element_text(angle=90)) +
      xlab("Time") + ylab("ms") +  ggtitle("Title Sample") +
      scale_x_datetime(breaks=date_breaks("30 min"),labels=date_format("%H:%M:%S"))
    20140327a.png
  • ありがとうございました。確かにでるようになりました。凡例の文字 title やその列の名前を帰るのにはmeltをかました形でないとだめそうですかね・・・ -- paul? 2014-03-27 (木) 18:58:58

エラーの回避

茎わかめ? (2014-03-24 (月) 11:43:41)

同じフォルダ内にある同じ形式のファイルをlist.filesでリストアップして、そのファイルを1つ1つ開いて同じ処理をforで繰り返すコードを作りました。
しかし、そのファイルの中には開けないものがいくつもあり、(おそらくファイルが破損しているせいです。)そのたびに「cannnot open the connection」のエラーにひっかかって処理が途中で中断してしまいます。
もしそのエラーに引っかかってしまった場合は、そのファイルの処理はしないで、次のファイルの処理に進むという条件付けをしたいのですが、どのようにしたらよろしいでしょうか?

> files <- list.files("フォルダのパス")
> files2 <- unlist(files)
> files3 <- paste("フォルダのパス", files2, sep = "/") 
> for (j in 1:length(files)) {
>   to.read <- file(files3[[j]], "rb")
>  ### 以下処理 ###
> }

の「to.read = file(files3j?, "rb")」で中断してしまいます。
ご回答お願いします。

  • tryでエラー処理ですかね...。 -- 2014-03-24 (月) 11:57:46
    to.read <- try(file(files3[[j]], "rb"))
    if (class(to.read) == "try-error") {
      next
    }
    ?tryCatchとか読んでいただければと。
  • 解決しました。ありがとうございました。 -- 茎わかめ? 2014-03-24 (月) 12:04:47

移動平均

スカイツリー? (2014-03-21 (金) 15:39:14)

csvファイルを読み込んで移動平均を計算します.このファイルはデータのないところは空欄になっています.
この場合,移動平均の命令をどのようにやればいいでしょうか.
このファイルのままやるとエラーが出てしまいます.
よろしくお願いします.

  • 空欄というか,NAになっていると言うことでしょう?既存の関数を使うなら,NAを穴埋めする。色々方法はあるでしょう。最も簡単には,NAの前後の数値で補間する。もう一つは,自分で関数を書く。平均値を取るときに na.rm=TRUE を指定する。出来合いの関数でも,NAをどのように扱うかの引数を持っているものもあるのでは?探すのも大変なので,誰か知っていれば教えてというのもよい戦略。なかなか見つからないなら,自分で関数を書くしかない。 -- 河童の屁は,河童にあらず,屁である。? 2014-03-21 (金) 19:54:32
  • ありがとうございます.測定値で,データがなくて空欄になっています.書いていただいたように空欄の前の値にする形で補間したいです.空欄が2個あれば2つとも同じ値で.この場合どのようにプログラムを組めば良いのでしょうか.お願いします. -- スカイツリー? 2014-03-21 (金) 20:58:21
  • NA が連続するときに同じ値で補間というのはやや乱暴では?
    NA が複数個あるときも直線補間すると言うことで,以下のようなプログラムをちょいと書いてみました。色々なデータを与えてみて,手計算で正しいことを確認してから使うと良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-03-21 (金) 22:06:44
    hokan <- function(x) {
      a <- rle(is.na(x))
      b <- cumsum(a$length)
      for (i in seq_along(b)) {
        if (i > 1 && a$values[i]) {
          begin <- b[i-1]
          end <- b[i]+1
          width <- end-begin
          delta <- (x[end]-x[begin])/width
          x[(begin+1):(end-1)] <- x[begin]+delta*(1:(width-1))
        }
      }
      return(x)
    }
    > x <- c(NA, 3, 2, NA, 5, 7, 6, 9, NA, NA, 20, NA, NA, NA, 12, NA)
    > hokan(x)
     [1]       NA  3.00000  2.00000  3.50000  5.00000  7.00000  6.00000  9.00000 12.66667 16.33333
    [11] 20.00000 18.00000 16.00000 14.00000 12.00000       NA
  • プログラムまで作っていただきありがとうございました.私のcsvファイルの中では,NAとは入力されていなくてただ空欄になっています.空欄のままでも直線補間する方法はありますか?データが多いのでエクセルの空欄に自動的にNAを入れることができれば問題ないのですが.よろしくお願いします. -- スカイツリー? 2014-03-22 (土) 07:53:26
  • おかしいですね。空欄なら、Rに読み込んだときに自動的にNAになるはずですが。 -- 2014-03-22 (土) 16:20:22
    $ cat tmp.csv
    "A","B"
    1,2
    ,3
    4,5
    これをRに読み込む。
    > read.csv("tmp.csv")
       A B
    1  1 2
    2 NA 3
    3  4 5
    もし解決したいなら、質問したい現象が100%再現できる最小のサンプルと実際の手順を示すべきです(最小のサンプルを準備している段階で9割がた自己解決するでしょう)。さもなければ、空欄になるNAになると水掛け論になり、不毛です。

matchについて

初心者? (2014-03-12 (水) 09:24:31)

初心者です。お願い致します。
"0","1","2","3","A","B"の5種類の要素からなるベクトルがあります。(以下のような例)

c <- c("A","A","A","A","A","A","A","A","0","1","1","2","3","B",・・・)

そこで初めて"A"以外の要素が出てくる要素の番号を求めたいです。
イメージとしては、「match("0"または"1"または"2"または"3"または"B",c)」みたいな感じなのですが、どのようにコーディングしたらよろしいでしょうか?
どなかご回答お願いします。

  • rle(c)$lengths[1]+1 -- 河童の屁は,河童にあらず,屁である。? 2014-03-12 (水) 09:38:39
  • 迅速なご回答ありがとうございます。 すみませんが、行いたい操作の条件が少し間違っていました。求めたいのは、5種類の要素があって、初めて"A","0"の2種類以外の要素が出てきたときの番号でした。このときはどのようにしたらよろしいでしょうか?たびたび申し訳ありません。 -- 初心者? 2014-03-12 (水) 09:42:59
  • grep("[1|2|B]",c)[1] -- 2014-03-12 (水) 09:52:44
  • grep("[^A0]", c)[1]
    rle(sub("0", "A", c))$lengths[1]+1
    which(c %in% c("A", "0") == FALSE)[1]
    nchar(unlist(strsplit(paste(c, collapse=""), "[^A0]"))[1])+1
    nchar(strsplit(paste(c, collapse=""), "[^A0]")1?[1])+1
    length(na.omit(cumsum(match(c, c("A", "0")))))+1 など -- 河童の屁は,河童にあらず,屁である。? 2014-03-12 (水) 10:05:28
  • ありがとうございました。解決致しました。 -- 初心者? 2014-03-12 (水) 11:08:03

Rstudioでハングアップ

takeshik? (2014-03-03 (月) 18:08:33)

Rstudio でプレゼンテーションを作成作成としているのですが、途中までは問題なくPreView?できて、途中追加でbarplotをしたところで、ずっと進捗マークがグルグルしている状態となってしまってほぼハングってるようになります。Previewできずそこから進められません。他のplotやグラフでないものは出力できるのですが、なんとも切り分けに行き詰まっています・・・。何か原因が考えられますでしょうか?

グラフとしては下記のようなものを3つ繰り返しています。(2つまではokで3つめを追加するとハングしたようになってしまう)

```{r,fig.width=20,fig.height=10,echo=FALSE}
barplot(prop.table(table(an$Q1)),ylim=c(0,1.0),
        main="あああ",cex.main=3,cex.names=2.2,cex.axis=2.5)
```
  • Rstudio Server版 0.98.501、R-baseは3.0.2-1precise0 on Ubuntu 12.04 LTS です。 -- takeshik? 2014-03-03 (月) 18:11:33
  • Ubuntu ですか追試できる環境の人も少ないかもね。ans が何かとか分かりませんでの,追試すら出来ません。ylim=c(0,1.0),main="あああ", cex.main=3, cex.names=2.2, cex.axis=2.5 なんか,何がなんでも,ちっとも構いません(なんの情報もありません)。もっと,まともな質問をしてください。
    ところで,RStudio を使わない場合にはどうなるんですか?RStudio を使わない場合には旨くいくと言うことなら,RStuido なんか使わなければいいだけの話でしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-03-03 (月) 19:58:22
  • > {r,fig.width=20,fig.height=10,echo=FALSE} このrの後の","が不要では? -- 2014-03-04 (火) 01:59:08
  • 不要かもしれないけど,あっても動きますけど。 -- 2014-03-04 (火) 10:09:32
  • みなさんコメントありがとうございます。Rstudioなしでのアウトプットは可能で、Win Desktop版では問題なく動きました。ただ別のPCのWin Desktop版でやったらまた同じになったので・・・まだいろいろ試行錯誤してます。 -- takeshik? 2014-03-04 (火) 12:06:46
  • どうもknitr のマルチバイト対応のコードを埋め込むといけそうです。http://yihui.name/knitr/demo/graphics/ -- takeshik? 2014-03-04 (火) 12:54:01

grepの使い方について

kepper? (2014-02-28 (金) 10:25:17)

お世話になります。Win XP, R 3.02を使用しています。

以下のようにpatから要素を取り出してdatの何番目にマッチするか調べようとしています。しかし、i=3でdatの"aaa"のみにマッチしてほしいのですが、3つすべてにマッチしてしまいます。

pat <- c("baaa","aaab","aaa")
dat <- c("aaab","aaa","baaa")
for (i in 1:3) print(grep(pat[i], dat))

以下のようにしてもエラーになってしまいました。どのように対応すればよいでしょうか。

for (i in 1:3) print(grep(^pat[i]$, dat))

宜しくお願いします。

  • Grep <- Vectorize(grep); Grep(pat, dat) -- 2014-02-28 (金) 10:46:39
  • ありがとうございます。しかしその方法ではi=1,2のときに抽出できないですね。grepにこだわらず
    for (i in 1:3) print(which((pat[i]==dat)==TRUE))
    で良いような気がしてきました。 -- kepper? 2014-02-28 (金) 11:29:12
  • そうですね。部分一致ではないなら、わざわざgrepを使う意義はないでしょう。 -- 2014-02-28 (金) 11:31:23
    > sapply(pat, function(x){which(dat == x)})
    baaa aaab  aaa
       3    1    2
  • まあ,解決済みなのでどうでもよいですが,print(grep(^pat[i]$, dat)) がエラーになるのは,当たり前。print(grep(paste("^", pat[i], "$", sep=""), dat)) とすべきですね。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-28 (金) 12:03:53
  • paste()を使えばよかったのですか。勉強になります。 -- kepper? 2014-02-28 (金) 13:19:39

Rでの最小二乗分散分析

SK? (2014-02-25 (火) 19:16:44)

水準が3つ(A,B,C,D)ありまして反復数がそれぞれ4,4,4,3であり、データはそれぞれA=392,440,376,317、B=317,368,254,309、C=268,310,290,280、D=236,223,339です。反復数が異なる場合なので、最小二乗平均値を求めないといけないと思うのですが、そのやり方がまず分かりません。初級Q&A(10)のところで,LSMEANについて記述されていましたが、中沢先生のホームページにリンクされず、やり方を理解することができませんでした。また、最小二乗平均値が分かったら、一元配置分散分析をしたいのですがDの反復数3はそのまま欠損値でやっていいのでしょうか。Rを使い始めてなれませんので、Rコマンダーでできるならありがたいです。どうぞよろしくお願いします。

  • 中澤先生は所属がかわったので,あなたの目的の pdf ファイルの url は http://minato.sip21c.org/grad/infop-text2008-2.pdf ではないでしょうかね? -- 河童の屁は,河童にあらず,屁である。? 2014-02-25 (火) 19:33:43
  • 中澤先生の pdf ファイルを読ませていただいたのですが、該当するやり方は見当たりませんでした。せっかく教えていただいたのですが・・・ -- SK? 2014-02-27 (木) 23:02:40
  • 私はどうこういう立場ではないですが,8ページの「修正平均」のことじゃないのかな?Q&A10での該当文書はinfop-text2008-2.pdf に間違いないと思うので。「該当するやり方は見当たりませんでした」というのは理解できない。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-28 (金) 08:51:58

リストデータをベクトル化したとき値がおかしくなる

カンゲツ? (2014-02-25 (火) 17:09:35)

300万台の6ケタの数値6万件からなるデータをCSVからとりこみ変数oriに代入しました。
これをベクトル化するために変数dataに代入したところ値が変わってしまいます。

ori<-read.table("CSVのファイル名")
data<-c(ori[,1])

dataを10レコード確認したところ

ori[1:10]
[1] 11189 11190 11191 11192 (以下略)

と11189からひとつずつ増える値になっています。(元データ) とは全く違う値です。
Rのバージョンは3.0.2です。

  • 以下略って,その後に何か出てませんか?"Levels: ホニャラホニャラ"とか。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-25 (火) 17:52:31
  • listデータ側にLevelsの値が18124 Levelsに続いて出ています。 -- カンゲツ? 2014-02-25 (火) 17:54:30
  • class(ori[,1]) としたら,どういう出力になりますか? -- 河童の屁は,河童にあらず,屁である。? 2014-02-25 (火) 18:02:01
  • factorと返されました -- カンゲツ? 2014-02-25 (火) 18:02:51
  • でしょうね。
    原因は,「6桁の数値」(300万台というんだから,7桁の数値でしょうが)と思っているデータの中に,数値と見なせないものがあるということです。そのため,他の数値データも全部 Factor として扱われたということ。(Factor とは何か,どのような内部表現になっているかを検索すればよいですね)。対策としては,数値を表さない文字列を探し出して,NA にするとか。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-25 (火) 18:05:41

元号入り日付の数値データを西暦の日付にする

カンゲツ? (2014-02-25 (火) 10:48:59)

お世話になっております。
ここに生年月日を6ケタの数値で管理しているデータがあります。
年の情報が元号でして100万の位が
1:明治
2:大正
3:昭和
4:平成
で3280306(この場合は昭和28年3月6日生まれ)などと表記されます。
このデータから各サンプルの年齢を計算し年齢別にまとめようとおもっています。
まず平成の人のみを抽出(ベクトルhs)したあと

for(i in length(hs)) {
hs[i]-4000000
a<-hs[i]-4000000
b<-floor(a/10000)
}

で年まではなんとか切り分けることができましたが月と日がうまくいきません。
どのようにすればよいかご教授願います。

  • 自己解決しました。 -- カンゲツ? 2014-02-25 (火) 14:21:09
  • 自己解決したということでおめでとうございます。せっかく書いたので,アップしておきます。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-25 (火) 14:22:29
    getAge <- function(num) {
    	nengo <- num %/% 1000000
    	num <- num %% 1000000
    	nen <- num %/% 10000 + c(1867, 1911, 1925, 1988)[nengo]
    	num <- num %% 10000
    	tuki <- num %/% 100
    	hi <- num %% 100
    	nen <- nen
    	age <- yy-nen 
    	if (tuki > mm | (tuki == mm && hi > dd)) {
    		age <- age-1
    	}
    	return(age)
    }
    実行例
    > test.dat <- c(1251023, 2090305, 3280306, 4230718)
    > yy <- 2014 # 年齢計算の基準点
    > mm <- 2
    > dd <- 25
    > sapply(test.dat, getAge)
    [1] 121  93  60   2

移動平均のプロット2

wavelet? (2014-02-23 (日) 22:00:04)

おかげ様で,0)生データから移動平均を中点にプロットするところまでできました.
1)次に,生データ−移動平均 を点でプロットします.
2)さらに,その値の移動平均を求めてプロットします.
以下のようにプログラムしましたが作図されません.
0,1,2の図は,重ねないで別々に作ります.
問題点を教えていただけるとうれしいです.
よろしくお願いします.AO1900.csvのデータも送ります.

library("TTR")
rw<-scan("AO1900.csv")
ts<-rw
sx=SMA(ts, 60)
plot(ts,col=4,pch=1,cex=0.5)
lines(sx[-(1:30)], type="b",cex=0.3)
tss=ts-sx[-(1:30)]
lines(tss, col=2,type="b",cex=0.3)
sxx=SMA(tss,60)
lines(sxx[-(1:30)], col=3, type="b",cex=0.3)
  • プログラムの提示方について,学習してくださいといっておいたのに,なんにも学習できていませんね。ちゃんと投稿法についてのページを読んで学習してください。プログラムの書き方のお作法も,勉強しましょう。演算子の前後の空白とか,カンマのあとの空白とか,代入は = ではなく <- であるとか。読むに堪えないプログラムだと,それだけで「回答してやろうと言う気が失せる」こともあるのですよ。
    一応,また,私が直しておきますけどね。
    警告メッセージとエラーメッセージが出ているでしょう?エラーメッセージに対処するのがまずは第一段階(エラーメッセージが出なくなっても正しい計算が出来ているとはいえないこともある)。
    前にも言ったけど,どの要素がどれと対応しているのか,図に描いてと言ったけど,正確には表に書いてかな,ちゃんと把握することが必要でしょ? ts-sx[-(1:30)] は,ts の各要素から sx[-(1:30)] を引こうとしているけど,要素数が違うのは当然だし,どの要素からどの要素を引くのかをちゃんと把握していないと,ベクトル演算を命令することが出来ないでしょう。-- 河童の屁は,河童にあらず,屁である。? 2014-02-23 (日) 23:42:28
  • コメントありがとうございました.いろいろとご迷惑をおかけしてしまい申し訳なく思っています. -- 2014-02-25 (火) 07:20:03

移動平均のプロットについて

wavelet? (2014-02-21 (金) 22:50:21)

移動平均をTTRを用いて求めています.点をプロットさせると移動平均は,最終月にプロットされて位相がずれてしまいます.中日にプロットする方法を教えてください.
以下のプログラムでは,月毎のデータを使って,100ヶ月の移動平均を求めています.
用いたデータも添付します.よろしくお願いします.

library("TTR")
rw <- scan("NAO1910.csv")
ts <- rw
sx <- SMA(ts, 100)
plot(ts)
par(new = TRUE)
plot(sx, type = "b")
  • par(new=TRUE) を使ってグラフを重ね描きするのは,絶対に避けるべきです。複数の plot の軸の目盛り(範囲)が違うと,悲惨な結果になるでしょう(それを回避するために xlim, ylim などを使うのは最悪です)。2 番目の plot を lines に変えるだけで良いのだから。
    sx を描きだしてみれば分かるけど,「100ヶ月の移動平均」を取ると,最初の 100 要素は NA になっているでしょう。101 個目の数値を 100 個の中点にかきたいのだから,先頭 50 個の NA だけを消去したものを書けば良い。残った 50 個の NA は図にはかかれず,51 個目に元の 101 個目の移動平均値が描かれるでしょう。つまり,lines(sx[-(1:50)], type="b") とするのです。
    なお,中点を厳密に扱いたいなら,移動平均の項数を奇数にすると良いでしょう。
    投稿法に注意。今回も,私が編集しておきます。どこがどのように編集されたか,後で確認しておくと良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-22 (土) 10:21:40
  • 重要なご指摘ありがとうございました.重ねてグラフを書くことができました.移動平均の振幅が小さいので,移動平均のスケールだけ変えることもできるのでしょうか.プログラムをきれいに編集していただきありがとうございました.いつも,的確なコメントに感謝します. -- 2014-02-22 (土) 17:14:23
  • > 移動平均のスケールだけ変えることもできるのでしょうか
    一般的には,そのような場合にこそ,par(new=TRUE) を使うのですよ。ただし,その前後の plot などで,色々手当をしないといけません(移動平均の項数の半分だけ NA を除くだけでは不十分で(それだけではデータ点の位置がずれる。移動平均のデータの後ろに,更に半分だけ NA を付け加える必要がある。図を描いて,どの点が何に対応するか確認すれば分かる。)。
    しかし,元のデータと移動平均を目盛りをちがえて描くというのは,紛らわしく,あまりお勧めできないように思いますけどね。
    用いたデータも添付しますといいながら見当たらないので,下にある,以前の nao54.csv(ただし,最後の方の余計な文字列を除いたものを使って,11項移動平均を描画するプログラムを提示しておきましょう。
    より適切な図にするには,ts の平均値と移動平均の平均が同じ水平線上にのり,かつ,分散の見た目が同じになるようにした方が良いでしょう。しかし,そのようなことはすべて「小細工」なので,同じ軸上で,元のデータと移動平均を描くのがベストだと,私は思いますけどね?? -- 河童の屁は,河童にあらず,屁である。? 2014-02-22 (土) 18:31:24
    library("TTR")
    par(mar=c(4, 4, 1, 4), mgp=c(1.8, 0.8, 0))
    rw <- scan("nao54.csv")
    ts <- rw
    sx <- SMA(ts, 11)
    plot(ts)
    par(new = TRUE)
    plot(c(sx[-(1:5)], rep(NA, 5)), type = "b", col="red", pch=19, xaxt="n", yaxt="n", ylab="")
    mtext("moving average", 4, line=2)
    axis(4)
    two-axis-plot.png
  • とても丁寧に説明していただきありがとうございました.おっしゃる通り,同じ目盛りにした方がいいと思いました.図まで作成していただきすみませんでした.ありがとうございました. -- 2014-02-22 (土) 21:50:02

apply ファミリー実行時に文字列を引数として渡す方法

skgmsnb? (2014-02-20 (木) 17:06:20)

複数のファイルを読み込んで、それぞれの標準偏差を求めようとしています。
ところが、fnames にファイル名を読み込んだ上で、

apply(fnames, 1, calc.sd)
とすると "Error in apply(fnames, 1, calc.sd) : dim(X) は正の長さを持たねばなりません" というエラーが出てしまいます。
ここで、calc.sd というのは引数として与えられた文字列と同じファイル名を持ったデータをカレントディレクトリから読み込んで標準偏差を求める自作関数です。

dim(fnames)
とすると "NULL" が返ってくることから、これは apply 関数が文字列を引数として関数に渡すことに対応していないからだと考えています。
このような場合、apply ではない他の関数を使うべきなのでしょうか?
ご教授よろしくお願い致します。

  • fnames はベクトルになってんじゃないの?dim(fnames) なんかするより,class(fnames) とか,直 fnames とか入力して,fnames が何なのか確かめるのが先でしょう。
    もし,期待しているとおり文字列ベクトルならば,apply ではなく,sapply(fnames, calc.sd) でしょ。オンラインヘルプというか,初心者向け解説ページでもよいから見ましたか?
    また,calc.sd の作りが間違えていると動かないでしょうから,calc.sd も示した方がよいと思うけど。
    "1.txt", "2.txt" があるとして,以下のようにすれば動くだろう。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-20 (木) 17:38:09
    calc.sd <- function(fn) { sd(scan(fn, ""))}
    sapply(c("1.txt", "2.txt"), calc.sd)
    無名関数を書く方がスマートだけどね。scan はデータがどういう風に入っているかに依存するけどね。
    sapply(c("1.txt", "2.txt"), function(fn) sd(scan(fn, "")))
  • ご教示ありがとうございます。今、頂いた回答を理解していますので、うまくいったらまた報告します。 -- skgmsnb? 2014-02-20 (木) 18:37:39
  • 検証に,一時間もかかるでしょうかね?
    うまくいかなかっても、どのようにやってうまくいかなかったと報告すること -- 2014-02-20 (木) 19:35:33
  • まず、sapply() 関数を使うことで、目的は達成出来ました。R のリストをきちんと理解できていなかったのが原因でした。次に scan() を使ったコードを試してみましたが、scan() で読み込んだデータがベクトルであることに気づかなくて少し手間取りましたが、最終的には scan() で読み込んだデータを行列に変換することでうまくいくようになりました。この度はご丁寧な対応ありがとうございました。 -- skgmsnb? 2014-02-21 (金) 10:54:44
  • > scan() を使ったコードを試してみましたが、scan() で読み込んだデータがベクトルであることに気づかなくて少し手間取りましたが、最終的には scan() で読み込んだデータを行列に変換することでうまくいくようになりました。
    だから,いわんこっちゃない!!読み込むデータファイルがどういう構成になっているかわからなければ,ちゃんとしたアドバイスなんかできるわけないでしょう。ぷんぷん○だわ。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-22 (土) 21:06:32

Rstudio

山田? (2014-02-19 (水) 18:45:06)

win8.1でRstudioはインストールできますか?
実行ファイルが見当たらないのですが。。。。

  • 「どこに」見当たらないのですか?http://www.rstudio.com/ide/download/desktop じゃないところを見たんですか?そこに「RStudio 0.98.501 - Windows XP/Vista/7/8」というリンクがあるでしょ?? -- 河童の屁は,河童にあらず,屁である。? 2014-02-19 (水) 23:10:36
  • 質問者は、おそらく Win8 と Win8.1 とを区別しているのだと思います。 Win8.1 において動かないアプリケーションもあるようです。MS ではよくあることですから...。質問者が試した結果ではない、ことのようか感じがします。それにしても、自ら調べたりするのではなく、すぐに尋ねて解決しようという人がいらっしゃるようで、河童の屁さんの尽力に敬服しております。疲れない程度に、御過ごし下さいませ。 -- ooki?
  • 8ではできるかもしれないが,8.1じゃできないかもしれないとかいわれているが
    まずはやってみれ!!やったあと,できなかったんですけどといってみれ!! -- 2014-02-20 (木) 19:38:23
  • Rstudio を使おうという層に、そこまで要求するのも無理か。だったら、8.1じゃ無理なら8にダウングレードするくらいのリスクは甘受してもらわないとね。日本語ユーザがRStudioを使うメリットってなんなのさ。 -- 2014-02-20 (木) 19:57:16
  • はい、ちゃんと、Windows 8.1 にインストールできて、ちゃんと動きましたよ。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-24 (月) 13:21:47

R for Mac の画像表示について

松田? (2014-02-19 (水) 18:40:14)

Mac(OSX10.9)でRをインストール後、画像を読み込みしました。
readImage()で読み込みdisplay()で表しましたが、Safariが立ち上がって画像が表示されます。windowsではないのですが、何か設定が間違っていますか?

  • display のオンラインヘルプは読みました?method="raster" を加えるとどうなりますかね? -- 河童の屁は,河童にあらず,屁である。? 2014-02-19 (水) 23:03:15
  • 聞くだけ聞いておいて、提案されたことについて、何の反応もないというのもどうかな?もう、これからは、あなたのような(あなたのではない)質問にはだれも答えない方がよいのかな。 -- 2014-02-20 (木) 20:21:07

因子データのplotについて

JA? (2014-02-17 (月) 20:13:53)

お世話になります。以下のように因子ごとに値をプロットしているのですが、
1.y軸のclassを数値ではなく元のA,B,Cとして認識させる
2.x軸にvalue、y軸にclassを表示する
をするためにはどのようにすればよいでしょうか。
宜しくお願いします。

dat <- as.data.frame(matrix(0,100,2))
colnames(dat) <- c("value","class")
dat[,1] <- runif(100)
dat[,2] <- as.factor(rep(c("B","A","C","C","A"),20))
plot(dat)
  • 以下のようにすれば良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-17 (月) 21:49:29
    dat <- as.data.frame(matrix(0, 100, 2))
    colnames(dat) <- c("value", "class")
    dat[, 1] <- runif(100)
    dat[, 2] <- as.factor(rep(c("B", "A", "C", "C", "A"), 20))
    plot(dat, yaxt="n")
    axis(2, at=seq_along(levels(dat[, 2])), labels=levels(dat[, 2]))
    なお,データフレームは以下のように作るだけで十分ですよ。
    dat <- data.frame(value=runif(100),
    class=rep(c("B", "A", "C", "C", "A"), 20))
  • ありがとうございました。seq_alongという関数があるとは知りませんでした。 -- JA? 2014-02-18 (火) 07:54:27

円グラフのラベルを重ならないようにしたい

(2014-02-17 (月) 11:35:01)

個々の値が小さく、要素数が多いデータを円グラフにしてclockwise=Tを適用してラベルを表示すると、終端の辺りでラベルが重なってしまい読めません。ラベルの重複を防ぐ方法はありますでしょうか

  • > 終端の辺りでラベルが重なってしまい読めません。ラベルの重複を防ぐ方法はありますでしょうか
    ないでしょう。せいぜい,図を大きく描いて,ラベルは小さい文字で書く程度。
    しかし,所詮,そのような微細なものの詳細を表示しても意味がないし,そもそも円グラフは"Note Pie charts are a very bad way of displaying information. The eye is good at judging linear measures and bad at judging relative areas. A bar chart or dot chart is a preferable way of displaying this type of data."と書かれていることに留意すべきでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-17 (月) 13:22:12
  • 河童さんのご指摘はもっともですが、上司による理不尽な要求などやむを得ない場合もあるでしょう。「図を大きくする、ラベル文字サイズを小さくする」以外にも、可能であれば「ラベルを間引く」という方法もあると思います。また、Rグラフィックをsvgなどベクタデータで保存してドローソフト(inkscapeやLibreOffice Draw)に持ち込んで手で位置を微調整するという方法も検討されたらいかがでしょうか。あと、どうしてもRグラフィックだけで何とかしたいなら、locator()とtext()を使って、任意の位置にテキストラベルやリーダ線を配置します。pie()で描画したあとも、locator()は使えます。locator()が実行されると、Rグラフィック上の位置がマウスで指定されるのを待つ状態になります。これをハングアップしたと勘違いしないように気をつけてください。 -- 2014-02-17 (月) 14:04:34
    pie(1:25, labels = c(rep(NA, 3), 4:25), clockwise = TRUE)
    text((a <- locator(3)), as.character(1:3), pos = 3, offset = .1)
    for (i in 1:3){
        z <- atan(a$y[i]/a$x[i])
        segments(a$x[i], a$y[i], 0.8 * cos(z), 0.8 * sin(z))
    }
    pie-labels01.png
  • うまくやらないと,例示のグラフで 18 に相当するパイに余分な分割線が入っているし...
    そこまで言うなら,pie プログラムを改変して以下のようなものをでっちげてみましょうか?
    一応,Tips としては,strwidth() と strheight() を使うことかな?
    プログラムするということは,手作業は入れないということですもんね(locator() は御法度でしょう。おなじようなグラフを 100 個も描くことを考えれば自明。手作業入れるなら,コンパスと分度器で描くのとの境目がなくなる(^_^) -- 河童の屁は,河童にあらず,屁である。? 2014-02-17 (月) 19:24:00
    pie2 <- function(x, labels = names(x), edges = 200, radius = 0.8, clockwise = FALSE, 
      init.angle = if (clockwise) 
        90
      else 0, density = NULL, angle = 45, col = NULL, border = NULL, lty = NULL, 
      main = NULL, special = NULL, ...) {
      if (!is.numeric(x) || any(is.na(x) | x < 0)) 
        stop("'x' values must be positive.")
      if (is.null(labels)) 
        labels <- as.character(seq_along(x))
      else labels <- as.graphicsAnnot(labels)
      x <- c(0, cumsum(x)/sum(x))
      dx <- diff(x)
      nx <- length(dx)
      plot.new()
      pin <- par("pin")
      xlim <- ylim <- c(-1, 1)
      if (pin[1L] > pin[2L]) 
        xlim <- (pin[1L]/pin[2L]) * xlim
      else ylim <- (pin[2L]/pin[1L]) * ylim
      dev.hold()
      on.exit(dev.flush())
      plot.window(xlim, ylim, "", asp = 1)
      if (is.null(col)) 
        col <- if (is.null(density)) 
          c("white", "lightblue", "mistyrose", "lightcyan", "lavender", 
            "cornsilk")
        else par("fg")
      if (!is.null(col)) 
        col <- rep_len(col, nx)
      if (!is.null(border)) 
        border <- rep_len(border, nx)
      if (!is.null(lty)) 
        lty <- rep_len(lty, nx)
      angle <- rep(angle, nx)
      if (!is.null(density)) 
        density <- rep_len(density, nx)
      twopi <- if (clockwise) 
        -2 * pi
      else 2 * pi
      t2xy <- function(t) {
        t2p <- twopi * t + init.angle * pi/180
        list(x = radius * cos(t2p), y = radius * sin(t2p))
      }
      P.xy <- matrix(0, nx, 2)
      for (i in 1L:nx) {
        n <- max(2, floor(edges * dx[i]))
        P <- t2xy(seq.int(x[i], x[i + 1], length.out = n))
        polygon(c(P$x, 0), c(P$y, 0), density = density[i], angle = angle[i], 
          border = border[i], col = col[i], lty = lty[i])
        P <- t2xy(mean(x[i + 0:1]))
        P.xy[i, 1] <- P$x
        P.xy[i, 2] <- P$y
        lab <- as.character(labels[i])
        if (!is.na(lab) && nzchar(lab) && !(i %in% 1L:special)) {
          lines(c(1, 1.05) * P$x, c(1, 1.05) * P$y)
          text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE, adj = ifelse(P$x < 
            0, 1, 0), ...)
        }
      }
      sh <- strheight("H")
      for (i in 1L:special) {
        temp <- P.xy[special, 2] + (special - i + 1) * sh * 1.2
        lines(rep(P.xy[i, 1], 2), c(P.xy[i, 2], temp), xpd = TRUE)
        text(P.xy[i, 1] - strwidth("H"), temp + 0.5 * sh, labels[i], xpd = TRUE, 
          adj = ifelse(P$x < 0, 1, 0), pos = 4, ...)
      }
      title(main = main, ...)
      invisible(NULL)
    }
    ans <- pie2(1:25, radius = 0.6, labels = paste("L", 1:25, sep = "-"), 
      clockwise = TRUE, special = 8)
    実行結果
    pie.png
    でもね,このデータであったとしても,ラベルが長ければ L-18 と L-17 のラベルは重なるだろうけど。あらゆる場合に重ならないようにプログラムする事も当然出来るけど,そこまでする意義があるかどうかでプログラム意欲はなくなる。
  • ありがとうございます。逆に25:1のデータを扱う場合は、どこをいじればよいでしょうか -- 2014-02-18 (火) 11:55:30
  • > 逆に25:1のデータを扱う場合は、どこをいじればよいでしょうか
    それが分からないようなら,やらない方がよいでしょう。
    本気でやる気がないので,やっつけ仕事で以下のようにでもすれば取りあえずは同じように描けるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-18 (火) 12:29:20
       if (!is.na(lab) && nzchar(lab) && !(i %in% special:25L)) {
         lines(c(1, 1.05) * P$x, c(1, 1.05) * P$y)
         text(1.1 * P$x, 1.1 * P$y, labels[i], xpd = TRUE, adj = ifelse(P$x < 
           0, 1, 0), ...)
       }
     }
     sh <- strheight("H")
     for (i in special:25L) {
       temp <- P.xy[special, 2] - (special - i-0.5 ) * sh * 1.2
       lines(rep(P.xy[i, 1], 2), c(P.xy[i, 2], temp), xpd = TRUE)
       text(P.xy[i, 1] + 0.25*strwidth("H"), temp + 0.5 * sh, labels[i], xpd = TRUE, 
         adj = ifelse(P$x < 0, 1, 0), pos = 2, ...)
     }
    変更後,
    ans <- pie2(25:1, radius = 0.6, labels = paste("L", 25:1, sep = "-"), 
      clockwise = TRUE, special = 18)
    で,動作確認。

パッケージforecastのauto.arimaについて

auto? (2014-02-15 (土) 19:32:57)

お世話になります。
パッケージforecastのauto.arimaを使用して、次のようにSARIMAモデルの次数の自動選択を実行してみました。

> library(forecast)
> sarima1 <- auto.arima(log(AirPassengers), trace=T)
...
ARIMA(0,1,1)(0,1,1)[12]                    : -401.9607
...
ARIMA(0,1,1)(2,1,2)[12]                    : -408.3862

Best model: ARIMA(0,1,1)(2,1,2)[12]                    

その要約を出力すると次のようになります。

> summary(sarima1)
Series: log(AirPassengers) 
ARIMA(0,1,1)(2,1,2)[12]                    

Coefficients:
          ma1     sar1     sar2    sma1     sma2
      -0.4291  -1.0022  -0.0196  0.4343  -0.4915
s.e.   0.0897   0.2632   0.1783  0.3023   0.1761

sigma^2 estimated as 0.001312:  log likelihood=245.46
AIC=-478.92   AICc=-478.24   BIC=-461.67

AICc=の値がモデル選択の過程における値と一致していません。
次に、Box and JenkinsのARIMA(0,1,1)(0,1,1)[12]モデルを当てはめてみます。

> sarima2 <- Arima(log(AirPassengers), c(0, 1, 1),
         seasonal = list(order = c(0, 1, 1), period = 12))
> summary(sarima2)
Series: log(AirPassengers) 
ARIMA(0,1,1)(0,1,1)[12]                    

Coefficients:
          ma1     sma1
      -0.4018  -0.5569
s.e.   0.0896   0.0731

sigma^2 estimated as 0.001348:  log likelihood=244.7
AIC=-483.4   AICc=-483.21   BIC=-474.77

Box and Jenkinsモデルの方がAICcが小さく、より優れたモデルであることが示唆されています。auto.arimaのトレースを見る限り、Box and Jenkinsモデルの方が劣っているのにです。この不一致の理由が理解できなくて困っています。どなたか、その原因を御教示いただければ幸いです。

  • forecastパッケージの中身を正確に確認したわけではないですが,AR項を含む時系列モデルの場合,その次数によって推定に利用可能なデータの長さが異なります(先頭データが欠けるため).データが異なれば尤度ひいてはAIC等の情報量規準による公平な比較は当然できないため,モデル選択の際は候補モデルのうち次数が最も大きい(データが最も短い)ものに推定用データを合わせることになります.よって,各モデルごとに利用可能なフルデータで推定する個別のArima実行の際とは結果が異なっているのだと思われます. -- toto? 2014-02-17 (月) 18:07:24

ウエーブレット係数の表示について

ドベシイ? (2014-02-12 (水) 22:07:54)

以下のようにして,時系列をウエーブレット係数で分解した時,ブロックのような表示になります.これを曲線で表示できないでしょうか.よろしくお願いします.
時系列のファイルも添付します.

library(wavelets)
rw <- scan("198311-200206.csv")
ts <- rw
# discrete wavelet
wt <- dwt(ts, filter="d4", n.levels=5, boundary="periodic", fast=FALSE)
plot(wt)
  • 「ブロックのような表示」とは何のことを指していて「曲線で表示」とは具体的にどのように描画したいのかが分からないので、コメントがつかないのだと思いますよ。 -- 2014-02-13 (木) 11:57:30
  • ブロックのような表示とは縦の線での表示です.曲線で表示とはサイン関数のような曲線での表示です.よろしくお願いします. -- 2014-02-13 (木) 20:37:05
  • 「縦の線での表示」をどのように「サイン関数のよう」に表示したいというのでしょうか。求める図が想像できませんが、何か例はありますか? -- 2014-02-13 (木) 20:42:47
  • あなたの意図に沿うかどうか分からないけど,plot(wt) のところを plot(wt, levels=1) とかにすると,以下のような図になるけど,それはあなたの意図に沿う? あなたが,wavelet についてある程度の理解があればでしょうけど(ちなみに,私は,なんにもしりません。オンラインヘルプを読んでためしただけです)。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-13 (木) 20:47:17
    wavelet.png
  • コメントありがとうございます.一番上の図を,一番下のような図にできたらと思っています.plot(wt) のところを plot(wt, levels=1) とか -- 2014-02-13 (木) 22:04:49
  • すみません.入力中に画面が変わってしまいました.棒の先を結んだようなグラフにしたいです.plot(wt)はそのままでいいです. -- 2014-02-13 (木) 22:06:35
  • 「plot(wt) のところを plot(wt, levels=1) とか」とか「plot(wt)はそのままでいいです」とか,どっちなんです?
    plot は plot.dwt を呼ぶので,それを参考に,「好きなように」,「自分で」プロットプログラムを書けば良いでしょう。おすきにどうぞ。みはなした。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-13 (木) 22:16:14
  • 「plot(wt)はそのままでいいです」最初の文に消すべきものが含んでいました.すみませんでした. -- 2014-02-13 (木) 22:41:43

円グラフの回転

カンゲツ? (2014-02-12 (水) 10:58:33)

はじめまして。円グラフを作成していてどうしても解決できなかった点がありまして質問をさせてください。
pie(1:10) を実行した際、時計で言う3時の位置に1番目の要素が出ます。
これを12時の位置に動かす方法はありますでしょうか。

  • ヘルプに書いてありますが...。 clockwise=TRUEにするなり、時計回りにしたくなければinit.angle=90にするなり。 -- 2014-02-12 (水) 11:16:18
  • ありがとうございます。無事に行けました -- カンゲツ? 2014-02-12 (水) 11:32:22

semの使用

ヒョウ エンフン? (2014-02-08 (土) 10:29:36)

sem packageを使うとき、私は下のように入力しました。

> library(sem)
> coopd<- readMoments(names=c( 
+ "y1","y2","y3","y4","y5","y6","y7","y8","y9","y10","y11","y12")) 
1: 1.0 
2: .160    1.0 
4: .302   .341     1.0 
7: .461   .400   .372 1.0 
11: .299   .404   .552 .302  1.0 
16: .152   .320   .476 .225 .708 1.0 
22: .134   .403   .467 .256 .623 .324 1.0 
29: .182   .374   .572 .255 .776 .769 .724 1.0 
37: .251   .285   .316 .164 .361 .295 .260 .284 1.0 
46: .372   .100   .408 .236 .294 .206 .071 .142 .295 1.0 
56: .157   .291   .393 .229 .472 .351 .204 .320 .290 .468  1.0 
67: .206  -0.014 .369 .224 .342 .202 .152 .189 .418 .351 .385 1.0 
79:  
Read 78 items
> model.coop <- specifyModel() 
1: mother -> y1, b11, NA 
2: mother-> y2, b21, NA 
3: mother-> y3, b31, NA 
4: mother-> y4, b41, NA 
5: interaction-> y5, NA, 1 
6: interaction-> y6, b62, NA 
7: interaction-> y7, b72, NA 
8: interaction-> y8, b82, NA 
9: cooperative -> y9, NA, 1 
10: cooperative -> y10, b103, NA 
11: cooperative -> y11, b113, NA 
12: cooperative -> y12, b123, NA 
13: mother-> interaction, g21, NA 
14: mother-> cooperative, g31, NA 
15: y1 <-> y1, e1, NA 
16: y2 <-> y2, e2, NA 
17: y3 <-> y3, e3, NA 
18: y4 <-> y4, e4, NA 
19: y5 <-> y5, e5, NA 
20: y6 <-> y6, e6, NA 
21: y7 <-> y7, e7, NA 
22: y8 <-> y8, e8, NA 
23: y9 <-> y9, e9, NA 
24: y10 <-> y10, e10, NA 
25: y11 <-> y11, e11, NA 
26: y12 <-> y12, e12, NA 
27: mother<-> mother, NA, 1 
28: interaction<-> interaction, delta2, NA 
29: cooperative <-> cooperative, delta3, NA 
30:  
Read 29 records
 > sem.coop <- sem(model.coop, coopd, N=50)
 以下にエラー seq_len(ngroups) : 
   引数は非負の整数に変換できなければなりません 
 追加情報:  警告メッセージ: 
1: In max(FLAT$group) :
   max の引数に有限な値がありません: -Inf を返します 
2: In max(partable$group) :
   max の引数に有限な値がありません: -Inf を返します

友達のコンピューターでやってみて、うまく結果ができましたが、自分のコンピューターではerrorが出ました。どこかに問題がありますか?
使うデータは全部ネットでdownloadしたデータです。間違えてはいないと思います。直す方法を教えてもらえませんか?

  • 私もやってみましたが,エラーは起きず最後まで計算できたようです。
    あなたが使った sem パッケージは最新のものでしょうか?最新バージョンは 3.1-3 ですが。もっとも,sem はバージョンがちょっと古いくらいで動かないと言うことはないでしょうけど。いちおう,R も sem も最新バージョンであることを確認してみてください。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-08 (土) 13:43:43
  • 他のモデルを実行しても同じエラーが出るのですか?あなたのRの使用環境がlinuxであれば、semのインストールの時に警告かエラーが出ていませんか?例えば、Rのライブラリの他にもsemが依存しているパッケージの不足や、そのバージョンが合っていないことを示唆するメッセージはないでしょうか? -- オワリーマン? 2014-02-15 (土) 10:00:17

ベクトルの要素の結合

とまと? (2014-02-05 (水) 22:30:40)

まだRを始めて間もない初心者です。
よろしくお願いいたします。

>  x<-c("a","a","a","a","b","b","b","a","b","b","a","a","b","a")
>  x
>  [1] "a" "a" "a" "a" "b" "b" "b" "a" "b" "b" "a" "a"

のような"a"と"b"の2種類からなるベクトルがあります。 これを同じ文字が連続して存在する場合、連続する要素を結合して、

> x<-c("aaaa","bbb","a","bb","aa","b","a")
>  x
>  [1] "aaaa" "bbb"  "a"    "bb"   "aa"   "b"    "a" 

という形に最終的にはしたいです。 一つ目のかたまりは

> R<- x[1:match("b",x)-1]
> list<-paste(R, collapse = "")
> x<-c(list,x[match("b",x):length(x)])
> x
>  [1] "aaaa" "b"    "b"    "b"    "a"    "b"    "b"    "a"    "a"    "b"   
> [11] "a"   

としましたが、ここからどのようにして繰り返しのループを組み立てていけばいいのかわかりません。 ベクトルの要素や長さはその時々によって変わるので、("a"と"b"の2種類からなるのは不変です。)変数のまま扱いたいです。 お教示お願いいたします。

  • こんな風にしてみる? -- 河童の屁は,河童にあらず,屁である。? 2014-02-05 (水) 22:56:41
    > x <- c("a","a","a","a","b","b","b","a","b","b","a","a","b","a")
    > ans <- rle(x)
    > mapply(function(x, y) paste(rep(x, y), collapse=""), ans$values, ans$lengths)
         a      b      a      b      a      b      a 
    "aaaa"  "bbb"    "a"   "bb"   "aa"    "b"    "a"
  • あれこれ考えていたことがたった2行でできてしまうなんて…感動です!ありがとうございます。 -- とまと? 2014-02-06 (木) 10:44:20
  • 別解もありがとうございます!参考にさせて頂きます。大変恐縮ですが、追加でお聞きしたいことがございまして、さきほど教えていただいた方法を使わさせて頂いて、
    >  "aaaa"  "bbb"    "a"   "bb"   "aa"    "b" 
    となったベクトルの"a"を含む要素のうち
    >  Number<-grep("[a]",x2)
    >  Number
    >  [1] 1 3 5 7
    「その要素の中の文字数が2以下ならば、その要素をベクトルから消去。2より大きいならば、その要素をベクトルの中にそのまま残しておく。」という条件で割り振りたいです。 (今回の例では、結果として"aaaa" "bbb" "bb" "b"というベクトルを得たいです。) Number[1]に関しては以下のような操作を作ったのですが、ここからどのようにしてNumber内の全ての要素にループをかければいいのかが分かりません。 (説明上の問題で、以下の文では条件の文字数が5になっています。)
    >  f(nchar(x2[Number[1]])<5){x3<-x2[-Number[1]]} else {x3<-x2}
    >  x3
    >     b     a     b     a     b     a 
    >  "bbb"   "a"  "bb"  "aa"   "b"   "a" 
    ご教示お願いします。(前回と同じ様なループの質問になってしまいすみません。)-- とまと? 2014-02-06 (木) 11:48:30
  • 迅速な対応ありがとうございます。今回はたくさんのベクトルを扱う予定なので、前々回お答え頂いたようにリストにしてから行うことにしました。その場合はこの上の処理はどうなりますか?恐れ入ります。 -- とまと? 2014-02-06 (木) 12:58:03
  • こちらの方の解はお好みではないようですが、要するに条件をつけるだけですから、3行付加すればよい。また、リストで扱いたいということでも、sapply を使えば問題ない。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-06 (木) 13:26:54
    test.dat <- replicate(10, sample(letters[1:2], 10, replace = TRUE), 
    	simplify = FALSE)
    sapply(test.dat, function(x) {
    	ans <- rle(x)
    	cond <- ans$values == "b" | 
                        (ans$values == "a" & ans$lengths >= 2) # 付け加える
    	ans$lengths <- ans$lengths[cond] # 付け加える
    	ans$values <- ans$values[cond] # 付け加える
    	mapply(function(x, y) paste(rep(x, y), collapse = ""), 
     		ans$values, ans$lengths)
    })
  • "河童の屁は,河童にあらず,屁である。"さん、ありがとうございました。少し手を加えれば、リストにすることができるんですね。 初心者過ぎて、何をどう変えればいいのかが分からなくて…。ありがとうございました。 -- とまと? 2014-02-06 (木) 13:57:33

for文内のWarning messagesについて

ジェイ? (2014-02-04 (火) 17:52:28)

お世話になります。R 3.02を使用しています。

for文を実行したところ、以下のようなWarning messagesが大量に出力されました。

Warning messages:
1: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
2: In FUN(newX[, i], ...) : no non-missing arguments to min; returning Inf
・・・

Warningが生じた箇所を特定するために、for文の最初の変数i=1に固定してfor文を実行したのですがWarningは生じませんでした。どうやらiが特定の値をとるときに問題が生じているようです。そのiの値を知りたいので、例えばWarningが生じた場合にfor文を抜けるということは可能でしょうか。

お手数ですが、ご回答宜しくお願いします。

  • 単純には,まず,options(warn=2) としておき,for 文の中に,print(i) と書いておく。そうすると,ループを回るたびに i の値が書かれ,Warning があると,それを Error 処理されるので,そこで実行がストップする。つまり,最後に書かれた i が問題が起きたループ回数。print(i) の他に,関連する変数も print( ) すると,どの変数がどんなふうになっているからエラーになるということが分かる。 -- 河童の屁は,河童にあらず,屁である。? 2014-02-04 (火) 18:33:25
    > x <- rbind(1:5, rep(NA, 5), 11:15) # 例示のためのデータ(行列)
    > options(warn=2) # Warning を Error とみなさせる
    > for (i in 1:nrow(x)) {
    + 	print(i) # ループの制御変数 i の値を書く
    + 	print(x[i,]) # 処理に関連するデータを書く
    + 	min(x[i,], na.rm=TRUE) # Warning が起こる可能性のある処理
    + }
    [1] 1           i の値
    [1] 1 2 3 4 5       x[i,] の値
    [1] 2                i が 2
    [1] NA NA NA NA NA   x[2,] は全部 NA なので,min がない!
     以下にエラー min(x[i, ], na.rm = TRUE) :   i が 2 のとき,Warning が起きた
       (警告から変換されました)  min の引数に有限な値がありません: Inf を返します
  • ご回答ありがとうございました。ご教示頂いた方法で原因が分かりました。ごく少数紛れ込んでいた欠損値がエラーの原因でした。 -- ジェイ? 2014-02-04 (火) 19:54:31

フーリエ解析について

wavelet? (2014-02-01 (土) 12:53:16)

以下のようにフーリエ解析をしたいのですが動きません.
何かパッケージをインストールしなくてはいけないのでしょうか.

x <- 100
f <- 1:x
hz <- 1:( x/2 )
t<-seq(0.01,1.00, 1/length(f))

# 4Hzの正弦波
data_waveA <- sin( 2 * pi * t * 4 )

# 18Hzの余弦波
data_waveB <- cos( 2 * pi * t * 18 )

# 上記2つの合成波
data_waveC <- data_waveA + data_waveB

# 波を描きます。
par( "mfrow" = c( 3, 1 ) ) plot( t, data_waveA, type="l" ) plot( t, data_waveB, type="l" ) plot( t, data_waveC, type="l" )


# 高速フーリエ変換を行ないます。
data_freqA <- fft( data_waveA - mean( data_waveA ) ) data_freqB <- fft( data_waveB - mean( data_waveB ) ) data_freqC <- fft( data_waveC - mean( data_waveC ) )

# 変換結果を表示します。
# 合成波の周波数も表示されています。
par( "mfrow" = c( 3, 1 ) )
plot( hz, abs( data_freqA[ hz ] ), type="l" ) plot( hz, abs( data_freqB[ hz ] ), type="l" ) plot( hz, abs( data_freqC[ hz ] ), type="l" )

  • あなたね,このプログラムどうやって書きました。あるいは,どこかからコピーしたのでしょうか?
    一行に複数の式が書かれているけど,それを区切る ; の前に &#8232(あえて全角で書くけど)が含まれていますよ。投稿された記事におけるプログラムをそのまま見ても文法的におかしいし,当然,Rコンソールにコピーしても動くわけはありません。一行に複数の式を書くのもお勧めできないので(プログラムの書き方もちょっとくせがあるけど),あなたのプログラムは以下のようなものでしょう?
    このように書くと(これをコピーペーストすると)ちゃんと動くでしょう。
    x <- 100
    f <- 1:x
    hz <- 1:(x/2)
    t <- seq(0.01, 1, 1/length(f))
    # 4Hzの正弦波
    data_waveA <- sin(2 * pi * t * 4)
    # 18Hzの余弦波
    data_waveB <- cos(2 * pi * t * 18)
    # 上記2つの合成波
    data_waveC <- data_waveA + data_waveB
    # 波を描きます。
    par(mfrow = c(3, 1))
    plot(t, data_waveA, type = "l")
    plot(t, data_waveB, type = "l")
    plot(t, data_waveC, type = "l")
    # 高速フーリエ変換を行ないます。
    data_freqA <- fft(data_waveA - mean(data_waveA))
    data_freqB <- fft(data_waveB - mean(data_waveB))
    data_freqC <- fft(data_waveC - mean(data_waveC))
    # 変換結果を表示します。
    # 合成波の周波数も表示されています。
    par(mfrow = c(3, 1))
    plot(hz, abs(data_freqA[hz]), type = "l")
    plot(hz, abs(data_freqB[hz]), type = "l")
    plot(hz, abs(data_freqC[hz]), type = "l")
    投稿方法もお作法に従っていないし,お行儀の悪い子にはバチが当たりますよね(^_^) -- 河童の屁は,河童にあらず,屁である。? 2014-02-01 (土) 21:54:13
  • 動きました.本当にありがとうございます.失礼をお許しください.このプログラムを参考にして,3000個の月毎の時系列データのFFTを試してみました.nino=read.csv("1750sunspot.csv",header=FALSE) nits=ts(nino) data=fft(nits) plot(abs(data)) がプログラムですがうまくピークがでません.また,横軸が月になっていますが,年に直す方法を教えてください.使用したデータも送ります.よろしくお願いします. -- wavelet? 2014-02-02 (日) 08:31:52
  • ↑横軸は含まれる周期の成分数でした.このグラフから,全周期の強さを月数に変換して,横軸を月数,縦軸を全周期の強さ(フーリエ変換の強さ)のグラフを得たいのですがその方法を教えてください.さらに横軸の月数を年数に直したいです.よろしくお願いします. -- 2014-02-02 (日) 09:59:14

RStudioコンソールの日本語表示

ひろし? (2014-01-31 (金) 16:12:54)

質問1
起動時に表示されるメッセージがR言語が日本語表示でRStudioのConsoleは英語表示の設定になっています。RStudioこの設定で最良でしょうか?
RStudioを日本語で快適に使用するための設定がもしあればアドバイス願います。

質問2
RStudioのConsoleの表示フォントをMS ゴシック(10pt)に設定していますが、ノートパソコンの画面では文字が薄く感じます。より輪郭が明瞭なぉすすめフォントをご存知ですか?あるいは太字指定ができますか?

実行環境
OS:Windows7 SP1 x86 日本語版
R言語:R 3.0.2
Rコマンダー:2.0-3
RStudio 0.98.501

宜しくお願いします。

  • > RStudioを日本語で快適に使用するための設定がもしあれば
    ないでしょう。日本語環境を考慮してくれていないのだから,少なくとも,快適な環境というのはない。(快適の程度にもよるが)
    > より輪郭が明瞭な,お勧めォント
    あなたの好みに依存するのだから,いくつか試してあなたの好みのものを捜すしかない。一般的にいえば,Windows のフォントは,まともなものが少ない。フォントのせいというかディスプレイ性能というか。 -- 2014-01-31 (金) 22:25:29
  • 質問2に関しては、ここを読まれるとヒントになると思います。輪郭を明瞭にするには時代に逆行してビットマップフォントを使うべきだと思いますが、Windowsユーザではないのでどうすればよいか分かりかねます。Windowsはフォントがとても汚いので、フォントにこだわる人はOS XやLinuxを使うと思います。 -- 2014-02-01 (土) 08:03:58
  • フォントに関して私は普段は"Migu 1M"を愛用していますが、RStudioだとキャレット位置がずれてしまうので、代わりに"Osaka−等幅"を入れて使ってます。 -- satto? 2014-02-08 (土) 20:56:15

hist2d での階級幅の指定方法

稲田? (2014-01-30 (木) 23:58:43)

頻度ポリゴンを描く関数 hist2dを使用する際に、x軸とy軸で階級幅を変更するにはどうすればよいのでしょか。
hist関数では、breaksで指定できることがわかりました。
(下記を参照しました
 http://www.econ.hokudai.ac.jp/~kakizawa/R/R_4.html
2次元の場合の指定方法がわかりません。
よろしくお願いします。

  • gplots パッケージ中の hist2d ですか?オンラインヘルプは読みましたか?nbins で 2 つの要素を持つベクトルで指定できるのでは? -- 河童の屁は,河童にあらず,屁である。? 2014-01-31 (金) 00:31:00
  • はい、gplots パッケージ中の hist2d です。オンラインヘルプのnbins=c(20,30)の意味が分かりませんでした。「nbins number of bins in each dimension. May be a scalar or a 2 element vector. Defaults to 200.」とあって、「nbins=c(max(xi),max(yn)」と指定していました。Examplesにある例を実際に動かして、やっとヘルプの意味が分かりました。nbinsは、数ですね。値が0から30ならばそのままmaxでもよいが、0から0.5の場合、例えば50と指定する必要があることが分かりました。今になって読むと、ちゃんとヘルプはそのように記述されています。有難うございました。 -- 稲田? 2014-02-03 (月) 10:49:21

日付について

panda? (2014-01-30 (木) 14:36:30)

ある日付が記されているのデータが下までずっと続いてあるのですが、このdayという列のデータの右から10番目まで、すなわち月日時間を出力したいのです。

labe    day
323169 	20101020092210 
323169 	20011020094231 
323169 	20131020152247 
323169 	20121020154501 
723151 	20121020071333 
723151 	20111020072611 

このような出力です。

labe    day
323169 	1020092210 
323169 	1020094231 
323169 	1020152247 
323169 	1020154501 
723151 	1020071333 
723151 	1020072611 

よろしくお願いします。

  • 膨大な数のパッケージや関数があるので,その全てを知らなければならないということではないですが,基本的な base に含まれるような関数は,使いこなせるまではいかなくても,なんかそんな機能をもった関数があったよな?とか,R の教科書的な本を一通り読んで,ああ,あそこらへんに書いてあったよな?というくらいの知識は必要かと思いますけどねえ。
    まあ,今回あなたが必要としているのは substr 関数というやつです。オンラインヘルプを見てください。で,終わってもよいのだけど,
    > a <- 20101020092210
    > substr(a, 5, 14) # 文字列にしてから抽出が行われる
    [1] "1020092210"
    > as.integer(substr(a, 5, 14)) # 数値に戻しておきたいとき
    [1] 1020092210
    のようなことです。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-30 (木) 14:44:17
  • day %% 1E+10 でもいいような気がします。 -- 2014-01-30 (木) 21:28:04

y軸ラベルを指数表記にしたい

freshman? (2014-01-29 (水) 15:28:38)

10000000を超える数値を扱っています。プロット関数で図を描きたいのですが、y軸ラベルを指数表記(scientific notation)にするにはどうしたらよいですか?アドバイスお願いします!

  • 軸の上付き文字による指数表記について を見よ! -- 河童の屁は,河童にあらず,屁である。? 2014-01-29 (水) 17:48:26
  • 大きな数字なら何もしなくても通常は指数標記になります。plot(c(1, 1), c(1, 100000000)) とか。切り替えるには options(scipen=桁数)で設定します。 -- 2014-01-29 (水) 17:50:08
  • ↑ それがねぇ,できないみたいなんですぅ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-29 (水) 17:59:15
    x <- 2:5 * 10^5
    y <- c(1, 2, 3, 100)
    options(scipen=2)
    plot(x, y)
    リンク先みたいでなくて x.xxe+yy という形式でよければ,以下のようにでも。
    x <- 2:5 * 10^5
    y <- c(1, 2, 3, 100)
    plot(x, y, axes = FALSE)
    axis(1, at = 2:5 * 10^5, labels = sprintf("%.2e", 2:5 * 10^5))
    axis(2, at = c(0, 100), labels = sprintf("%.2e", c(0, 100)))
  • ありがとうございました。scipenがプラスだと指数表記になりませんでしたので、-4以下にすると一様に指数表記になりました。一応、解決しました。ただ、scipen=桁数という意味がよくわかりませんでした。 -- freshman? 2014-01-29 (水) 18:57:07
  • 指数表記したときとそのまま標記したときとでの文字数の違いだそうで。
    > sprintf("%.0e %.0f", 2*10^5, 2*10^5)
    [1] "2e+05 200000"
    この例だと 5 文字 - 6 文字で -1 なので,scipen=-2 にすればよいようで。
    マイナスがありとは知らなんだ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-29 (水) 19:02:14
  • 納得しました。ありがとうございました。 -- freshman? 2014-01-30 (木) 09:38:58

行列の対応する要素どうしの平均値

panda? (2014-01-28 (火) 16:33:24)

どなたかご説明お願いします。

以下のような3×3の行列が複数個ありまして、それぞれの対応する要素の平均値を求めたいです。
行列の数は以下には2つしか示しておりませんが、具体的な数を指定せずにn個など変数で行いたいです。
よろしくお願いします。

   A  B  C        A  B  C
1  3  4  6     1  4  5  0
2  5  6  5     2  6  8  9
3  5  7  7     3  6  8  7
  • 複数の 3×3 行列を,3 次元配列 foo に詰め込めば,後は apply(foo, 1:2, mean) するだけです。
    > x <- matrix(c(3, 4, 6,  5, 6, 5,  5, 7, 7), ncol=3, byrow=TRUE)
    > y <- matrix(c(4, 5, 0,  6, 8, 9,  6, 8, 7), ncol=3, byrow=TRUE)
    > z <- matrix(c(1, 4, 7,  7, 8, 6,  6, 4, 2), ncol=3, byrow=TRUE)
    > w <- matrix(c(1, 2, 4,  4, 2, 6,  6, 3, 9), ncol=3, byrow=TRUE)
    > a <- array(c(x, y, z, w), dim=c(3, 3, 4))
    > a
    , , 1
    
         [,1] [,2] [,3]
    [1,]    3    4    6
    [2,]    5    6    5
    [3,]    5    7    7
    
    , , 2
    
         [,1] [,2] [,3]
    [1,]    4    5    0
    [2,]    6    8    9
    [3,]    6    8    7
    
    , , 3
    
         [,1] [,2] [,3]
    [1,]    1    4    7
    [2,]    7    8    6
    [3,]    6    4    2
    
    , , 4
    
         [,1] [,2] [,3]
    [1,]    1    2    4
    [2,]    4    2    6
    [3,]    6    3    9
    
    > apply(a, 1:2, mean)
         [,1] [,2] [,3]
    [1,] 2.25 3.75 4.25
    [2,] 5.50 6.00 6.50
    [3,] 5.75 5.50 6.25
    しかし,これでは,array 関数で配列を作るのがダサダサなので,テキストファイル foo.dat に 3×3 行列の要素を 1 行に 9 個ずつ含むように作り(列優先で配置),それを読み込んで array 関数を適用する。foo.dat は以下のようにもなるだろう。
    3 5 5 4 6 7 6 5 7
    4 6 6 5 8 8 0 9 7
    1 7 6 4 8 4 7 6 2
    1 4 6 2 2 3 4 6 9
    で,それを読み込んで,以下のようにする。
    mat <- scan("foo.dat")
    apply(array(mat, dim=c(3, 3, length(mat)/9)), 1:2, mean)
         [,1] [,2] [,3]
    [1,] 2.25 3.75 4.25
    [2,] 5.50 6.00 6.50
    [3,] 5.75 5.50 6.25
    もし,foo.dat を用意したとすれば,以下のようにしても解は得られる。
    > matrix(apply(matrix(mat, ncol=9, byrow=TRUE), 2, mean), 3)
         [,1] [,2] [,3]
    [1,] 2.25 3.75 4.25
    [2,] 5.50 6.00 6.50
    [3,] 5.75 5.50 6.25
    そんなところかな。
    > 3×3の行列が複数個ありまして
    どういう形態で行列が用意されているかにもよるので,そのあたりをはっきり書くと,より適した解を提示できるかもね。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-28 (火) 19:11:27
  • ありがとうございました。 -- panda? 2014-01-29 (水) 13:52:06

データの並べ替えについて

USB? (2014-01-28 (火) 07:22:31)

x,y,z,a
1A5,584,127,65
681,862,98C,378
1A5,647,34,816
3489,65,261,936

上記のように並んでいるデータをx列のデータを第一優先に、そして、xに同数字があった場合には、zの列のデータを第二優先に並べ替えたいです。

x,y,z,a
1A5,647,34,816
1A5,584,127,65
681,862,98C,378
3489,65,261,936

結果的にはこのような形です。
Rを扱うのがまだ慣れていないためか、数字だけではないので、難しい気がしてならないです。この点で困っていたところ、この掲示板を見つけたので投稿させていただきました。どなたか回答をお願いいたします。

  • > 数字だけではないので、難しい気がしてならない
    データの大小関係を決める規則を明記しないと回答不能。取りあえず辞書順ということならば,データフレーム名を d として,以下のように。%20s の 20 は,x,z 列の最長文字数以上(例だと x 列の 3489 が最長なので 4 以上であれば良い)とする。
    ちなみに,並び替えではなく並べ替えですからね。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-28 (火) 10:02:11
    > d
         x   y   z   a
    1  1A5 584 127  65
    2  681 862 98C 378
    3  1A5 647  34 816
    4 3489  65 261 936
    > (d <- d[order(sprintf("%20s", d$x), sprintf("%20s", d$z)),])
         x   y   z   a
    3  1A5 647  34 816
    1  1A5 584 127  65
    2  681 862 98C 378
    4 3489  65 261 936
  • 回答ありがとうございます!意外にRって簡単なプログラムなのですね!またよろしくお願いします。 -- USB? 2014-01-30 (木) 14:14:49

連続する2数の確率

R初心者? (2014-01-27 (月) 11:02:51)

R初心者です。初めての投稿になります。
以前も同じような質問が出ていましたらすみません。

W,R,1,2,3,4の6種類の文字数字の列のデータから
(これらの文字数字はある現象のステージを示すものです。)

「W→1」「W→2」「W→3」「W→4」「W→R」
「1→2」「1→3」「1→4」「1→R」
「2→3」「2→4」「2→R」
「3→4」「3→R」
「4→R」

の文字の遷移の確率を出したいのですが、
(矢印の逆方向の場合も同様に必要です。)

連続する2数をどのように取り上げればいいのか分かりません。
あと、今回のように文字と数字が混合している場合の扱い方も分かりません。

どうかご教示、よろしくお願い致します。

  • 追記:データは「WWWWWW11111122222233333334444444443333322222RRRRRR3333222111WWWWW」といった形になります。  連続する文字を
    > y<- with(rle(x), rep(values, ifelse( lengths, 1)))  
    を用いて省略させるところまではわかりました。よろしくお願い致します。 -- R初心者? 2014-01-27 (月) 11:26:15
  • 文字と数値を要素とするベクトルを作ると,数値を文字に変換して文字要素のベクトルになります。
    > (a <- c("W", "R", 1:4))
    [1] "W" "R" "1" "2" "3" "4"
    連続する要素は,a[1:5] と a[2:6] のような2つのベクトルの要素を対比すればよいですね。
    > a[-6] # a[1:5] と同じ
    [1] "W" "R" "1" "2" "3"
    > a[-1] # a[2:6] と同じ
    [1] "R" "1" "2" "3" "4"
    で,遷移行列は,table 関数を使えばよいですね。
    例は,データが1つの文字列で与えられているので,一文字ずつ分解するために,strsplit と unlist 関数を使えばよいですね。
    > x <- "WWWWWW11111122222233333334444444443333322222RRRRRR3333222111WWWWW"
    > y <- unlist(strsplit(x, ""))
    > n <- length(y)
    > (z <- table(y[-n], y[-1]))
       
         1  2  3  4  R  W
      1  7  1  0  0  0  1
      2  1 11  1  0  1  0
      3  0  2 13  1  0  0
      4  0  0  1  8  0  0
      R  0  0  1  0  5  0
      W  1  0  0  0  0  9
    で,遷移確率が行方向の確率が1になるようにというものなら,prop.table 関数が使えます。小数点以下3桁まで出したいなら,round 関数を使って以下の通り。
    > round(prop.table(z, 1), 3)
       
            1     2     3     4     R     W
      1 0.778 0.111 0.000 0.000 0.000 0.111
      2 0.071 0.786 0.071 0.000 0.071 0.000
      3 0.000 0.125 0.812 0.062 0.000 0.000
      4 0.000 0.000 0.111 0.889 0.000 0.000
      R 0.000 0.000 0.167 0.000 0.833 0.000
      W 0.100 0.000 0.000 0.000 0.000 0.900
    投稿方法について,再確認して,汚くなった掲示板をキレイにしてくださいね。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-27 (月) 11:44:01
  • 迅速なお返事本当にありがとうございます。お恥ずかしいながら、Rだけでなく統計に関しても全くの初心者でして、「連続する要素は,a[1:5] と a[2:6] のような2つのベクトルの要素を対比すればよいですね。」のところについてもう少し詳しくご説明いただけないでしょうか? よろしくお願い致します。 -- R初心者? 2014-01-27 (月) 13:31:19
  • a[1] がどう変化するかは a[2] をみればよいわけで,a[2] がどう変化するかは a[3] をみればよいわけで,...,a[i] がどう変化するかは a[i+1] をみればよいわけで。
    R では,ベクトル演算ができるので,a[1], a[2], ..., a[i] と a[2], a[3], ..., a[i+1] を比較することを簡略化してa[1:(n-1)] と a[2:n] を比較すると書くことができますよということ。a の最終要素と比較されるものはないので,最終は a[n-1] と a[n] の比較ということです。a[1:5] と a[2:6] の比較ということですが,これを少し簡略化すればa[1:5] は a の第6要素を除いたものということで a[-6] と書くこともできるということ。同じくa[2:6] は a の第1要素を除いたもので a[-1] と書ける。
    a1 <- y[-n]; b1 <- y[-1] とおけば,a1[i] が何に変わったかは b1[i] を見ればよいわけで,それは,table(a1, b1) で集計できるということ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-27 (月) 14:23:51
  • ご丁寧に本当にありがとうございます。無事解決しました。ありがとうございます。 -- R初心者? 2014-01-27 (月) 15:18:48
  • お世話になっております。追加でお聞きしたいのですが…。Excelデータから読み込んだ値を先日教えていただいたコマンドに入れて数式処理をしようとしたら、「文字列でない引数です」となってしまいうまく行きませんでした。どうしたらよろしいでしょうか?お願いいたします。以下がその時の内容です。--R初心者? 2014-01-28 (火) 11:46:17
    > x<-read.table("Book1.txt",sep="\t",header=T)  # タブ区切り,ヘッダあり
       x
        A                                          B
      1 1 WWWW11122233334443333222RRRRRR333222111WWW
      2 2 WWWW11122233334443333222RRRRRR333222112WWW
      3 3 WWWW11122233334443333222RRRRRR333222113WWW
      4 4 WWWW11122233334443333222RRRRRR333222114WWW
      5 5 WWWW11122233334443333222RRRRRR333222115WWW
    
    > a<-"x[1,2]"
    > y <- unlist(strsplit(a, ""))
    > n <- length(y)
    > (z <- table(y[-n], y[-1]))
      
          , [ ] 1 2
        , 0 0 0 0 1
        [ 0 0 0 1 0
        1 1 0 0 0 0
        2 0 0 1 0 0
        x 0 1 0 0 0
    > round(prop.table(z, 1), 3)
      
          , [ ] 1 2
        , 0 0 0 0 1
        [ 0 0 0 1 0
        1 1 0 0 0 0
        2 0 0 1 0 0
        x 0 1 0 0 0
  • まず,
    x <- read.table("Book1.txt", sep="\t", header=TRUE, as.is=TRUE)
    のように,as.is=TRUE を指定しないと。なお,TRUE は T のように省略しないようにした方がよいですね。
    また,
    a <- "x[1,2]"
    はだめです。x の1行目の2列目を取り出そうと思ったら,
    a <- x[1, 2]
    とするのです。x に文字列が入っているからダブルクオートでくくろうと思ったのかもしれませんが,冷静に考えてください。"x[1,2]" は 6 文字からなる文字列ですよ。a <- "abcdef" である場合を考えれば分かるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-28 (火) 12:03:32
  • いつも迅速な対応ありがとうございました。解決しました。レベルの低い質問にも丁寧に対応してくださって感謝します。 -- R初心者? 2014-01-28 (火) 14:00:17
  • いつもお世話になっております。たびたびすみません。また新たにお聞きしたいのですが、 以前教えて頂いたところから、以下のような操作を作りました。
    >  #データファイルをRに取り込む。
    > x<-read.table("Book1.txt",sep="\t",header=TRUE,as.is=TRUE)  # タブ区切り,ヘッダあり
    > x
          A                                          B
        1 1 WWWW11122233334443333222RRRRRR333222111WWW
        2 2 WWWW11222233334443333222RRRRRR333222111WWW
        3 3 WWWW12222233334443333222RRRRRR333222111WWW
        4 4 WWWW22222233334443333222RRRRRR333222111WWW
        5 5 WWWW22222233334443333222RRRRRR333222211WWW
    >  #tableを示す操作をまとめて定義(=too関数と名付けた。)
    > too<-function(q){
    > + a<-x[q,2]
    > + y <- unlist(strsplit(a, ""))
    > + n <- length(y)
    > + z <- table(y[-n], y[-1])
    > + round(prop.table(z, 1), 3)}
    > #tableを行の数だけ表示する。(too関数を繰り返す。)
    > lapply(1:nrow(x),too) 
    
    その後、表示されたテーブル同士の対応する数字同士の演算を一括で行い、同じような形式の表で示したいのですが、どのようにしたらよいでしょうか??-- R初心者? 2014-01-29 (水) 12:04:33
  • > テーブル同士の対応する数字同士の演算を一括で行い
    というのは,遷移度数(プログラムでは z)を合計して,その後にprop.table で遷移確率を求めるということ?。ちょうどこの 2 つ上の質問も同じようなことについてのものなんだけど,別解として以下のようにすることもできます。
    > too <- function(q) {
    + 	a <- x[q, 2]
    + 	y <- unlist(strsplit(a, ""))
    + 	n <- length(y)
    + 	z <- table(y[-n], y[-1])
    + #    round(prop.table(z, 1), 3) # これを計算するのは,まだ時期尚早
    + 	return(z) # 集計結果(度数)の方を返す
    + }
    > z <- lapply(1:nrow(x), too)
    > z # 結果を見てみる
    [[1]]
       
        1 2 3 4 R W
      1 4 1 0 0 0 1
      2 1 6 1 0 1 0
      3 0 2 8 1 0 0
      4 0 0 1 2 0 0
      R 0 0 1 0 5 0
      W 1 0 0 0 0 5
    
    [[2]]
       
        1 2 3 4 R W
      1 3 1 0 0 0 1
      2 1 7 1 0 1 0
     途中省略
    [[5]]
       
         1  2  3  4  R  W
      1  1  0  0  0  0  1
      2  1 10  1  0  1  0
      3  0  2  8  1  0  0
      4  0  0  1  2  0  0
      R  0  0  1  0  5  0
      W  0  1  0  0  0  5
     
    > (Sum <- Reduce("+", z)) # 足し算
       
         1  2  3  4  R  W
      1 12  3  0  0  0  5
      2  5 40  5  0  5  0
      3  0 10 40  5  0  0
      4  0  0  5 10  0  0
      R  0  0  5  0 25  0
      W  3  2  0  0  0 25
    
    > round(prop.table(Sum, 1), 3) # 割合(確率)を計算
       
            1     2     3     4     R     W
      1 0.600 0.150 0.000 0.000 0.000 0.250
      2 0.091 0.727 0.091 0.000 0.091 0.000
      3 0.000 0.182 0.727 0.091 0.000 0.000
      4 0.000 0.000 0.333 0.667 0.000 0.000
      R 0.000 0.000 0.167 0.000 0.833 0.000
      W 0.100 0.067 0.000 0.000 0.000 0.833
    こんなところでしょうか。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-29 (水) 12:28:24
  • 本当にありがとうございます。解決しました。わたくしも上のスレッドも参考にさせて頂いたのですが、うまくいきませんでした。その時は以下のように入れました。今回の場合でapply関数を用いる場合はどうしたらよろしいでしょうか?参考までにお願い致します。 -- R初心者? 2014-01-29 (水) 14:25:13
    > apply(z,1:2,sum)
      以下にエラー apply(z, 1:2, sum) :  dim(X) は正の長さを持たねばなりません
  • lapply の結果 z は,5 個の 6×6 の行列を要素として持つリストなので,そのままでは apply を適用できません。apply の第 1 引数は行列または配列でなければならないので,z から 6×6×5 の 3 次元配列を作らないといけません。
    > z2 <- array(0, dim=c(6, 6, 5)) # メモリ確保
    > for (i in 1:5) {
    +     z2[, , i] <- z[[i]] # 行列単位で代入
    + }
    > apply(z2, 1:2, sum)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]   12    3    0    0    0    5
    [2,]    5   40    5    0    5    0
    [3,]    0   10   40    5    0    0
    [4,]    0    0    5   10    0    0
    [5,]    0    0    5    0   25    0
    [6,]    3    2    0    0    0   25
    のようにするのも一法。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-29 (水) 17:40:13
  • ご丁寧にありがとうございました。もやもやが解けてすっきりしました。 -- R初心者? 2014-01-29 (水) 20:20:31
  • いつもお世話になっております。たびたびすみません。 これまでの話ですと、読み込んだデータが例えば以下のように 全ての行のデータが「R,W,1,2,3,4」の6要素を含む場合を考えていましたが、
    > x
            A                                          B
          1 1 WWWW11122233334443333222RRRRRR333222111WWW
          2 2 WWWW11222233334443333222RRRRRR333222111WWW
          3 3 WWWW12222233334443333222RRRRRR333222111WWW
          4 4 WWWW22222233334443333222RRRRRR333222111WWW
          5 5 WWWW22222233334443333222RRRRRR333222211WWW
    行によって含む要素の数が違う場合 (例えば2,3行目が「1,2,W」の3要素しか含んでいない。) はどのようにしたらよいでしょうか?? そのまま処理したら、2行目と3行目は3×3行列になってしまい、lapply関数後の処理がエラーになってしまいました。
     > x
            A                                          B
          1 1 WWWW11122233334443333222RRRRRR333222111WWW
          2 2 WWW22211111111122222222221111111112222111W
          3 3 WWWW11111112222222222222221111112222211WWW       
          4 4 WWWW22222233334443333222RRRRRR333222111WWW
          5 5 WWWW22222233334443333222RRRRRR333222211WWW
    含まれていない要素の値は0で示し、今までと同じように6×6行列のtableで表したくて、 データのそれぞれの行の遷移確率同士を演算したいです。 ご教示お願いいたします。-- R初心者? 2014-01-31 (金) 09:33:50
  • 頭の体操ですから,ご自分で考えてみると良いと思うのですが。旨いプログラムでなくて,正しい答えの出るプログラムを書くだけですが。 今回は,得られた行列の要素をその行名と列名を頼りに,6×6行列の行名と列名の要素に代入すれば良いわけです。 分かりやすく書けば以下のようになるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-31 (金) 16:26:48
    z2 <- lapply(z, function(x) {
    	names <- c(1:4, "R", "W")
    	y <- matrix(0, 6, 6, dimnames=list(names, names))
    	for (i in 1:nrow(x)) {
    		for (j in 1:ncol(x)) {
    			y[rownames(x)[i], colnames(x)[j]] <- x[i, j]
    		}
    	}
    	return(y)
    })
    これを,旨くやろうという魂胆で書き直すと,以下のようになるでしょうが,上のアルゴリズムが分かっていないと,よく分からないプログラムに見えるでしょうね。
    z3 <- lapply(z, function(x) { # x が 6×6 行列になる場合を特別扱いしても良いけどめんどくせ!
    	names <- c(1:4, "R", "W")
    	y <- matrix(0, 6, 6, dimnames=list(names, names))
    	y[names %in% rownames(x), names %in% colnames(x)] <- x
    	return(y)
    })
    ともかくも,どちらのプログラムも同じ結果になるはずで,
    > z[[2]]
       
         1  2  W
      1 18  2  1
      2  3 14  0
      W  0  1  2
    > z2[[2]]
       1  2 3 4 R W
    1 18  2 0 0 0 1
    2  3 14 0 0 0 0
    3  0  0 0 0 0 0
    4  0  0 0 0 0 0
    R  0  0 0 0 0 0
    W  0  1 0 0 0 2
    
    > z[[3]]
       
         1  2  W
      1 12  2  1
      2  2 18  0
      W  1  0  5
    > z3[[3]]
       1  2 3 4 R W
    1 12  2 0 0 0 1
    2  2 18 0 0 0 0
    3  0  0 0 0 0 0
    4  0  0 0 0 0 0
    R  0  0 0 0 0 0
    W  1  0 0 0 0 5
  • 何から何までお世話おかけしてすみません。本当にありがとうございました。 -- R初心者? 2014-01-31 (金) 17:46:07

bioconductorのメーリングリストについて

JJ? (2014-01-22 (水) 08:36:01)

お世話になります。
bioconductorのメーリングリストに投稿し、回答を得たのですが、回答者への返信の仕方が分かりません・・・。単に回答者のメールアドレスにメールを送信すればよいのでしょうか?しかしそうするとスレッドに表示されないような気がしています。どなたかやり方をご存知でしたら教えて頂けませんか。
https://stat.ethz.ch/pipermail/bioconductor/2014-January/thread.html

宜しくお願いします。

  • そんなことまでこんなところで聞くのかとは思いつつも、私見を述べます。日本の技術系メーリングリスト(以下、ML)では、質問者は途中経過のやりとりはもちろん、あとでメールアーカイブを読む他人に配慮して、最終的な結果のまとめ(サマリー)をMLに投げることが公衆道徳またはマナーとされています(Reply-ToがMLのアドレスになっている)。しかし、海外のMLでは必ずしもそうではありません。質問者と回答者がMLの下に潜ってしまってML上の参加者は何がどうなったのか分からないままで終わっている事例をよく見かけました(最近はやや減っている印象を受ける)。これでは公共性に欠け、知の蓄積になりません。日本人としての規範意識の高さを示すには、(ゴミ同然のメールでなければ)MLに送信すべきだと思います。 -- 2014-01-22 (水) 17:15:42
  • メーリングリストというものを使ったことがないうえに、海外のものなので送信したはいいものの、その後の処理がわからないという状態です。このサイトのようにメールを介さずに掲示板の形式にしてくれれば分かりやすいのにと思いました。 -- JJ? 2014-01-22 (水) 19:25:28
  • 自己解決しました。理由は分かりませんが、返信したいレスのページの返信者の横に表示されるメールアドレスに送信すると、そのレスの直下に表示されました。 -- JJ? 2014-01-23 (木) 08:16:33

IRTについて

TT? (2014-01-17 (金) 21:09:02)

項目の困難度、識別力の算出はできたのですが、それらの標準誤差の算出方法をご存知の方がいらっしゃいましたら、ご教示お願いいたします。

平均値の出しかたについて

fractal? (2014-01-16 (木) 20:01:40)


ホームページに以下のように示されている、データの平均値の出しかたを教えてください。データ数は240個です。
データは、ホームページから、エクセルにコピーしてあります。

19 9 11 7 5 5 2 5 2 2 2 2 2 2 15 7 2 2 2 2 5 5 5 2 2 2 2 2 5 5 2 7
11 11 7 5 5 2 7 22 11 15 9 7 22 7 35 7 5 8 8 7 5 7 7 11 5 8 16 8 5 7 11 11
9 5 8 8 8 5 7 8 5 2 5 2 2 2 2 2 5 2 5 16 11 7 19 19 5 5 5 11 11 7 19 19
11 7 5 8 5 5 22 42 11 5 5 5 11 7 2 2 2 5 15 7 5 7 5 8 5 7 5 11 34 22 30 15
19 16 5 5 5 2 11 22 11 22 15 11 11 5 5 31 2 5 5 5 8 5 5 2 5 5 5 5 5 11 7 35
5 15 16 15 7 5 7 15 11 15 11 11 15 22 7 2 2 15 7 8 30 11 42 62 42 22 30 22 22 30 35 42
22 15 18 34 22 42 35 11 9 22 7 11 15 7 11 11 11 11 11 8 15 30 11 31 19 15 7 7 8 22 7 11
9 2 8 2 7 15 11 9 9 5 5 2 2 2 2 16 5 9 2 5 2 2 5 11

このような計算を1000する必要があるので、効率的な方法を知りたいです。
よろしくお願い致します。

  • この処理はRでやるより、wgetとかPerlのWWW::Mechanize+WWW::Mechanize::Shellとか、ウェッブの情報を自動的に取得して、そのデータを処理しやすい形に処理してしまう事の方が、省力しやすいと思います。Rでもこれはできると思いますが、それらのツールをつかった方が楽だと思います。取得したファイルから必要な数字の部分だけ抜きだすには、sedとか、Awk,Perl,Ruby,Pythonなど文字列処理が得意で、それらのコードを書いたときにもコード量が少なくなるものを使った方が良いと思います。そこまで処理できてしまうと、あとは、どのツールつかっても楽に平均値を計算できると思います。データのファイル取得部分と、その取得したHTMLファイルからデータを切りだす部分を別にした方がテストもしやすいし、同じデータを何度もアクセスしなくて良いので、こっちの方が良いと思います。 -- buynnnmmm1? 2014-01-16 (木) 20:26:09
  • buynnnmmm1 さんの言うとおりですが,データが html ファイルにどのように記載されているか(pre を使っているのか,table なのか,その他なのか)により,R でも簡単にできる場合もありますので,差し支えなければ URL を提示すれば? -- 河童の屁は,河童にあらず,屁である。? 2014-01-16 (木) 21:05:08
  • URL は http://isgi.latmos.ipsl.fr/source/indices/aa/aa1868.ima
    コメントありがとうございます。
    データは、1868年のもので、上から1、2、、、12月のものが並んでいます。途中にデータ以外の月データが入っています。また−1は消してから平均を出します。月ごとの平均値を出したいです。お願いします。 -- fractal? 2014-01-16 (木) 21:14:39
  • このページに掲示されているのは単なるテキストなので,大変簡単にデータ処理できます。
    そもそも,これを「ホームページから、エクセルにコピー」なんかする必要はありません。自動処理しないとしても,ページを表示させて「別名でページを保存」(Firefox の場合)するだけでよいし,保存されたファイルも,簡単に処理できます。
    このデータは実に規則正しく並んでいるので,それを利用すれば,以下のような関数でファイルごとに12ヶ月分の平均値を求めることが出来ます。
    getMean <- function(url) {
      a <- scan(url)
      stopifnot(length(a) == 3012)
      a <- matrix(a, 251)[-(1:3),]
      apply(a, 2, function(x) mean(x[x != -1]))
    }
    > getMean("http://isgi.latmos.ipsl.fr/source/indices/aa/aa1868.ima")
    Read 3012 items
     [1] 10.55645 15.96552 19.72177 20.97917 16.39919 17.94583
     [7] 21.45565 19.37097 24.03750 25.94355 13.32083 13.68952
    引数 url には,Web 上のページをそのまま読むなら "http://isgi.latmos.ipsl.fr/source/indices/aa/aa1868.ima" を指定,事前に作業ディレクトリに保存してあればそのファイル名("aa1868.ima" など)を指定します。
    scan(url) で,見出し行にある 3 個の数値も含み,12ヶ月分の全てのデータ(3012 個)を読み込みます。
    matrix(a, 251)[-(1:3),] で,3 個の余分なデータも含め一ヶ月分251個のデータを列として持つ 251×12 の行列にし,余分なデータのある 1 〜 3 行を取り除きます。
    apply(a, 2, function(x) mean(x[x!= -1])) により,列ごと(12ヶ月分)の平均値を求めます。ただし,x[x!= -1] により,値が -1 である要素を除いた平均値を求めます。
    というような具合。
    あとは,URL を規則的に変化させ,そのたびに getMean を呼ぶように for ループでも作れば良いのです。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-16 (木) 21:24:35
  • 具体的な方法ありがとうございます。いろいろやってみます。 -- fractal? 2014-01-16 (木) 22:54:57
  • お世話になっています。aa指数の月ごとのデータを作って、月ごとの平均を出していくことにしました。データは32列8行になっていて、例えば1月は8行のみ24個のデータで合計248個です(1日8個のデータ)。データはaa11868.txtのようになっています。このとき、Rで平均をだす時のプログラムをおしえていただけないでしょうか。月ごとのtxtファイルを作って、手動で計算して月ごとの平均を出していきます。よろしくお願い致します。 -- fractall? 2014-01-18 (土) 08:54:52
  • > aa指数の月ごとのデータを作って、月ごとの平均を出していくことにしました。
    データは手作業で作るつもりなんですか?なぜそんな面倒なことをしようと思うのか不思議ですが。プログラムは簡単です。わざわざ関数化する必要もないくらいですが,たくさんのファイルを処理するためには,このようにしておく方が扱いやすいかな?
    getMean2 <- function(fileName) {
      x <- scan(fileName)
      mean(x[x != -1])
    }
    getMean2("aa11868.txt")
    このレベルのプログラムを求めるというのでは,たくさんあるファイルに対してこの関数を適用するという部分を自分でプログラム化するのはとても,無理と言うことでしょうか?ファイル名の規則性はどのようになっていますか? -- 河童の屁は,河童にあらず,屁である。? 2014-01-18 (土) 09:24:30
  • 早速のプログラムありがとうございました。まずは簡単なプログラムでできることを確認して、可能であれば効率的にできるようにしていきたいと考えています。早速Rに入力してみました。最後に求めたい平均を表示させるには何を入力すればいいのでしょうか。いろいろ入力してみましたが出てきません。 -- fractall? 2014-01-18 (土) 10:16:31
  • > 最後に求めたい平均を表示させるには何を入力すればいいのでしょうか getMean2("aa11868.txt") とすれば表示されるでしょう?なお,引数の文字列は実際のファイル名に直してくださいね。
    > まずは簡単なプログラムでできることを確認して、可能であれば効率的にできるようにしていきたい
    最初に示したものが十分簡単だと思いますが。手作業も不要だし。
    もしかして,あなたは前に書いていたように,データを Excel に入れて Excel 形式で保存したのでしょうか?単なるテキストファイルに保存するか Excel で入れたのなら csv ファイルとして書き出しておく必要がありますよ。基礎的な事項について確認しておく必要がありますよ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-18 (土) 13:59:17
  • 最初に示していただいた方法でうまくいきました!!本当にありがとうございました。getMean( )までプログラムに入れていたため動きませんでした。各年の、月ごとのデータの平均が一瞬で計算され本当に楽です。これで100年分のデータが簡単に計算できそうです。Rはすごいですね。データはtxtで保存していました。本当にありがとうございました。 -- fractall? 2014-01-18 (土) 16:18:17
  • 年ごとの平均値を出すには、最初に示していただいたプログラムの、 apply(    ) を mean(a[a != -1]) に変えればいいでしょうか? お願いします。 -- fractalll? 2014-01-18 (土) 18:13:22
  • > 年ごとの平均値を出すには、最初に示していただいたプログラムの、 apply(    ) を mean(a[a != -1]) に変えればいいでしょうか
    それではだめですよ。やり方はいろいろありますけど,単純には,getMean の定義はそのままで
    files <- c("aa11868.txt", "aa11869.txt", "aa11870.txt", ...)
    sapply(files, getMean)
    とすればよいでしょう(プログラムの各部分がどのように機能しているのかはっきり分からないまま,適当にいじくっても動きませんよ。動いたように見えても,正しい答えが得られないことが多いでしょう。)。
    しかし files を自分で 100 個分書くのは骨折り損のくたびれもうけと言うべき愚行。もしファイル名が規則的に付いているなら,上の files をその規則を利用して,機械的に作ればよいのです。だから前に,「ファイル名の規則性はどのようになっていますか?」と聞いたのです。
    sapply のかわりに for ループで書く方法もあります。この質問の下の質問が参考になるでしょう。そこでは,load 関数の引数のファイル名を paste(object, "RData", sep = ".") で作っています。
    実に簡単なことのはずなのですが,あなたにとっては簡単なことですか? -- 河童の屁は,河童にあらず,屁である。? 2014-01-18 (土) 18:16:53
  • 説明が不十分で申し訳ありませんでした。前に示していただいたプログラムを使えるように、ファイルは1年ごとに作ってあります。したがってファイル名はaa1950.txtのようになります。このファイルをいれて、先ほどいただいたプログラムに入れて計算すると月ごとの平均値が12個出てしまいます。うまく全体の平均が出せるといいのですが。 -- fractal? 2014-01-18 (土) 19:42:56
  • > 先ほどいただいたプログラムに入れて計算すると月ごとの平均値が12個出てしまいます。うまく全体の平均が出せるといいのですが。
    おお,いつの間にか,年平均を求めるというように課題が変わっていたのね。それならば,
    getMean3 <- function(url) {
      a <- scan(url)
      stopifnot(length(a) == 3012)
      a <- matrix(a, 251)[-(1:3),]
      mean(a[a != -1])
    }
    でよいわけですね。失礼しました。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-18 (土) 20:17:41
  • とんでもありません。私の説明不足でご迷惑をおかけしてすみませんでした。年平均の計算うまくいきました。手計算の結果とも一致しています。それから、間違っていると指摘されたのですが、最初に示していただいたプログラムの、 apply(    ) を mean(a[a != -1]) に変えて計算した結果とも一致します。偶然でしょうか。 -- fractal? 2014-01-18 (土) 22:08:40
  • > apply(    ) を mean(a[a != -1]) に変えて計算した結果とも一致します。偶然でしょうか。
    前のコメントで,それで良いですと,謝罪したでしょう? -- 河童の屁は,河童にあらず,屁である。? 2014-01-18 (土) 23:14:36
  • 私の確認不足ですみませんでした。両方同じでした。ありがとうございました。 -- fractal? 2014-01-19 (日) 08:03:39

バイナリセーブした複数のデータフレーム形式オブジェクトの読み込みと結合

よる? (2014-01-16 (木) 15:29:06)

以前に似たような質問をしており恐縮なのですが、複数のバイナリセーブしたデータフレーム形式のオブジェクトを読み込み結合したいと思っています。ファイル名は「Data」に続いて日付と拡張子(.RData)のついたファイルが複数格納されているときに(例えば、Data20121101.RData, Data20121102.RData, ... Data20151231.RData)、特定の日付けのファイル(例えば、100日ぶん)をRに読み込んで一つのデータフレームにまとめるにはどうすればいいでしょうか?

それぞれのファイルは以下のようになっていて形式は同じです。

> Data20121001
  a          b        c
1 1  0.7420626 6.166458
2 2 -0.2008887 6.347304
3 3  1.4550494 6.860432

ファイルがテキスト(アスキー)形式のときは「複数ファイルを、ファイル名を指定して読み込み、一つのデータフレームにまとめる方法」にて質問させていただき解決したのですが、バイナリセーブされた.RDataでは読み込む前にオブジェクト名が割りあてられているために応用できずにいます。

  • 以下のようにすることもできるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-16 (木) 16:37:33
    file <- "Data20121001.RData" # 起点となるファイル名
    n <- 3 # 連結したいファイル数(日数)
    date <- as.Date(paste(substr(file, 5, 8), substr(file, 9, 10), substr(file, 
        11, 12), sep = "-"))
    file.Name <- as.character(date + 0:(n - 1))
    result <- NULL # 結果
    for (i in file.Name) {
        string <- as.character(i)
        object <- paste("Data", gsub("-", "", string), sep = "")
        load(paste(object, "RData", sep = "."))
        result <- eval(parse(text = sprintf("rbind(result, %s)", object)))
        # 読み込んだオブジェクトを消去しておきたいとき
        eval(parse(text = sprintf("rm(%s)", object)))
    }
    result
  • なるほどです!感服いたしました!!ありがとうございます。 -- よる? 2014-01-16 (木) 16:54:29

周波数精度をある程度高めで、wavelet処理するときに適してるwaveletの種類や、そうするときの設定について

buynnnmmm1? (2014-01-15 (水) 19:15:11)

wavelet処理できるRのパッケージはかなりあります。パッケージによって、用意されてるwaveletが異なると思います。私はまだwmtsaのwavCWTしか試してないのですが、周波数精度を比較的高目(時間精度はある程度犠牲にして)、処理したい場合、お勧めのwaveletパッケージや、それに適したwaveletのタイプについて教えてください。

(wmtsaの場合、ちょっと試した感じでは、wavelet="morlet", shiftをデフォルトよりちょっと大きめにすると、周波数精度を比較的高めの結果がでるのですが、高い周波数にあるはずのないピークがあらわれやすくなります。)

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

無題

(2014-01-12 (日) 23:19:08)

最近の質問者は,ありがともいえないのな...

パッケージのインストールができない

松浦? (2014-01-12 (日) 11:25:36)

install.packagesによってcar他のパッケージをインストールしようとしていますが、Would you like to use a personal library instead? というメッセージが出て、Noと回答するとインストールできず、Yesと回答するとファイルは保存されるもののlibraryで呼び出すことができません。

パソコン(windows8です)のセキュリティの問題かもしれませんが、対応策をご存じの方がいらっしゃればご教示いただきたくよろしくお願いします。

  • Win7ですが非管理者権限でcarパッケージのインストールを試してみました。同様のメッセージにYesと答えると、続けて"Would you like to create a personal library C:/Users/username/Documents/R/win-library/3.0 to install packages into?"と聞かれ、これにもYesと答えたら無事に個人用パッケージとしてインストールできました。ユーザ個人用パッケージのインストール場所が作れないと失敗するのかもしれません。管理者としてのインストールはできないご事情なのでしょうか? -- 2014-01-12 (日) 13:10:14
  • 上手に検索するのもテクニックのうち
    "Would you like to use a personal library instead" をそのまま検索語として検索すると出てくるこのページは,答えも含むし,そのほかの状況に対するソリューションを提供している,優れたページだと思いますね。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-12 (日) 21:27:05

2つのcolumで共通する行を削除する方法

R初心者? (2014-01-12 (日) 09:05:52)

R初心者です。
初めての投稿になりますよろしくおねがいいたします。

質問内容ですが、以下のような二つのcolumを作成した場合、

> x<-c("a","b","c")
> colum1<-matrix(x)
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
> y<-c("a","b","c","d","e")
> colum2<-matrix(y)
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "d" 
[5,] "e" 

colum2からcolum1の要素を削除するにはどのようにしたらよいでしょうか?
以下の様に2つのベクトルを結合し、unique()を用いましたが、

> unique(rbind(colum1,colum2))
     [,1]
[1,] "a" 
[2,] "b" 
[3,] "c" 
[4,] "d" 
[5,] "e" 

重複した”a”,"b","c"が残ってしまいます。
非常に基礎的質問だとおもわれますが、ご回答頂ければ幸いです。
尚、動作環境は以下の様に成ります。

R version 3.0.1 (2013-05-16)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
  • いくら R の初心者でも,ここへの投稿方法まで初心者だからという甘えは捨ててもらいたいものですが。
    なぜ行列にしたいのかという真意は分からないが,
    > setdiff(colum2, colum1)
    [1] "d" "e"
    が参考になるかな? -- 河童の屁は,河童にあらず,屁である。? 2014-01-12 (日) 09:07:55

(再度質問)wmtsaパッケージでWavelet解析を行ないました。周波数分解能を上げるにはどうしたら良いのでしょうか? †

buynnnmmm1? (2014-01-11 (土) 21:31:22)

https://box.raksul.com/dl/bdbc45c2b62ff6a3ec489de2cf300f94

元データファイルと、処理したRソースを添付してます。

テスト用の音声ファイルは 1秒ごとに、880Hz,1760Hz,3520Hzのsin波の音になってます。
それを tuneRというパッケージの readWaveファイルで読み込んで、もともとステレオじゃない音ファイルのleftのデータを処理して時間と周波数の処理をしてます。

waveletまったく勉強しようとしてないわけじゃなく、図書館で本はかりて読んだっこはありますが、理解できてません。いろいろな種類の波形で処理ですっていうのと、連続と不連続の処理のしかたがある程度わかってます。

周波数の精度をあげると、時間の精度がさがると考えてて、(間違ってるかもしれませんが、)今のデフォルトのwavelet処理(wmstsaの wavCWTと wavDWT )はデフォルトだと、周波数分解能が悪いと思ってます。周波数方向(縦軸方向)でかなりぼやけてるので。


いっぽう、seewaveっていうパッケージもみつけてまして、こちらは、ちゃんと確認してませんが、マドをつくって、短時間のフーリエ変換して、周波数成分の時間変化をspectroで可視化できます。こちらは、窓の大きさを調節すればかなり周波数の精度をあげれました。デフォルトでもかなり縦方向(y軸方向)に狭くなってて、わかりやすいと思ってます。

waveletにしようと思ったのが、もっと周波数精度があがると思いました。数学的に、これいじょう細かく分解できない、周波数と時間に分解してくれるイメージがあったので(これもちゃんと理解できてないので、間違ってるのかもしれません。)


ということで、やりたいことは、時間の精度をもっと下げて、周波数の精度を上げたデータ処理をwaveletをつかってやりたいのですが、やり方がわかりません。

wavCWTとかに、周波数の分割数を変更するパラメータがあったのですが、それではほとんど変化ありませんでした。

本をかりたのはかなり前なのですが、その本では理解できなかったので、わかりやすい資料も探してます。これ読んで理解できたという資料があれば、それも紹介お願い致します。

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

  • wavCWTの関数で取れる引数の他のものもふってみました。 n.scaleを200にしても同じグラフになりました。shiftやvarianceもふってみましたが周波数の精度があがることはありませんでした。他のwaveletのパッケージでもやってみようと思います。 -- buynnnmmm1? 2014-01-12 (日) 15:59:16
  • wavCWTの関数で取れる引数の他のものもふってみました。 n.scaleを200にしても同じグラフになりました。shiftやvarianceもふってみましたが周波数の精度があがることはありませんでした。他のwaveletのパッケージでもやってみようと思います。 -- buynnnmmm1? 2014-01-12 (日) 21:12:16
  • 独り相撲を,取っているようですが,それぞれの関数およびその引数がどういうことをやるのか確認(確信)してやっているのでしょうか?闇雲にやっても無駄だと思います。直接のアドバイスにはなりませんが,重要なことだと思います。 -- 独り相撲? 2014-01-12 (日) 21:16:11
  • とりあえずやってみました。引数の意味はよくわかってません。(n.scaleだけは意味わかってますが。) 確認してみます。 分解するのにつかってるwaveletの幅を広くしたら希望の処理になると思うのですが、そのやり方がわかりません。他のwaveletのパッケージもためしてみて、確認してみます。 -- buynnnmmm1? 2014-01-12 (日) 23:38:39
  • waveletの種類を変更したら、デフォルトよりかなり周波数精度の良い結果が得られました。wavelet="morlet" にしました。このタイプのwaveletはDWTではサポートされてないそうです。周波数にあわせて、自動的に時間幅を調節してくれるはず(間違ってるかも)なので、短時間フーリエ変換の時間窓を調節する操作にあたるのは、waveletの波形の選択にあたるのもかもしれません。間違ってるようなら指摘お願いします。のこりのパラメータ、shiftとvarianceはまだ意味わかってません。 -- buynnnmmm1? 2014-01-13 (月) 09:48:54
  • さらにマニュアルを確認するとmorletの場合はshiftを与える意味があるってことだったので、shiftを1にしたり、shiftを50にしたりしました。(デフォルトのshiftは5)shiftを大きくすると周波数精度があがるようです。shiftを小さくすると、周波数精度が下ってました。意味についてはまだ未確認です。 -- buynnnmmm1? 2014-01-13 (月) 10:01:18
  • 周波数精度をあげてCWTをしたい場合は、wavelet="morlet" にして shift=50 とか大きな値にすれば良いようです。 shiftを変更したときのmother waveletの形がわかってないので、確認します。多分時間窓を広げたのと同じ効果がある形になってるのだと思います。(waveletの中の波の数が多分多い。) -- buynnnmmm1? 2014-01-13 (月) 10:04:41
  • "morlet wavelet" でネット検索すると http://paos.colorado.edu/research/wavelets/wavelet2.html に式がありました。パラメータとして周波数を変更できるようになってるので、窓内にどれだけの波を入れれるか調節できるようになったwaveletのようです。 -- buynnnmmm1? 2014-01-13 (月) 14:10:50
  • wavCWTのソースをちょっと調べてみました。 waveletをmorletにした場合は、shiftのみが意味のある引数になってました。 haarのときはshift,varianceは無意味になるようです。gaussian1,gaussian2の場合は、varianceのみを処理関数にわたしてました。 -- buynnnmmm1? 2014-01-13 (月) 15:32:53
  • wavCWTが呼びだしてるのは ifuitools パッケージの RS_wav_xform.c "RS_wavelets_transform_continuous_wavelet" でした。そこでもまた他の関数呼んでて、その先はまだ調べてません。処理の本体がどこにあるのかまだ調べきれてません。 -- buynnnmmm1? 2014-01-13 (月) 15:35:17
  • ifuitools の RS_wav_xform.c "RS_wavelets_transform_continuous_wavelet" にあった。そこから wavuniv_transform_continuous_wavelet() を呼んでて,それは ifuitools の src/wav_cwt.c にあった。 しかし morletの式はそこになくて、他の場所で処理してるようです。また暇なときに、探してみつけたら書いておきます。 -- buynnnmmm1? 2014-01-14 (火) 01:04:12
  • ifuitoolsの src フォルダで grep -n -i morlet * すると -- buynnnmmm1? 2014-01-14 (火) 01:06:59
  • ut_RS.c:315: *type = WAV_FILTER_MORLET; wav_cwt.c:245: * WAV\_FILTER\_GAUSSIAN\_II, and WAV\_FILTER\_MORLET wav_cwt.c:252: * If the filter is of type WAV\_FILTER\_MORLET, then wav_cwt.c:407: * WAV\_FILTER\_GAUSSIAN\_II, and WAV\_FILTER\_MORLET wav_cwt.c:414: * If the filter is of type WAV\_FILTER\_MORLET, then wav_cwt.c:557: case WAV_FILTER_MORLET: wav_filt.c:80:#undef LOCALDEF_MORLET_CONSTANT wav_filt.c:81:#define LOCALDEF_MORLET_CONSTANT(W) \ wav_filt.c:143: case WAV_FILTER_MORLET: wav_filt.c:205: case WAV_FILTER_MORLET: wav_filt.c:210: MUTIL_ERROR( "Morlet frequency shift omega0 must be a positive value." ); wav_filt.c:237: case WAV_FILTER_MORLET: wav_filt.c:239: ampweight = sqrt( 2.0 * MUTIL_PI ) * LOCALDEF_MORLET_CONSTANT( omega0 ); wav_filt.c:291: case WAV_FILTER_MORLET: wav_filt.c:293: /* morlet = C * sqrt( 2 * PI ) * exp( -W^2 / 2 ) * ( 1 - exp( ( W^2 - W0^2 ) / 4 ) ) ほんたいは wav_filter.cにあるようです。 -- buynnnmmm1? 2014-01-14 (火) 01:09:43
  • wav_filt.c の mutil_errcode wavuniv_filters_continuous にわたした引数を処理するルーチンがあって、case WAV_FILTER_MORLET: omega0 = filter_arg; となってました。 式をみると morlet = C * sqrt( 2 * PI ) * exp( -W^2 / 2 ) * ( 1 - exp( ( W^2 - W0^2 ) / 4 ) ) がコメントにはいってるので、オメガ0の周波数として、wavCWTのshiftは処理されるようです。 wavelet="morlet"の場合は。 -- 2014-01-14 (火) 01:20:24
  • gaussian1,gaussian2は、std=sqrt(variance) として、処理は同じく ifuitools の src/wav_filt.c にありました。 以上で、渡した引数でどのようなmother waveletを使用するのか、確認できました。 -- buynnnmmm1? 2014-01-14 (火) 01:38:59
  • ω0とscaleを変更してmorletのwaveletをグラフ化してみると、ω0の周波数を大きくしたときに、形がかなり変化しており、上で予想したように、単純に窓の中の波の波数が多くなってるだけではなく、sacleによって、大きく波の数が異なる(波の数が激減する場合がある)waveletになってました。そのためだと思うのですが、低い周波数のところに、あるべきでないピークがでてました。 shiftを増やすと、waveletのなかの数は増える傾向になりますが、一様に増えるのではなく、scaleによって、かなり波の数にばらつきがでる増えかたになるようです。morletの場合。 -- buynnnmmm1? 2014-01-14 (火) 11:45:57

wmtsaパッケージでWavelet解析を行ないました。周波数分解能を上げるにはどうしたら良いのでしょうか?

buynnnmmm1? (2014-01-11 (土) 19:19:03)

テスト用のオーディオファイルを作成して、それをwavelet処理し、比較的周波数分解能の良い処理を行ないたいと思ってます。しかしどのパラメーターを変更したら周波数分解能をあげて、時間分解能を下げれるのか良くわかりません。

seewaveという短時間フーリエ変換で時間と周波数の表示をするものがあって、そちらの方が周波数分解能がデフォルトで高いように思います。
こちらは窓を広くすると時間分解能がおちて周波数分解能があがるのですが。

http://note.chiebukuro.yahoo.co.jp/detail/n242822

の「wmstsaの場合」 の 「処理例」のところに1秒ごとに、880Hz,1760Hz,3520Hzのsin波の音を作って、それを処理して可視化したものをはりました。

処理はぜんぶデフォルトの条件で処理して、パラメーターは変更してません。

tuneRパッケージのwaveReadで音声ファイルを読み込んで、left要素のみをtsで時系列に変換してから、wavCWT と wavDWT にかけて、その出力をplot関数にかけただけです。

一番下のwaveseeの出力はspectro関数にかけて出力しました。

wavelet解析について、ほとんどなにも知りません。もし良い入門サイトや資料があれば、それも教えていただければ幸いです。



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

  • 質問が漠然としており,提示された URL もボンヤリしていて(書かれているスクリプトをそのまま実行しても,エラーになる。当たり前だろう data が何を指しているか,第三者にはわからないのだから),何をどうやってどういう結果になったのだけど,本当はどんな結果が欲しいのだというのが,はっきりしない。あなたの真意を知るために,あなたの意向に沿うように,色々やってくれる人はいるだろうか??
    > wavelet解析について、ほとんどなにも知りません
    そうですか。昔は,図書館に行ったりしていたものですけどね。
    投稿における注意事項」を読んでから!だね。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-11 (土) 20:26:19
  • すみません、おっしゃるとおりです。データがちょっと多きいので、どうやって上げるか考えます。再度質問させていただきたいと思います。またお願い致します。 -- buynnnmmm1? 2014-01-11 (土) 21:16:57

主成分分析について�

いんせ? (2014-01-09 (木) 12:26:29)

コメントありがとうございます. 冒頭部分の

> data(…)
> prcomp(…)

の括弧内にエクセルのデータを入力しようとしました.
ファイル名を入れたり,実際の因子の名前などを入れて,

D<-read.csv("R bact3.csv",header=T)
D$A系-1<-factor(D$A系-1)
D$A系-2<-factor(D$A系-2)
head(D)
summary(D)
data(D)
prcomp(D)

としても,

 警告メッセージ: 
In data(D) :  データセット ‘D’ がありません 
> prcomp(D)
 以下にエラー colMeans(x, na.rm = TRUE) :  'x' は数値でなければなりません 

とでます.

どうすればよいのでしょうか.

  • data 関数が何をするものか分かっていますか?分かっていたらそんなもの書かないでしょう。
    D$A系-1<-factor(D$A系-1) などとしているので,数値データではなく,Factor になってしまっているんですよ。
    それにしても,列の名前が「A系-1」なんでしょうか?マイナスなんて,列の名前になり得ないので,「factor(D$A系-1)」 は,「D の "A系" 列の値から 1 引いたものを Factor にすると解釈されるでしょうし,「D$A系-1」に代入しようとした段階でエラーになるでしょうに??
    ファイルの他の部分にミスがある可能性もある。上の方にある「ファイル添付」機能を使って,データをここにアップロードしてみたら,すっきりする。
    記事の書き方を確認した方がよいですよ。下の方にあるお行儀の悪い記事をまねしてはいけません。今回は私が清書しておきますけど。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-09 (木) 14:32:44
  • こんな初歩段階で躓いているなら、インターネットで断片的に情報を得るのではなく、Rで主成分分析を扱う入門解説書を読まれて、体系的に理解された方が早道だと思いますよ。それから、自分が使う関数のヘルプは全て目を通すべきです。呪文やおまじないではなく、それぞれの関数には意味がありますし、自分が何をしているのか、データがどう処理されているのか把握するのが解決の近道だと思います。 -- 2014-01-09 (木) 19:06:56
  • > もし問題が解決した(結局解決しない場合を含め)場合はその旨報告していただくとコメント者や他の人に参考になります。また後で関連情報をこのWikiに要約記事としてご投稿いただくと今後の参考になります。 -- 2014-01-11 (土) 18:53:14
  • それはデータを数値型にしてないのではないかと思うけど、apply(x,as.numeric)というのがあるので、使ってみたら -- Keiyoo? 2014-09-24 (水) 12:45:23

主成分分析について

いんせ? (2014-01-09 (木) 00:35:30)

初めまして.Rを使い始めたばかりの初心者ですが,主成分分析をしなければなりません.データ元はエクセルで管理しているので,エクセルの拡張子をcsv形式にしてから,データをRに取り込んで作業しています.
他の簡単な操作では,エクセルから呼び出すことができるのですが,主成分分析では,エラーが出てしまい,作業が進みません.
つまり,ほぼ最初からうまくいっておりません.

自分でもいろいろ調べたりしているのですが,やはりわかりません.
勉強不足でありながら,誰かに聞くのは甘えでしかありませんがどなたか,具体的な手順など教えていただければ幸いです.

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

  • 「具体的な手順など教えていただければ」といわれても,漠然としてますよね。
    どのようなコマンドで読み込もうとして,どのようなエラーメッセージが出たのかを具体的に書かないと... -- 河童の屁は,河童にあらず,屁である。? 2014-01-09 (木) 09:48:39

時系列の相関係数

しょう? (2014-01-03 (金) 14:50:11)

コメントありがとうございました。
なんとか計算ができました。

2つの時系列があった場合、それらの変化の仕方、上がったり下がったりの様子の類似度を見る相関係数のようなものはRにあるのでしょうか?

いわゆる相関係数が小さくても、時系列はよく似た変化をするものがあります。
どれくらい似ているかを数値化したいのですが。

  • VARモデルで検討されるなら、varsパッケージを使われるとよいでしょう。時系列分析の書籍はたくさんありますので、どの方法が自分にとって適切なのか勉強されてください。また、Rで時系列分析をされるなら、時系列分析のTaskViewを一読した方が良いでしょう。 -- 2014-01-03 (金) 15:32:39
  • > いわゆる相関係数が小さくても、時系列はよく似た変化をするものがあります
    それは,タイムラグの調整をしたら相関係数も高くなると言うような場合でしょう。普通,相関係数が低いのに似ているなんてことはないでしょう。いずれにせよ,相関係数,相互相関係数,自己相関係数などや時系列データについて基礎的な勉強をする必要があるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-03 (金) 16:09:19
  • コメントありがとうございました。相関係数が低いのに似ている例の図を添付します。相関係数は0.172ですが、2つの変化の仕方はよく似ています。データは先ほど添付したNAO,Sunspotです。 -- しょう? 2014-01-03 (金) 17:22:49
  • > 相関係数が低いのに似ている
    それはあなたの主観。ラグなし(左)だとたいして似ていない。相関係数は 0.177。ラグ1(右)にすると少し似ているが,それでも相関係数は 0.384 とそんなに高くない。数値は信頼できないと思うかも知れないが,主観よりはましなことが多い。私としては,あなたの主観よりは相関係数の値を信じる。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-03 (金) 18:04:24
    corr.png
  • 時系列分析の専門家ではないので妥当かどうか分かりませんが、適当に平滑化してラグを4ほどとれば相関係数は0.92まで上がりますよ。 -- 2014-01-03 (金) 19:45:13
    > n <- lowess(seq_along(nao$V1), nao$V1, f = 1/3)
    > s <- lowess(seq_along(sun$V1) - 4, sun$V1, f = 1/3)
    > cor(s$y[5:54], n$y[1:50])
    [1] 0.9167944
    20140103a.png
  • 平滑化をどの程度とるかにもよるが,結果として,「相関係数が0.92」になるなら似ているでしょう。「*相*関*係*数*が*低*い*の*に*似ている」ということではなくなるのでね。
    図を見ると,直線相関は 0.92 かも知れないけど,両者の相関はほとんど 1 といってもよいくらい関連があると言うことが分かるなあ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-03 (金) 19:50:50
    corr2.png
  • まぁということで、(元データの)相関係数は低いがノイズを除去してやると両者は似ている(相関係数が高くなる)ということで、視覚化による観察(主観)も重要なツールという結論でよろしいのではないでしょうか。 -- 2014-01-03 (金) 20:22:30
  • コメントをいただいた人に感謝します。主観が重要であるというのは私も同感です。sunspotを遅らせていますが逆に進めたらどうなるでしょうか。NAOは気候の指数ですので黒点の指数の方が進んでいると物理的には説明がしやすいのですが。 -- しょう? 2014-01-03 (金) 21:57:49
  • 「主観が」じゃなくて「主観も」ね。視覚化はあくまでも探索的分析で、分析の入り口。最終決定には統計量による根拠が必要だと思うよ。sunspotを進めるのは自分で確認して下さい。河童さんが指摘されるとおり、基礎的な勉強が先だと思いますよ。 -- 2014-01-03 (金) 22:31:34

2つのファイルからデータを読んで相関係数を計算

しょう? (2014-01-02 (木) 20:05:12)

2つのcsv ファイルにある時系列の数字を読み込んで、2つの相関係数を求めることはできるでしょうか。
プログラムをを教えていただけるとうれしいです。

  • まずは,2つの CSV ファイルにデータがどんな風にあるかを示さないとね。
    2つの CSV ファイルに,同じ行数のデータフレームとしてデータがあるとすれば簡単でしょう。それぞれのデータフレームの列名を x,y とすれば,cor(read.csv("data1")$x, read.csv("data2")$y) とかね。
    それとも,それぞれのファイル中に数値がカンマで区切られて入っているということなら cor(scan("data1", sep=","), scan("data2", sep=",")) などね。
    ようするに,詳細を書かないと適切な回答は得られませんよ。ということ。-- 河童の屁は,河童にあらず,屁である。? 2014-01-02 (木) 20:50:54
  • 早速のコメントに感謝します。 -- しょう? 2014-01-02 (木) 21:42:30
  • 2つのExcelのcsvファイルです。中味は700の数字が並んでいます。気象の時系列データです。ファイル名は1.csvと2.csvです。よろしくお願いします。 -- しょう? 2014-01-02 (木) 21:45:18
  • じゃあ,後半に書いたようにやれば良いのかな?まだ,情報は不足だけど,不足だと言うことが分からないならしょうがない。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-02 (木) 22:11:44
  • ありがとうございます。前者の方法から$x $y を除くと動き始めました。ファイルによっては、'<81>@' に不正なマルチバイト文字があります というエラーがでます。数字を確認してみましたが正常です。どんな原因が考えられるか教えてください。お願いします。 -- しょう? 2014-01-03 (金) 08:58:26
  • > 前者の方法から$x $y を除くと動き始めました。
    それは,あなたのファイルに,データが1行に一つずつ入力されていると言うことでしょう。$x とか $y は例としてあげただけで,実際にはファイルの1行目は変数名があると言うことでしょうかね。1行目が変数名ではないというなら,1行目の数値データが変数名と誤解されて入力されているかも知れない。ーーそう言うところが,情報不足ということなんですけどね
    > どんな原因が考えられるか教えてください
    情報不足というか,そのようなエラーが再現できるデータを提示すればすぐ分かることなんですけどね(上の方の「ファイル添付」によって,ファイルをアップロードすれば?)。ようするに,実際のファイルのエンコーディングがRが期待しているエンコーディングと違うと言うことです。日本語の含まれるファイルをシステムエンコーディングの異なるOSで読み込もうとしたということ(Windows と Mac とかね)。数字は正常というからには,変数名が日本語で付けられているのでしょう。
    問題をすっきり解決するためには,情報をちびちび出すのは,やめたほうがよいですよ。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-03 (金) 09:42:10
  • ありがとうございます ファイルを添付したいと思います -- しょう? 2014-01-03 (金) 10:32:30
  • 今、ファイルを3つアップロードしました -- しょう? 2014-01-03 (金) 10:35:36
  • いくつか問題があります。
    (1) 2つのデータファイルの一行目は変数名ではないので,read.csv("nao54.csv") としてしまっては,1行目を変数名として読んでします。read.csv("nao54.csv", header=FALSE) としなければなりません。read.csv や read.table について,オンラインヘルプを読むべきです。
    (2) sunspots54.csv はファイルの最後55行目〜58行目に非数値文字がくっついています(これが「不正なマルチバイト文字」です)。read.csv("sunspots54.csv", header=FALSE, fileEncoding="cp932") などとして読み込んだ後,不要な行を削除する必要があるでしょう(前もって,ファイルから削除してもよいでしょうが)。
    (3) 以下のようにするのがベター。なぜそうする方がよいかは,説明が面倒くさい。cor(read.csv("nao54.csv", header=FALSE)$V1, read.csv("sunspots54.csv", header=FALSE)$V1)
    (4) これはどうでもよいことですが,プログラムにおいて,代入記号として = を使うのはお勧めではありません。
    (5) 記事の投稿法について読んでおくことをお勧めします。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-03 (金) 11:36:01
  • この「非数値文字」って全角空白ですね。表計算ソフトだと見えないし、このレベルの質問者に気づけというのは酷だなぁ。回答する側も、実物のcsvを見せてもらわないとこんなの分かるわけないし、想定外。今回は実物を見せてもらって良かったケースだな。CP932の全角空白のコードを調べたら0x8140だとか。0x40は@だから<81>@になるのも首肯できる。しかし、それを回答者に気づけというのも酷だ。河童さんも私もCP932なんて使わないし。 -- 2014-01-03 (金) 13:08:45

別ファイルから共通した項だけを抽出

シップスクラーク? (2013-12-30 (月) 23:19:13)

2つの別ファイルから共通した項だけを抽出したいです。
あるdata1というファイルとdata2というファイルがあるとします。例えば
data1

xy,yz
9530,087361
9690,186479

data2

xz,zy
9690,547895
5121,168415

とデータだとすると、この2つのデータの左側の値が同じだった場合にその行の値を出力したいです。そのような方法はありますでしょうか?このデータは下に続いていると考えてください。Rを使い始めてまだ日が浅いので、別々のファイルでのデータの扱い方などがあまり理解出来ていないので、よろしくお願いします。

  • merge(data1, data2, by.x="xy", by.y="xz") で。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-31 (火) 10:45:14
  • 回答ありがとうございます。ただ、示されたとおりにプログラムを作ってみたのですが、Error: unexpected symbol in "merge( data1"と出てしまいます。これは、data1自体がないということなのでしょうか?実際にはdata1はファイルは存在します。それとも他に問題があるのでしょうか? -- シップスクラーク? 2014-01-02 (木) 11:27:57
  • data1 <- read.csv("data1") 程度は補ってくださいな。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-02 (木) 11:47:17
  • それは事前に入れたうえでの話です。すみません、分かりづらくて・・・ -- シップスクラーク? 2014-01-02 (木) 11:53:14
  • あなたがコンソールに打ち込んだものとRからのエラーメッセージ,全体をコピーして,ここにペーストして見せてくださいな。なにをどうやればそんなメッセージが出るのか?理解できない。 -- 河童の屁は,河童にあらず,屁である。? 2014-01-02 (木) 11:58:22
    > data1 <- read.csv("data1")
    > data2 <- read.csv("data2")
    > merge(data1, data2, by.x="xy", by.y="xz")
        xy     yz     zy
    1 9690 186479 547895
  • エラーからすると、コピペするときに後ろの「..., by.y="xz") で。」あたりまで巻き込んだとか。 -- 2014-01-02 (木) 12:50:19
  • もし問題が解決した(結局解決しない場合を含め)場合はその旨報告していただくとコメント者や他の人に参考になります。また後で関連情報をこのWikiに要約記事としてご投稿いただくと今後の参考になります。 -- 2014-01-11 (土) 18:54:22
  • 返事が遅れてすみません。始めの'data1'とmerge(data1・・・)が打ち間違いで一致していませんでした。お手数をおかけしてすみません。 -- シップスクラーク? 2014-01-28 (火) 07:08:04

お礼です  まだエラーが出ます プログラムも示します

しょう? (2013-12-27 (金) 18:04:33)

警告メッセージ: 
1: In eval(expr, envir, enclos) :
   複素数の虚部は、コネクションで捨てられました 
2: In eval(expr, envir, enclos) :~
   複素数の虚部は、コネクションで捨てられました 
3: In readLines("NAO1910.txt") :
   'NAO1910.txt' で不完全な最終行が見つかりました 
4: In eval(expr, envier, enclos) :
   複素数の虚部は、コネクションで捨てられました 
5: In plot.xy(xy, type, ...) :
  plot type 'line' will be truncated to first character

ノイズをカットするプログラムです

x <- c(1, 1, 1, 1, 0, 0, 0, 0)
y <- fft(x)
z <- fft(fft(x), inverse = TRUE)/length(x)
round(z, digit = 4)
as.double(z)

# cut high frequency from mid-lag

# i.e, the center part
mid <- (length(y) + 2)/2
lag <- 1
yy <- y
for (i in (mid - lag):(mid + lag)) {
	yy[i] <- 0
}

w <- fft(yy, inverse = TRUE)/length(yy)
q <- as.double(w)
plot(q)

### NAO ###

# source data IOD_ENSO_NAO/NAO-monthly-Jim-Hurrell-1870-2000-1d.txt

# xsource<- readLines("NAO50-08.txt")
xsource <- readLines("NAO1910.txt")

xorg <- as.double(xsource)

# take part (e.g, 600 month =50 years)

# x<-xorg[(length(xorg)-708+1):length(xorg)]
x <- xorg[(length(xorg) - 1236 + 1):length(xorg)]

# standardize(normalize)
sx <- (x - mean(x))/sd(x)

## fft
len <- length(sx)
y <- fft(sx)

# cut high frequency
mid <- (length(y) + 2)/2
lag <- 250 - 1
yy <- y
for (i in (mid - lag):(mid + lag)) {
	yy[i] <- 0
}

# inverse
w <- fft(yy, inverse = TRUE)/length(yy)
q <- as.double(w)
plot(q, type = "line")

# plot(sx, type = "line")
  • あなた自身,やろうとしていることをプログラム化出来ているかどうか分かっていないのでは?
    以下の z は複素数なのに,それを実数化 as.double するのでよいのですか?(結果を代入していないのでその後それを使うのではないのだから構わないけど)
    実部,虚部を取り出すには Re(), Im(),絶対値は abs() などがありますが??
    z <- fft(fft(x), inverse = TRUE)/length(x)
    round(z, digit = 4)
    as.double(z)
    しかし,もう一度同じことをやっている以下のところで,エラーが出るのも同じですよ。複素数を as.double している。
    「複素数の虚部は、コネクションで捨てられました」というエラーメッセージにあるように,虚数部を捨てて良いの?
    w <- fft(yy, inverse = TRUE)/length(yy)
    q <- as.double(w)
    「'NAO1910.txt' で不完全な最終行が見つかりました」は,読み込んだファイルの最後が改行文字でないと言うこと。
    基本的には,エラーがある行の次にエラーメッセージが出るのだから,エラーメッセージの前の行が原因だということ。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-27 (金) 20:11:32

ありがとうございます

しょう? (2013-12-27 (金) 17:33:19)

as.double()にしたら動きました。ありがとうございました。
ただ、次のエラーが出てしまいました。助けてください。

1: In eval(expr, envir, enclos) :
   複素数の虚部は、コネクションで捨てられました 
2: In eval(expr, envir, enclos) :
   複素数の虚部は、コネクションで捨てられました 
3: In file(con, "r") :
   ファイル 'NAO1910.txt' を開くことができません: No such file or directory
  • エラーのでるプログラム部分をみないと,真の原因はわからないでしょう。
    3 は,作業ディレクトリにそのようなファイルがないということ。getwd() であなたが設定している作業ディレクトリを確認しましょう。あなたが思っている通りのディレクトリが設定されているなら,list.files() でそこにあるファイルの一覧を表示させてみましょう。その中に 'NAO1910.txt' はありますか?拡張子が間違えている場合や,拡張子が二重に付いている場合などがありますよ。'NAO1910.txt.dat' になっていたりとか。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-27 (金) 17:43:13

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

しょう? (2013-12-27 (金) 15:41:52)

下のエラーが出てしまい困っています。
アドバイスください。

以下にエラー eval(expr, envir, enclos) : 
   関数 "as.real" を見つけることができませんでした
  • as.real()はR3.0以降で廃止されています。as.real()ではなく、as.double()を使います。 -- 2013-12-27 (金) 15:49:33

TSAパッケージのgarch.simについて

みかん? (2013-12-26 (木) 14:38:02)

投稿失礼します。
TSAパッケージのgarch.simに入っているrndというオプションを利用して、自由度を指定したt分布のシュミレーションを行いたいのですが、自由度を指定したところうまく動作しませんでした。
このパッケージではt分布の使用ができないのでしょうか?また、t分布を用いたgarchモデルの推定とシュミレーションができるパッケージがありましたら、お教え頂ければ幸いです。

  • 「自由度を指定したt分布のシュミレーション」とはどういうことを意図しているのでしょうか?
    一応,garch.sim の rnd 引数は random number generator for the noise; default is normal ということで,デフォルトは rnd = rnorm なので,t 分布に従う乱数を使いたいなら rnd = rt でよかろうと思ったのかもしれませんが,garch.sim をトレースしてみると分かりますが,x[1:d] = rnd(d, sd = sqrt(sigma2)) として使われるわけです。rt では sd なんて引数はないし,rt で必要な df の引数はないしで, 以下にエラー rnd(d, sd = sqrt(sigma2)) : 使われていない引数 (sd = sqrt(sigma2)) などというエラーがでるのも当たり前。
    作者の意図は置いておくとして,すくなくとも現在の garch.sim では rt は使えないでしょう。どうしても使いたいなら,garch.sim を書き直す。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-26 (木) 17:12:44
  • お教え頂きありがとうございます。助かりました。 -- みかん? 2013-12-26 (木) 18:50:13

複数ファイルを、ファイル名を指定して読み込み、一つのデータフレームにまとめる方法

よる? (2013-12-25 (水) 22:56:31)

ディレクトリに「t」に続いて日付と拡張子(.txt)のついたファイルが複数格納されているときに(例えば、t20121101.txt, t20121102.txt, ... t20151231.txt,)、特定の日付けのファイル(例えば、100日ぶん)をRに読み込んで一つのデータフレームにまとめるにはどうすればいいでしょうか?
それぞれのファイルは以下のようになっていて形式は同じです。

> t20121001
            x          y           z
1  -0.9139121  0.9233681  1.34668386
2  -0.4414702  1.7249676 -0.03165230
       :
9   0.6055080 -0.8037918 -3.16458153
10 -0.5272891 -1.2061249  1.42032382

ディレクトリにあるすべての.txtファイルを読み込む際は、

library(plyr); d=ldply(dir(getwd(), "*.txt"), function(x) read.table(x, h=T))

として読み込めたのですが、日付を特定しようとするとうまくいきません。
例えば、以下のようにしてファイル名のベクトルをつくって試してみたのですが、

dateval = format(seq("2010/11/01", by="1 days", length=100, "%Y%m%d")
filename = paste("t", dateval, ".txt", sep="")
d=ldply(dir(getwd(), dateval), function(x) read.table(x, h=T))

dir(getwd(), dateval)の部分で、datevalが最初の値(dateval[1])しか使われていないようで、うまくいきませんでした。
また、少し蛇足になってしまうかもしれませんが、11月10日から11月30日までのデータを呼ぼうとして以下を実行すると、11月すべてのデータが呼ばれてしまいました。

dir(getwd(), "t201211*")
 [1] "t20121101.txt" "t20121102.txt" "t20121103.txt"...
 [8] "t20121108.txt" "t20121109.txt" "t20121110.txt"...
[15] "t20121115.txt" "t20121116.txt" "t20121117.txt"...
[22] "t20121122.txt" "t20121123.txt" "t20121124.txt"...
[29] "t20121129.txt" "t20121130.txt"

なぜ、"t20121101.txt"等が呼ばれてしまうのでしょうか?
上記の問題解決作をご教授いただければ幸いです。

  • > 11月10日から11月30日までのデータを呼ぼうとして以下を実行すると、11月すべてのデータが呼ばれてしまいました。
    > dir(getwd(), "t201211*")
    > なぜ、"t20121101.txt"等が呼ばれてしまうのでしょうか?
    あなたがそのように指定したからです。* は何でもよいというワイルドカードですからt20121101.txt だって該当するでしょ?
    その場合だけの対応ならば
    dir(getwd(), "t201211[1-3][0-9]")
    とすればよいでしょうけど,一般性はないですね。
    一般的に,指定したファイルだけを連結するならば,まずは対象ファイル名を何らかの方法で文字ベクトルとし,以下のようにする。
    以下では,1110〜1130 だからそのようにしたけど,他の規則があったり全くなかったりならそのように。
    x <- sprintf("t201211%02i.txt", 10:30)
    # x <- c("t20121112.txt", "t20121115.txt", ..., "t20121124.txt") などなんでも
    result <- NULL
    for (i in x) {
    	d <- read.table(i, header=TRUE)
    	result <- rbind(result, d)
    }
    result
    どうでしょ? -- 河童の屁は,河童にあらず,屁である。? 2013-12-26 (木) 00:14:15
  • *は「0回以上マッチ」なので"t20121"のあとに"1"があってもなくてもマッチするはずです。ワイルドは"."(ピリオド)。日付けの指定はas.Dateした後で比較演算子を使う方法を覚えると幸せになれるかもしれません。 -- 2013-12-26 (木) 12:28:11
  • 河童の屁は,河童にあらず,屁である。さん、ご回答いただきありがとうございます。読み込みのコード案を示していただき大変感謝しております。 -- よる? 2013-12-27 (金) 12:09:46
  • ワイルドは*でなく、ピリオドなのですね!勉強になりました。これだけでも十分幸せですが、as.Dateと比較演算子でさらに幸せになれる気がします。ありがとうございました。 -- よる? 2013-12-27 (金) 12:13:23
  • グロブと正規表現を混同されていると思います。dir()に与えるマッチパターンは、グロブではなく正規表現です。ファイル名の展開にはグロブを使うのが常道であるため混同されたのだと思いますが、この機会にそれぞれどう違うのか調べてみられたらどうでしょう。 -- 2013-12-27 (金) 15:25:48
  • グロブと正規表現について調べてみました。知識の世界が広がった気がします。ご教授ありがとうございました。 -- よる? 2014-01-16 (木) 14:57:58

rpartのCPについて

rpt? (2013-12-17 (火) 10:26:36)

お世話になります。
ライブラリrpartのCP(Complexity Parameters)について、理解できないで困っています。
例えばirisデータで次のように入力しますと

> library(rpart)
> iris.rpt <- rpart(Species ~ ., data=iris)
> printcp(iris.rpt)
Classification tree:
rpart(formula = Species ~ ., data = iris)

Variables actually used in tree construction:
[1] Petal.Length Petal.Width 

Root node error: 100/150 = 0.66667

n= 150 

    CP nsplit rel error xerror     xstd
1 0.50      0      1.00   1.23 0.047053
2 0.44      1      0.50   0.67 0.060888
3 0.01      2      0.06   0.08 0.027520

のようにCP表が出力されます。
これについて大滝他「応用2進木解析法」(日科技連)によりますと、CPはrel errorに基づいて次のように計算するものとされ、

> 0.6667*(1-0.5)
[1] 0.33335
> 0.6667*(0.5-0.06)
[1] 0.293348

上記の出力結果のCPと一致しません。
回帰ツリーの場合は、rel errorがRSS比のことだということはよくわかるのですが、分類ツリーの場合のrel errorそのものについて、私が理解していないからかもしれません。

どなたか、この不一致の理由がわかる方、御教示いただければ幸いです。

  • たとえば,http://datamining.togaware.com/survivor/Complexity_cp.html によれば,
    The "Root node error: 67/105 = 0.6381" in R is a baseline error rate (i.e., the error we get if we classified everything as setosa). The table following this message then expresses the decrease in error relative to this baseline error:
    と書かれています。
    0.6667を掛けるか掛けないかだけの違いで,本質的なものではないのでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-17 (火) 18:06:26
  • 御回答ありがとうございます。 すると、同じMin+1*SEルールを使っても、CARTとrpartでは採用されるCPが異なるわけですね。 しかし、rel errorの出力が今ひとつよくわかりません。 次のように成長させるツリーのサイズを大きくして、ツリーとCPテーブルを表示しますと、
    > iris.rpt2 <- rpart(Species ~ ., data=iris, 
    + control = rpart.control(minsplit=4, cp=0.0001))
    > iris.rpt2
    n= 150 
    
    node), split, n, loss, yval, (yprob)
          * denotes terminal node
    
     1) root 150 100 setosa (0.33333333 0.33333333 0.33333333)  
       2) Petal.Length< 2.45 50   0 setosa (1.00000000 0.00000000 0.00000000) *
       3) Petal.Length>=2.45 100  50 versicolor (0.00000000 0.50000000 0.50000000)  
         6) Petal.Width< 1.75 54   5 versicolor (0.00000000 0.90740741 0.09259259)  
          12) Petal.Length< 4.95 48   1 versicolor (0.00000000 0.97916667 0.02083333)  
            24) Petal.Width< 1.65 47   0 versicolor (0.00000000 1.00000000 0.00000000) *
            25) Petal.Width>=1.65 1   0 virginica (0.00000000 0.00000000 1.00000000) *
          13) Petal.Length>=4.95 6   2 virginica (0.00000000 0.33333333 0.66666667)  
            26) Petal.Width>=1.55 3   1 versicolor (0.00000000 0.66666667 0.33333333) *
            27) Petal.Width< 1.55 3   0 virginica (0.00000000 0.00000000 1.00000000) *
         7) Petal.Width>=1.75 46   1 virginica (0.00000000 0.02173913 0.97826087) *
    > printcp(iris.rpt2)
    ...
    
    Root node error: 100/150 = 0.66667
    
    n= 150 
    
          CP nsplit rel error xerror     xstd
    1 0.5000      0      1.00   1.16 0.051277
    2 0.4400      1      0.50   0.59 0.059828
    3 0.0200      2      0.06   0.09 0.029086
    4 0.0100      3      0.04   0.09 0.029086
    5 0.0001      5      0.02   0.07 0.025833
    のようになりますが、rel errorを各ステップにおける誤分類数と理解すると
    > (100/150)/(100/150)
    [1] 1
    > (50/150)/(100/150)
    [1] 0.5
    > (6/150)/(100/150)
    [1] 0.06
    > (3/150)/(100/150)
    [1] 0.03
    となり、4行目以降の数値が合いません。 また、次のようなモデルのCPテーブルを出力しますと、
    > Country2 <- factor(60, levels=c("Japan", "Others")) #初期化 
    > Country2[car.test.frame$Country=="Japan"] <- "Japan"
    > Country2[car.test.frame$Country!="Japan"] <- "Others"
    > car.rpt <- rpart(Country2 ~ Price + Mileage + Type + Weight + Disp. + HP, 
    +         data=car.test.frame, control=rpart.control(cp=0.001, minsplit=5))
    
    > printcp(car.rpt)
    ...
    Root node error: 19/60 = 0.31667
    
    n= 60 
    
            CP nsplit rel error xerror    xstd
    1 0.157895      0   1.00000 1.0000 0.18964
    2 0.105263      1   0.84211 1.2632 0.19972
    3 0.035088      6   0.31579 1.2105 0.19821
    4 0.001000      9   0.21053 1.0526 0.19218
    のように、一部の分岐のみしか表示されず、CPテーブルの表示ルールがわかりません。 重ねての質問で、誠に恐縮ですが、御教示いただければ幸いです。-- rpt? 2013-12-18 (水) 15:18:30

データフレームの列を追加する方法?

koheizm? (2013-12-13 (金) 19:58:51)

データフレームに一定数の列を指定して追加する方法を考えております。

下の方に列を追加していく関数のQAがありましたが、それとは少し違って単純に列を追加したくおもいます。
rodiaさんのソースを拝借

dat <- cbind(rep(x=c("male", "female"), times=10, each=2),
            rep(x=c("A", "AB", "B", "O"), times=10, each=2))
colname(dat) <- c("sex", "blood")

このようなデータフレームがあるとしてsexとbloodの列の隣に複数行追加したいです。
入れる値は0でもNULLでも構いません。

現在は列数の違うデータフレームを統合する必要が生じて、ダミー列を作りたいなと思って詰まってしまいました。ご教授お願いします。

  • 返信ありがとうございます。いえ、それぞれの隣ではなくてまとめて追加を考えてます -- koheizm? 2013-12-13 (金) 23:39:56
  • あなたのはデータフレームなのだから,あんなソースを引用してもだめ。
    sex と blood それぞれの隣に列を追加するの?以下のようにしても良いけど。
    add.rows <- function(d, n, m) { # d: データフレーム,n, m: 追加列数
       nr <- nrow(d)
       x <- data.frame(matrix(0, nr, n+m))
       return(cbind(d[1], x[1:n], d[2], x[-(1:n)]))
    }
    # 使用例
    dat <- data.frame(sex=rep(x=c("male", "female"), times=10, each=2),
                      blood=rep(x=c("A", "AB", "B", "O"), times=10, each=2))
    x <- add.rows(dat, 2, 4)
    head(x)
    しかし,あなたが本当にやりたいのがダミー行列の追加であるなら,枠だけ作っておいて後で値を埋めるなんてことしなくても,もっと効率的なプログラムをかけるでしょう。元の変数の隣にダミー行列を付加するなんてこともその後の利用を考えるとかえって使いにくいのでは? -- 河童の屁は,河童にあらず,屁である。? 2013-12-13 (金) 23:34:04
  • まとめて追加するなら,もっと簡単。 -- 河童の屁は,河童にあらず,屁である。? 2013-12-13 (金) 23:42:48
    add.rows2 <- function(d, n) { # d: データフレーム,n: 追加列数
    	nr <- nrow(d)
    	x <- data.frame(matrix(0, nr, n))
    	return(cbind(d, x))
    }
    # 使用例
    dat <- data.frame(sex=rep(x=c("male", "female"), times=10, each=2),
                      blood=rep(x=c("A", "AB", "B", "O"), times=10, each=2))
    x <- add.rows2(dat, 4)
    head(x)
  • 返信ありがとうございます。いえ、それぞれの隣ではなくてまとめて追加を考えてます -- koheizm? 2013-12-13 (金) 23:47:06
  • ご丁寧にありがとうございます。勉強させていただきます。 -- koheizm? 2013-12-14 (土) 00:06:26

プログラム中で生成した連番付きのオブジェクトを保存するには?

よる? (2013-12-12 (木) 14:09:07)

以下のコードで生成したf1, f2, f3, ... というオブジェクトを、save関数を使ってプログラム中で、それぞれのオブジェクトを.RDataで保存するにはどうすればいいでしょうか?

x <- 1:10
for (i in 1:10) {
  assign(paste("f", i, sep=""), x[i])
}

実際のiは1:100000だったり、c("test1", "test2", ...) だったりします。

  • 「.RDataで保存」というのはよくわからないけど,どうしてもそのようにしたいということならば,個別のファイルに保存するなら以下のようにでも。 -- 2013-12-12 (木) 16:15:57
    > x <- 1:10
    > for (i in 1:10) {
    + 	name <- paste("f", i, sep="")
    + 	assign(name, x[i])
    + 	eval(parse(text=sprintf("save(%s ,file=\"%s\")", name, name)))
    + }
  • ご教授ありがとうございます。.txt や .csv だと1つのファイルで 50MB を越えてしまうのでできるだけ容量を小さくしようとRDataにしようとしました。 -- よる? 2013-12-13 (金) 09:40:51
  • ↑ バイナリファイルとして保存ということなのね。save はバイナリセーブですよ。 -- 2013-12-13 (金) 10:41:56
  • save()はcompression_levelオプションで圧縮レベルを指定できますよ -- 2013-12-14 (土) 22:05:53
  • > もし問題が解決した(結局解決しない場合を含め)場合はその旨報告していただくとコメント者や他の人に参考になります。また後で関連情報をこのWikiに要約記事としてご投稿いただくと今後の参考になります。 -- 2014-01-11 (土) 18:55:51
  • ご返信が遅れて申し訳ありません。皆さんのご教授により解決いたしました。 -- よる? 2014-01-16 (木) 14:52:31

legendの座標について

レジェ? (2013-12-10 (火) 19:53:22)

お世話になります。Windows XP, R3.0.1を使用しています。
以下のようなグラフの凡例の少し左側に、別の凡例を追加したいと考えています。そのために引数"topright"の座標の情報を取り出したいのですが、どのようにすればよいでしょうか?もしくはもっと簡単な方法があればご教示願います。
お手数ですが、ご回答宜しくお願いします。

plot(rnorm(50), rnorm(50), xlim=c(-3,6), ylim=c(-3,3))
legend("topright", "sin", col="red", pch=3)
  • legend関数の返り値では不十分なのですか? -- 2013-12-10 (火) 21:11:37
  • legend関数に返り値があったのですね。a$rect$left と a$rect$top で目的を達成できました。ありがとうございました。 -- レジェ? 2013-12-11 (水) 08:05:16

EGARCHの実行について

みかん? (2013-12-10 (火) 15:35:26)

投稿失礼します。R初心者です。
EGARCHモデルを推定しようとして、以前あったegarchパッケージを探したのですが、パッケージのダウンロードサイトでは見つかりませんでした。このパッケージの入手方法をご存知の方がいましたら、お教え頂ければ幸いです。また、egarchパッケージを使用しない推定方法がありましたら、お教え頂ければ幸いです。

  • 検索してみました?
    Package ‘betategarch’ December 9, 2013
    Simulation, estimation and forecasting of Beta-Skew-t-EGARCH models というのはあるようですが。 -- 2013-12-10 (火) 16:01:15
  • お教え頂きありがとうございます。本当に助かりましたm(_ _)m -- みかん? 2013-12-10 (火) 16:13:56

openofficeのデータが読み込めない

R初心者? (2013-12-08 (日) 17:41:10)

投稿失礼します。
「統計学 Rを用いた入門書」で初めてRを勉強しはじめた者です。
ですが、数ページにして詰まってしまいました。。
excelを持っていないため、openofficeを使用しcsv形式にしたら

> worms <- read.csv("略/worms.csv",header=T,row.names=1)
    Warning message:
    In scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :
    EOF within quoted string

と出てきました。
odsのままにしてみたり、RopenofficeなるものをPCに入れようともしたのですが、開けないか開いてもバグった表が出てきました。
どなたかアドバイスいただけると嬉しいです!
よろしくお願い致します。

  • openoffice のデータが読み込めないのではなく,openoffice で保存した csv ファイルが読めないということなので,その csv ファイルに異常がないか確認するのが本筋でしょう。特に,引用符で始まった文字列の途中でファイルが終わっちゃったよといっているのですから,ファイルのケツの方なんでしょう。 -- 2013-12-08 (日) 17:50:52
  • Ropenofficeパッケージのread.ods()は、(たぶんread.xls()の類も同じでしょうが)そのまま読み込むので、表データ以外のものがごちゃごちゃ入っていると後処理などが必要になります。OpenOffice?からエキスポートしたcsvは、正常に読み込めない場合、正しいcsvになっているかどうかテキストエディなどで確認すべきです。OpenOffice?でエキスポートすると時々おかしなことになっています(カンマ切りではなくタブ区切りになっているとか)。あと、文字コードの方は大丈夫ですか?CP932を前提としている時代遅れなOSだと要注意ですよ。提示されたエラーメッセージは、引用符で開始された文字列が閉じない状態でファイルが終端になっているという意味ですが、そのエラーを引き起こす原因は別にある可能性はあります。 -- 2013-12-09 (月) 13:35:20

psychはダウンロード出来ているようなのですが、パッケージとして存在していない

0.444? (2013-12-08 (日) 17:36:36)

psychはダウンロード出来ているようなのですが、パッケージとして存在していない旨のメッセージが出てきて使用できません。

> library(psych)
Error in library(psych) : there is no package called ‘psych’

なおパッケージのインストールは既にRcmdrでも行っており、こちらと同じ手順でダウンロードしたのですが。
よろしく

  • > こちらと同じ手順でダウンロードした
    どちらと同じ手順? -- 2013-12-08 (日) 17:51:54
  • 失礼しました。パッケージのインストールは既にRcmdrでも行っており、psychもRcmdrと同じ手順でダウンロードし、Rcmdrは使用可能でpsychは使用できません。 -- 0.444? 2013-12-08 (日) 17:58:08
  • ダウンロード≠インストールですが、そこは大丈夫ですか?文面からRcmdrはインストールしたようですが、psychインストールしましたか?インストール済みのパッケージ一覧はlibrary()で表示されます。なお、インストールの方法は何種類もあり、それぞれのトラブルシューティングが異なります。人によって好みがあり、インストールのやり方が違います。インストールの方法を内緒にしては誰も助言できませんよ。 -- 2013-12-09 (月) 13:42:39

列を追加していく関数を作りたい

rhodia? (2013-12-05 (木) 18:07:48)

お世話になります。OS:Win7 64bit R3.0.2

以下のように男性女性の性別のカラムと血液型のデータを用意しました。
sexカラムがmaleであれば列を一行足して1,femaleならば0という関数を作りたく思います。

dat <- cbind(rep(x=c("male", "female"), times=10, each=2),
             rep(x=c("A", "AB", "B", "O"), times=10, each=2))
colname(dat) <- c("sex", "blood")
tmp_fnc <- function(x) {
  if (x == "male") x$m_flg = 1
  else x$m_flg = 0
}
tmp_fnc(dat)

その結果このようにメッセージが出てきます。

Warning messages:
1: In if (x == "male") x$m_flg = 1 else x$m_flg = 0 :
  the condition has length > 1 and only the first element will be used
2: In x$m_flg = 1 : Coercing LHS to a list

ゴールとしてはsexカラムの中身がmaleならばm_flgが1になり、それ以外なら0とダミー変数をすべて0,1でつくりたいと考えております。
ご指導頂きたく思います。

  • データ構造としては,データフレームを使う方がよいでしょう。
    で,あなたが望むことは,結局の所,1 列目が male なら 1,female なら 0 という値を取る変数を 3 列目に作るということでしょう。
    これをするのに,関数は不要です。ベクトル演算するだけですから。
    dat <- data.frame(sex=rep(x=c("male", "female"), times=10, each=2),
                      blood=rep(x=c("A", "AB", "B", "O"), times=10, each=2))
    dat$m_flg <- (dat$sex == "male")+0 # この一行でできます
    dat
    なお,データフレームの場合,文字型で入力したデータは Factor になるので,(dat$sex == "male")+0 の部分は 2-as.integer(dat$sex) やその他のやり方もあります。また,transform や with 関数を使うやり方もあります。
    なお,なお,「 [heart] 投稿文書の書式 [heart] 」 を読むべし。
    整形済みテキスト
    行頭が半角空白で始まる行は整形済みテキストとなります。行の自動折り返しは行なわれません。
        整形済みテキストは、他のブロック要素の子要素になることができます。
        整形済みテキストは、他のブロック要素を子要素にすることができません。
        整形済みテキストは、すべての子要素を文字列として扱います。
    ということです。あなたの記事は,私が修正しておきました。-- 河童の屁は,河童にあらず,屁である。? 2013-12-05 (木) 19:15:10

barplotについて

じゅん? (2013-12-04 (水) 14:56:33)

お世話になります。Windows XP, R 3.0.1を使用しています。
以下のようにbarplotを実行しました。

bmp(filename = "bar.bmp", width=1400, height=600)
par(mar=c(5,5,4,2))
barplot(round(runif(100)*2000,0), names.arg=1:100, las=3,
        ylim=c(1,2000), ylab="value")
dev.off()

この結果を以下のように変更したいと思っています。どのようにすればよいかご教示頂けますか。

・y軸の0〜500を表示したい
・y軸と最初の棒グラフの間隔が空きすぎなので狭くしたい
・x軸の項目名が棒グラフの右寄りにずれているので中心に寄せたい

お手数ですが、宜しくお願いします。

  • (1) ylim=c(0,2000) とする
    (2) xaxs="i" とする
    (3) 文字サイズにもよるのかしれませんが, Mac 版では中央に位置しているように見えますが... -- 河童の屁は,河童にあらず,屁である。? &new{2013-12-04
    barplot(round(runif(100)*2000,0), names.arg=1:100, las=3,
            ylim=c(0,2000), ylab="value", xaxs="i")
    sample.png
  • ご回答ありがとうございました。xaxs="i" という素敵な変数があったのですね。項目が右寄りになるのはWindowsの問題かもしれませんね。
    sample2.PNG
  • Ubuntu 13.10でも右寄りになりませんよ。しかもOSXやUbuntuと比べて、Windowsだと位置が下の方になりますね。Windowsのフォントは汚いと噂には聞いていましたが、本当だったのですね:-p -- 2013-12-05 (木) 10:34:45
    barplot-ubuntu.png
  • Mac 版ならば,bmp にする必要はなく,Quartz も pdf も,最高レベルにきれいです。 -- 2013-12-05 (木) 11:01:44
    sample-pdf.png

各項目の最大値のみを抽出する方法

KKNN? (2013-12-02 (月) 16:30:27)

初めて質問させて頂きます。
各項目の最大値のみを抽出する方法を教えて頂きたいのです。
例えば、下記のようなデータフレームがあるとします。

大統領名   在任期間     知名度
A                        1                          43
A                        2                          51
A                        3                          65
B                        1                          45
B                        2                          55

上記の様なデータテーブルにおいて、各大統領において、在任期間が最大値の時の知名度を抽出したいのです。具体的に言うと、上記のテーブルから、 下記のようなサブセットを抽出するにはどのようにすれば良いでしょうか。宜しく御願い致します。 

大統領名   在任期間     知名度
A                         3                        65
B                         2                        55
  • こんな感じかな -- 2013-12-02 (月) 17:01:24
    > (a <- data.frame(大統領名 = factor(c("A", "A", "A", "B", "B")),
                       在任期間 = c(1:3, 1:2),
                       知名度 = c(43, 51, 65, 45, 55)))
      大統領名 在任期間 知名度
    1        A        1     43
    2        A        2     51
    3        A        3     65
    4        B        1     45
    5        B        2     55
    > by(a, a$大統領名, function(x) x[which.max(x$在任期間),])
    a$大統領名: A
      大統領名 在任期間 知名度
    3        A        3     65
    -------------------------------------------------------------- 
    a$大統領名: B
      大統領名 在任期間 知名度
    5        B        2     55
    > Reduce("rbind", by(a, a$大統領名, function(x) x[which.max(x$在任期間),]))
      大統領名 在任期間 知名度
    3        A        3     65
    5        B        2     55
  • ありがとうございます。初心者なもので、入門書はいろいろと読んだのですが、(もちろん、ここの過去ログも)、どうすればよいのか分からず困っていました。有難う御座います。 -- KKNN? 2013-12-03 (火) 02:04:11

nlsについて

galois? (2013-11-30 (土) 13:27:24)

初めて質問させていただきます。
nlsで求めた式の確からしさはどのように評価したらいいのでしょうか?summaryで示されるt値やp値を使って自分で計算するのでしょうか?または赤池情報量などを用いるのでしょうか?ご存知の方、よろしくお願い致します。

  • 「式の確からしさ」とは,どういうことを意味しているのでしょうか? -- 河童の屁は,河童にあらず,屁である。? 2013-11-30 (土) 17:21:33
  • 説明不足で申し訳ありません。例えば実験で得られた100点を全て通るような式を求めた際に、全ての点を通るなら100%。実際にはそんなことはないのですが、あまりに近似曲線と実験結果が乖離していると、近似式として意味がないように思えます。どのくらいうまく近似できているかを数値として知りたいということなのです。 -- galois? 2013-11-30 (土) 18:22:15
  • 多くの場合,最も適切な回帰直線(回帰曲線)でも,「全ての点を通るなら100%」ということはありません。重回帰分析の場合はそれなりの指標はありますが,非線形回帰の場合にはその指標は適用できないという実情があります。
    非線形回帰についてもう少し学習してから質問するという手もあるかと。
    そもそも,あるデータについて,予測に使用する変数を探索するという場合には,残差平方和の大小で最適モデルを選べばそれでことがすむのではないでしょうか?それでだめならば,ブートストラップでなんとかなるのでは? -- 河童の屁は,河童にあらず,屁である。? 2013-11-30 (土) 21:15:16

rimageのインストール方法、波形画像から波形情報の取得

TA? (2013-11-25 (月) 17:37:31)

 初めて質問させて頂きます。WindowsでRに取組んで1年弱です。
 波形画像(jpg)をrimageでRに読み込み、locator()で波形の情報を読取ろうと考えています。しかし、rimageはコンソールから「パッケージのインストール」で呼び出す日本の3つのダウンロードサイトのリストにありません。そこでネットで調べて、http://cran.r-project.org からダウンロードを試みました。しかし、tarファイルであり、これだと、「ローカルにあるzipファイルからインストールする」ではエラーになります。
 どのようにすれば良いのか、途方に暮れています。windowsでのrimageのインストール方法を御存知の方があれば、御教え下さい。
 また、波形画像から、波形データをRに取り込む、もっと簡便な方法を御存知の方がいらしゃれば、その方法を御教え頂けると嬉しいです。

  • URL の記述は正確に。cran.rproject.org は cran.r-project.org とは無関係なサイトなのでね(なおしておいたけど)。また,あなたが取ってきた rimage*.tar の URL とかバージョンとか,ちゃんと書いておいた方がまともな質疑応答ができると思いますけど。
    たとえば,http://cran.r-project.org/bin/windows/contrib/2.12/ にはrimage_0.5-8.2.zip がありますけど(それ以降のバージョン対応のものはない),バージョンが低いので,R 3.0.2 なんかでは使えないのじゃないかと思いますが。R 2.12.xx を使えば,それでもよいのかもしれないけど。
    Q&A(初級者コース)/13 に,2011-11-09 の時点で,中澤さんが「現在maintainerがORPHANEDとなっているので,もうサポートされないかもしれませんが」とか,「その用途ならば,imageJ(旧NIH Image)を使う方が楽なんではないでしょうか」とか書かれていますが。 -- 河童の屁は,河童にあらず,屁である。? 2013-11-25 (月) 18:01:33
  • 要領を得ない質問にお答え頂き有難う御座います。 -- TA? 2013-12-06 (金) 15:10:23
  • 御礼が遅くなり申し訳ありません。 御紹介頂いた、rimageのzipファイルをインストールしてみましたが、やはりグ後来ませんでした。プログラムには賞味期限があるのですね。 そこで、このサイトを検索してみて、biOpsというのがあることを知り、それでトライをしています。おかげさまでやりたいことはできそうですが、表示のスピードが遅いのが気になります。また、困った場合には、是非助けてください。投稿方法も気をつけます。今回は有難う御座います。 -- TA? 2013-12-06 (金) 15:17:49

catの使い方

掃除好き? (2013-11-22 (金) 12:37:04)

CAD,WER,ASD,XDR
1262041F20124,800,182139,195001
1262041F20124,900,181347,195003
12621B6F23168,810,153436,195081
12621B6F23168,910,154315,195089
1262236A23148,810,12251,195137
1262236A23148,910,12417,195141
1262236A23148,810,1431535,195005
1262236A23148,910,1502527,195137
1262239B23166,810,155554,195005
1262239B23166,910,123231,195015
126223AE23135,810,0750073,195001
126223AE23135,910,0842509,195013

ここからCADの値が2つ続けて同じで、かつXDRの値が195001の次に195003となっている列の和を知りたいです。
そして、もしその195001の次に195003となっているのを計算し終えたら今度は195001の次に195005となっているものを、そして、XDRの値は195161まであるのでそれを全部出し終えたら、今度は195002の次が195003のものをというような感じで、それぞれの出力された結果がいくつあるかを知りたいです。

==== 195001 --> 195003 =====
1262041F20124 195001 182139
1262041F20124 195003 181347
count = 2
==== 195001 --> 195013 =====
126223AE23135 195001 0750073
126223AE23135 195013 0842509
count = 2

というような出力にしたいです。
このプログラムのどこが間違っていますでしょうか?

データ<-read.csv("データ/data.csv",header=TRUE)
foo <- function(m, k) {
  count <- 0                            ### 追加  件数をカウントする
  n <- nrow(データ)
  i <- 1
  repeat {
    if (データ$CAD[i] == データ$CAD[i+1] && データ$XDR[i] == m && データ$XDR[i+1] == k) {
      if (count == 0) {                 ### 追加  該当があるときのみ先頭に出力
        cat(sprintf("==== %i --> %i =====\n", m, k)) ### 追加 
      }                                 ### 追加 
      cat(データ$CAD[i], データ$XDR[i], データ$ASD[i] "\n")
      cat(データ$CAD[i+1], データ$XDR[i+1], データ$ASD[i+1] "\n")
      count <- count+2                  ### 追加
      i <- i+1
    }
    i <- i+1
    if (i >= n) break
  }
  if (count != 0) {                     ### 追加  カウント数を出力
    cat(sprintf("count = %i\n", count)) ### 追加 
  }                                     ### 追加 
}
データ <- read.csv("データ/data.csv", as.is=TRUE)
for (m in 195001:195161) {
  for (k in (m-1):1950162) {
    foo(m, k) # 関数を呼び出す
  }
}
  • 相変わらず,プログラムなどの提示方法について理解していないようですね。「 [heart] 投稿文書の書式 [heart] 」 を読むべし。 「読んだけどわかんね〜よ」ということでしょうか。
    整形済みテキスト
    行頭が半角空白で始まる行は整形済みテキストとなります。行の自動折り返しは行なわれません。
        整形済みテキストは、他のブロック要素の子要素になることができます。
        整形済みテキストは、他のブロック要素を子要素にすることができません。
        整形済みテキストは、すべての子要素を文字列として扱います。
    というところですよ。あなたの記事は私が修正しているので,投稿時とどこが違うかよく見てください。
    そんな簡単なことなら,「投稿文書の書式」を読めなんていわずに,最初からそういってくれればいいのに...ですか(笑)。
    エラーがあるとそれに起因するエラーがたくさん表示されて,本質を見失うことがあるとは思いますが,まずは,一番最初に出ているエラーを解消することを旨とすべし。
    +       cat(データ$CAD[i], データ$XDR[i], データ$ASD[i] "\n")
     エラー:  予想外の  文字列定数  です  in:
    "      }                                 ### 追加 
          cat(データ$CAD[i], データ$XDR[i], データ$ASD[i] "\n""
    というのは,データ$ASD[i] "\n" のところにエラーがある。つまり,データ$ASD[i] の次にいきなり文字列 "\n" が出てきたよ!ということなので,カンマで区切りなさいということですよ。この次の行も。
          cat(データ$CAD[i], データ$XDR[i], データ$ASD[i], "\n")
    それをなおせば,動くでしょう? -- 河童の屁は,河童にあらず,屁である。? 2013-11-22 (金) 13:05:18

mac版RへのDesignパッケージのインストール方法について

KK? (2013-11-22 (金) 11:41:08)

はじめまして、macでRを使い始めて四苦八苦してます
ロジスティック解析を行う際、glm関数を使うとオッズ比まで出すことができるのですが、各説明変数の95%C.Iまで出すには、lrm関数を使うとよいと聞きました。しかしデフォルトのmac版Rでは、lrmがインストールされておらず、Designパッケージをインストールしたら良いとのところまで辿り着いたのですが、Designパッケージが見つからず困っております。大変申し訳ありませんがインストール方法を教えて下さい。
またロジスティック解析にて、各説明変数の95%C.Iを出すことが目的なので、他の方法で解決できるのであれば教えてください。お願いします。

  • Designパッケージは2009年9月で更新が止まっており、現在のRに追従した対応がなされていません。本質的にDesignパッケージが必要なら対処のヒントを提示しますが、そうではないので省略します。KKさんには2つの選択肢があり、1つはepicalcパッケージなどオッズ比の95%CIを計算するパッケージを使うこと、もう1つは自分で95%CIを計算することです。後者の方が手っ取り早いと思います。summary()で回帰係数とSEが得られますのでそれらを用いて計算します。exp(回帰係数±1.96*SE)です。confint()を使ってもよいです。 -- 2013-11-22 (金) 12:13:23
  • 既に違う形の回答がなされていますが,Design packageの後継としては,rms packageがあります,作者は同じハレル先生です.勿論,lrmもこの中に含まれています.Macならパッケージインストーラーでcranから簡単にインストールできますよ. -- taipapa? 2013-11-24 (日) 02:25:13
  • 皆様有難うございます。最初にご回答頂いた方にご質問なのですが、例えば回帰係数とSEをsummaryで出力し、exp(0.09702±1.96*0.05224)とコンソールに入力したのですが、入力文字が青くなるだけで結果がでず、つぎの行にexpもしくはsummary(exp)とするとエラーになってしまいます。大変申し訳ありませんが、もう少し操作方法をご教授ください。 -- KK? 2013-11-24 (日) 15:40:28
  • ±はだめ+とーで2つの式にしてね(exp(0.09702+c(-1, 1)*1.96*0.05224) でもいいけど)
    それと、数値を直接入力するのはお勧めしない
    そういうことも考えると,やはりconfintを使うことをお勧めします(なにも,関数一つで欲しいものが全部でなければ駄目ということもないので。総称関数をうまく使うこと) -- 2013-11-24 (日) 19:42:20
  • 最初に回答した者ですが、exp(回帰係数±1.96*SE)は一般表記で、これをRの表記に翻訳する必要があります。glmの出力をmとすると、1つめの説明変数の95%CIは次のように計算します。 -- 2013-11-24 (日) 23:01:47
    > m.s <- summary(m)
    > exp(m.s$coefficients[2, 1] + c(-1, 1) * 1.96 * m.s$coefficients[2, 2])
    2つめは、
    > exp(m.s$coefficients[3, 1] + c(-1, 1) * 1.96 * m.s$coefficients[3, 2])
    です。もちろん、confint()を使ってもよいです。
  • て,ゆーか,confint を使うべきでしょう。簡単だし,全部の変数について一括して結果が出るし。それに,exp(confint(m)) と比べると分かりますが(あるいは,stats:::confint.glm を読めば分かりますが,)confint は正規分布ではなく t 分布を使って信頼区間を求めています
    どっちが良いかしらないし,lrm がどっちを採用しているか知らないけど。 -- 2013-11-24 (日) 23:21:52
  • 皆様、大変丁寧なご回答ありがとうございました。やり方を理解し無事結果がでました。ありがとうございました。 -- KK? 2013-11-25 (月) 09:34:25

windows環境でのlocaleの設定(Sys.setlocale("LC_CTYPE", "ja_JP.UTF-8")の設定)

YH? (2013-11-19 (火) 01:08:49)

はじめまして。表題の件がうまくいかなくてこちらで質問させてください。
「windows環境」で文字をja_JP.UTF-8にすることは可能でしょうか。
Sys.setlocale("LC_CTYPE", "ja_JP.UTF-8")で設定しようとすると下記のエラーがでてしまいます。

> Sys.setlocale("LC_CTYPE", "ja_JP.UTF-8.")
[1] ""
 警告メッセージ: 
In Sys.setlocale("LC_CTYPE", "ja_JP.UTF-8.") :
   ロケールを "ja_JP.UTF-8." に設定せよとの OS のレポート要求は受け入れられません 

関連する情報を探していると、三年ほど前の記事や、一年ほど前の書き込みで
http://m884.hateblo.jp/entry/20100920/1284950844
http://like2ch.com/ag/uni/math/1294561909/500
が見つかりましたが、うまくいってないようです。
また、windowsの標準の文字など他の一部の文字コードでの設定ではうまくいくようです。((Sys.setlocale("LC_CTYPE","Japanese_Japan.20932")あるいは、Sys.setlocale("LC_CTYPE", "Japanese_Japan.932")など)
しかし、"ja_JP.UTF-8"を指定するとうまくいきませんでした。
なにか、解決策がありましたらご教示頂けると幸いです。
よろしくおねがいします。

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: i386-w64-mingw32/i386 (32-bit)

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

Package(parallel) におけるクラスタ生成の失敗について

Montecarlo? (2013-11-18 (月) 01:08:24)

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

今回題名の通り Package(parallel) においてクラスタの生成に失敗したときをご教授いただきたいと思っています。

なお、 sessionInfo は以下の通りです。

> sessionInfo() 
R version 3.0.2 (2013-09-25)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] 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

本題に入りますが、Package(parallel)において[makePSOCKcluster]を実行した際に、オブジェクトに格納し忘れると、その後並列関数に代入する[cluster object]が取得できず、再度[makePSOCKcluster]を実行すると、以下のエラーが出ますが、特段問題ないのでしょうか。

> library(parallel)
> makePSOCKcluster(4)
socket cluster with 4 nodes on host ‘localhost’
> cl <- makePSOCKcluster(4)

....

 警告メッセージ: 
1:  使われていないコネクション 6 (<-hogehoge) を閉じます
2:  使われていないコネクション 5 (<-hogehoge) を閉じます
3:  使われていないコネクション 4 (<-hogehoge) を閉じます
4:  使われていないコネクション 3 (<-hogehoge) を閉じます

使われていないコネクションが警告によって閉じられているように見られますので、問題ないとは考えていますが、実際の所どうなのでしょうか。
詳しい方のお知恵を拝借したいと思っています。
どうぞよろしくお願い致します。

  • 特に何の問題もないでしょう。 -- 2013-11-18 (月) 15:52:33
  • 特段の問題がないとのことで安心しました。ご回答ありがとうございました。 -- Montecarlo? 2013-11-20 (水) 00:12:38

statconnDCOMのEvaluateメソッドについて

谷川? (2013-11-14 (木) 16:04:31)

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

VB.NETからStatconnDCOMを使用して、決定木のアルゴリズムを使用したいと考えています。
以下のようなコードを組んでおります。

Dim lConnector As IStatConnector
lConnector = New STATCONNECTORSRVLib.StatConnector
lConnector.Init("R")
lConnector.EvaluateNoReturn("library(mvpart);")
lConnector.EvaluateNoReturn("Tdata <- read.csv(""C:\\T-DATA.csv"", header=T);")
lConnector.EvaluateNoReturn("tree <- rpart(生死~等級+大人子ども+性別, data=Tdata, method=""class"");")
lConnector.Evaluate("print(tree);")   ・・・ (A)

上記の(A)の行の出力をVB.NETで加工したいと考えておりますが、以下のメッセージで実行時エラーとなります。
『この接続 ID に対する接続がありません (HRESULT からの例外: 0x80040004 (OLE_E_NOCONNECTION))』
当方の学習不足なのですが、Evaluateメソッドの戻り値を取得する方法を教えていただきたく思います。

なお、環境は以下の通りです。

VB.NET:2010
R:3.02(使用ライブラリ mvpart
statconnDCOM:3.5-1B2

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

RStudioにてMessage Translationsが反映されません

RStudio初心者? (2013-11-12 (火) 09:48:09)

RStudioにてMessage Translationsが反映されません。当方の環境2種で試してみました。

Windows Vista
R version 3.0.1, R version 3.0.2 (両方で試しました)
RStudio 0.97.551 - Windows XP/Vista/7/8  (2013-05-11)

Windows 7
R version 3.0.1, R version 3.0.2 (両方で試しました)
RStudio 0.97.551 - Windows XP/Vista/7/8  (2013-05-11)

まず、R version 3.0.1をインストール、その際Message Translationsにチェック。起動時のConsoleは以下です。

R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: i386-w64-mingw32/i386 (32-bit)
 
R は、自由なソフトウェアであり、「完全に無保証」です。 
一定の条件に従えば、自由にこれを再配布することができます。 
配布条件の詳細に関しては、'license()' あるいは 'licence()' と入力してください。 

R は多くの貢献者による共同プロジェクトです。 
詳しくは 'contributors()' と入力してください。 
また、R や R のパッケージを出版物で引用する際の形式については 
'citation()' と入力してください。 

'demo()' と入力すればデモをみることができます。 
'help()' とすればオンラインヘルプが出ます。 
'help.start()' で HTML ブラウザによるヘルプがみられます。 
'q()' と入力すれば R を終了します。 

次に、RStudio 0.97.551をインストール。起動時のConsoleは以下です。RStudio上ではエラーメッセージ等も日本語化されていません。

R version 3.0.1 (2013-05-16) -- "Frisbee Sailing"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: i386-w64-mingw32/i386 (32-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an HTML browser interface to help.
Type 'q()' to quit R.

R version 3.0.2で試しても上手くいかず、OSを Windows7に変えて上記を試しても上手くいきません。
RStudio上でMessage Translationsを反映する方法をご存知の方は、どうかご教示いただけますと助かります。どうかよろしくお願い致します。

  • RStudioを起動する際に環境変数 LANGUAGEをjaに設定したらどうなりますか。 -- 2013-11-12 (火) 10:06:26
  • 早速ご教示いただきましてありがとうございます。Rの環境変数にてLANGUAGEをjaに設定しても上手くいきません・・・。(不勉強なもので、Rの環境変数は編集できるのですが、RStudioの環境変数を編集することが出来ません)。RStudioの[Tools]→[Options]でいろいろ設定をいじってみたのですが、これも上手くいきませんでした。 -- RStudio初心者? 2013-11-12 (火) 11:03:54
  • 私の提案はRやRStudioの設定ではなくOSの操作の話です。Rの中で環境変数を変更するのではなくて、RStudioの起動時に環境変数を設定したらどうなるでしょうか。WindowsユーザではなくWindows環境も手元にないので確認できませんが、アプリの起動時に動的に環境変数を設定するときはショートカットのプロパティに書くのではなかったでしたっけ(古い知識ならすみません)。ここを参照してみてください。どうしてもRStuidoのショートカットの中で環境変数を設定する方法を理解できないのであれば、システム全体に有効な環境変数の設定をしてRStudioの起動を試してみればどうでしょう。 -- 2013-11-12 (火) 11:57:26
  • 理解出来ておらず申し訳ございません。RStudioのショートカットのプロパティにLANGUAGE=jaを追加しても上手くいきませんでした。 -- RStudio初心者? 2013-11-12 (火) 12:20:59
  • では、LANG=Ja_JP もついでに試してもらえますか。それからここを見ると、.Renvironも試す価値がありそう。 -- 2013-11-12 (火) 12:32:31
  • R-3.0.0もダメで、R-2.15.3までバージョンを落とすといけました。インストール時に「Message Translations」のチェックボックスが出来たのがR-3.0.0なので、その辺りが問題(RStudioが未対応)なのかもしれません。 -- RStudio初心者? 2013-11-12 (火) 13:41:34
  • 度々お教えいただきましてありがとうございます!まず(Rを全てアンインストールした上で、再度R-3.0.2をインストールした後)、LANG=Ja_JP も試してみましたが上手くいきませんでした。Rcmd_environは、本質的には環境変数をいじっていることに相当するかと思いますが、念のためRcmd_environ本体を修正、作業フォルダに.Renvironをコピーして・・・も試しましたが上手くいきませんでした。恐らくR-3.0.0以降は未対応なのかもしれません。どうもお騒がせ致しました。 -- RStudio初心者? 2013-11-12 (火) 13:49:52
  • なるほど。RStudioのメンテの方は気さくな方なので、バグレポートを送ってみると対応してもらえるかも知れません。ちなみに、R 3.0.2 + RStudio 0.97.551 on MacOSX 10.7.5及びR 3.0.2 + RStudio 0.97.551 on Ubuntu 13.10では日本語表示されていますよ。Windowsに固有な話でしょうね。 -- 2013-11-12 (火) 14:10:59

同じことをしていると思われるが、エラーが出てしまいます。

Montecarlo? (2013-11-11 (月) 22:16:38)

立て続けに投稿して申し訳ないのですが、以前「全てのオブジェクトとその値を表示する関数」で質問させていただいたMonteCalro?と申します。
何度も試したのですが、原因がつかめないので皆様のお知恵を拝借したく投稿します。

セッションインフォは以下の通りです。

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] 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  

以前ヒントを頂いたので、以下の関数を新たに組んでみました。

ls.val <- function() {
    ls.all <- .Internal(ls(as.environment(-1L), FALSE))
    ls.print <- ls.all[ls.all != "ls.val"]
    sapply(ls.print, function(temp) get(temp))
}

グローバル環境では問題なく意図とした動作をします。

> a <- c(1:20); b <- c(5:8); c <- letters[3:12]
> ls.val()
$a
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 
$b
[1] 5 6 7 8

$c
 [1] "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"

この関数を、関数内でデバッグに使いたいと思いましたが、エラーが出て困っています。

f <- function() {          #テスト用関数
    x <- c(10:5)
    y <- c(3:9)
    z <- LETTERS[25:15]
    browser()
}

> f()
Called from: f()
Browse[1]> ls.val()
 以下にエラー get(temp) :  オブジェクト 'x' がありません 
Browse[1]> ls()
[1] "x" "y" "z"
Browse[1]> ls.str()
x :  int [1:6] 10 9 8 7 6 5
y :  int [1:7] 3 4 5 6 7 8 9
z :  chr [1:11] "Y" "X" "W" "V" "U" "T" "S" "R" "Q" "P" "O"
Browse[1]> sapply(ls(), function(temp) get(temp))
$x
[1] 10  9  8  7  6  5

$y
[1] 3 4 5 6 7 8 9

$z
 [1] "Y" "X" "W" "V" "U" "T" "S" "R" "Q" "P" "O"

Browse[1]> c

関数「f」の中には、確かにx, y, z の3個のオブジェクトがあります。
かつ、[ls()] [ls.str()] は問題なく動作します。
そして以前教えていただいた [sapply(ls(), function(temp) get(temp)]も問題なく動作します。

なぜ、[ls.val()] は動作せず、エラーが出るのかを教えていただきたいと思います。
どうぞよろしくお願いいたします。

  • スコープの問題では? sapplyがつくった空間内でgetするわけで。 -- 2013-11-12 (火) 10:23:38
    ls.val <- function() {
      pe <- as.environment(-1)
      ls.all <- ls(envir=pe)
      ls.print <- ls.all[ls.all != "ls.val"]
      sapply(ls.print, function(temp) get(temp, envir=pe))
    }
  • ご回答ありがとうございます。 -- MonteCarlo? 2013-11-12 (火) 12:04:56
    スコープはおぼろげながら認識していましたが、sapplyの中まで認識が及んでいませんでした。
    大変勉強になりました。
    ありがとうございました。
  • よくよく [get ]を調べてみたら、引数の中にも [pos] [envir] があり、そこが原因でした。
    ありがとうございました。 -- MonteCarlo? 2013-11-12 (火) 12:39:51

順序カテゴリーデータを使った潜在クラスモデル

suho? (2013-11-05 (火) 20:54:18)

潜在クラスモデルでクラスタ分析を行いたいデータがあります。

poLCA、Flexmix packageのマニュアルを読んだのですが、わからなかったのでお教えいただけないでしょうか。

なお、環境は以下の通りです。

> sessionInfo()
R version 3.0.2 (2013-09-25)
Platform: i386-w64-mingw32/i386 (32-bit)

扱いたいデータは、3000人にアンケートを行い、ある商品の選択理由を、20項目中から5項目を回答してもらったデータです。

ただし、回答してもらった5項目は、「最も強い選択理由(1番目)」〜「5番目の選択理由」というように、順番があります。

生データの状態は以下です(サンプルですが)

[ID]  [1st]  [2nd]  [3rd]  [4th]  [5th]
0001    5      8      4      19    10
0002    13     2      15     3     19
・・・

このような順序カテゴリーデータで、潜在クラスモデルを行えるRパッケージはあるのでしょうか?

poLCA、Flexmixのマニュアルで見つけられず。。。。(もし読み落としていたら申し訳ありません)
ご教示いただけますと大変ありがたいです。よろしくお願い致します。

全てのオブジェクトとその値を表示する関数

Montecarlo? (2013-11-03 (日) 18:26:50)

今回このWikiを検索しても分からなかったので、皆さんのお知恵をお貸し頂きたいと思い投稿します。

セッションインフォは以下の通りです。

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: x86_64-w64-mingw32/x64 (64-bit)

locale:
[1] 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  

さて、質問内容ですが、現在の環境下のすべてのオブジェクトを表示する関数を書くことはできますか?
(グローバル環境で実行すると、その環境内にあるオブジェクト。関数のデバッグ中ではその関数内のオブジェクト)
具体例では、オブジェクトを以下のように代入します。

val.a <- c(1, 2, 3);  val.b <- c(4, 5, 6);  val.c <- c(7, 8, 9)
chr.x <- c("x", "y", "z");  chr.y <- c("Taro", "Hanako", "Jiro")

その際に、ある関数hogeを実行すると以下のような答えが返ってきてほしいと思っています。

(list <- list(val.a = val.a, val.b = val.b, val.c =val.c, chr.x = chr.x, chr.y = chr.y))
$val.a
[1] 1 2 3

$val.b
[1] 4 5 6

$val.c
[1] 7 8 9

$chr.x
[1] "x" "y" "z"

$chr.y
[1] "Taro"   "Hanako" "Jiro"  

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

  • もっとうまい方法もあるのでしょうが,以下のようなものも。例題のような各オブジェクトが同じ長さのときには提示されたものとは違ったフォーマットになりますが,一般的には,提示されたものと同じような表示形式になると思います。 -- 河童の屁は,河童にあらず,屁である。? 2013-11-03 (日) 19:36:17
    > val.a <- c(1, 2, 3);  val.b <- c(4, 5, 6);  val.c <- c(7, 8, 9)
    > chr.x <- c("x", "y", "z");  chr.y <- c("Taro", "Hanako", "Jiro")
    > sapply(ls(), function(x) eval(parse(text=x)))
         chr.x chr.y    val.a val.b val.c
    [1,] "x"   "Taro"   "1"   "4"   "7"  
    [2,] "y"   "Hanako" "2"   "5"   "8"  
    [3,] "z"   "Jiro"   "3"   "6"   "9"  
    > val.a <- 1:5;  val.b <- 10:19;  val.c <- 100:103
    > chr.x <- letters[1:7];  chr.y <- c("Taro", "Hanako", "Jiro")
    > sapply(ls(), function(x) eval(parse(text=x)))
    $chr.x
    [1] "a" "b" "c" "d" "e" "f" "g"
    
    $chr.y
    [1] "Taro"   "Hanako" "Jiro"  
    
    $val.a
    [1] 1 2 3 4 5
    
    $val.b
     [1] 10 11 12 13 14 15 16 17 18 19
    
    $val.c
    [1] 100 101 102 103
  • ls.str()みたいな関数を考えいるのかな? -- 2013-11-03 (日) 19:44:26
    > ls.str()
    chr.x :  chr [1:3] "x" "y" "z"
    chr.y :  chr [1:3] "Taro" "Hanako" "Jiro"
    val.a :  num [1:3] 1 2 3
    val.b :  num [1:3] 4 5 6
    val.c :  num [1:3] 7 8 9
  • ls.str みたいなものなんでしょうね。全要素を出力する必要があるかどうか書かれていないので,判定不能。ls.str を改作するというのも一つの手法ですね。もっとも,数万もの要素を持つオブジェクトの全要素を書かれても困るので,ls.str で十分ということでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-11-03 (日) 21:34:45
  • ご回答ありがとうございました。
    私の意図とする部分は「河童の屁は,河童にあらず,屁である。」さんのほうに近いのですが、[ls.str]関数も場合によって使い分けていきたいと思います。
    ありがとうございました。
    お二方の意見を基に以下の関数を組んでみました。 -- Montecarlo? 2013-11-04 (月) 13:23:00
    hoge <- function(x) {
        sapply(x, function(temp) get(temp))
    }
    hoge(ls())

出力方法

掃除好き? (2013-11-01 (金) 15:25:53)

先ほども質問させてもらったのですが、また少し困ったことが起こりました。先ほどのプログラム自体は上手くまわったのですが、データ量が多いため、出力結果が非常に見難いため、求めようとしている結果が見つけるのにかなり時間を要することが分かりました。

そこで質問なのですが、先ほどのプログラムを使用して、195001→195002から195001→195003へと変わる際で区切りなどを入れてそれぞれがどの程度あるのか分かりやすくしたいです。区切りを入れるまたは195001→195002、195001→195003などそれぞれ出てきた結果を列としてとらえてそれらの列がいくつあるかを和として出力する方法はありますでしょうか?

0E85051620170,195001
0E85051620170,195003
[1] 2

09690FD520157,195001
09690FD520157,195005
09692DF920168,195001
09692DF920168,195005
[2] 4

0CD30E8120165,195001
0CD30E8120165,195008
[3] 2

10491ADC20156,195001
10491ADC20156,195009
0E85080B20150,195001
0E85080B29150,195009
[4] 4

といったような出力にしたいです。
そのようなやり方があるのであれば、教えていただけないでしょうか?

  • > そのようなやり方があるのであれば
    そのような既製のプログラムはないので,自分で作るしかない。
    > 教えていただけないでしょうか
    おかかえプログラマが必要なようですね。いつまでもこのようでは困るでしょう。
    foo <- function(m, k) {
      count <- 0                            ### 追加  件数をカウントする
      n <- nrow(ファイルデータ)
      i <- 1
      repeat {
        if (ファイルデータ$CAR[i] == ファイルデータ$CAR[i+1] &&
            ファイルデータ$SHA[i] == m &&
            ファイルデータ$SHA[i+1] == k) {
          if (count == 0) {                 ### 追加  該当があるときのみ先頭に出力
            cat(sprintf("==== %i --> %i =====\n", m, k)) ### 追加 
          }                                 ### 追加 
          cat(ファイルデータ$CAR[i], ファイルデータ$SHA[i], "\n")
          cat(ファイルデータ$CAR[i+1], ファイルデータ$SHA[i+1], "\n")
          count <- count+2                  ### 追加
          i <- i+1
        }
        i <- i+1
        if (i >= n) break
      }
      if (count != 0) {                     ### 追加  カウント数を出力
        cat(sprintf("count = %i\n", count)) ### 追加 
      }                                     ### 追加 
    }
    プログラムやデータなどを提示する方法について,「 [heart] 投稿文書の書式 [heart] 」 を読むべし。ということについても,努力していないようですね。 -- 河童の屁は,河童にあらず,屁である。? 2013-11-01 (金) 17:29:44

結果データの保存

鬼の目にも涙? (2013-11-01 (金) 11:00:12)

出力結果をまた別のファイルに保存したいです。

 x   y
200 300
300 400

というような結果を別の新たなファイルに保存する方法はありますでしょうか?プログラムを組めばよいのでしょうか?

  • コンソールに表示されるものをそのままファイルに出力したいということならば,sink 関数。
    sink("ファイル名")
     :
    sink()
    のようにすれば,sink("ファイル名") 以降 sink() までに,コンソールに出力されるであろうものが「ファイル名」とう名前を持つファイルに書き出されます。sink() を入れるまではファイルに出力され続けるので注意。
    また,もっとも単純には,コンソールに書き出された結果をコピーし,エディタ(Word でもよいけど)にペーストし,その後,保存するという,誰でもできるダサイ方法もあります。
    また,貴方の言う「結果」が,例示されたもののようなデータフレームを指すのなら,write.table や save を使えばよいですね。
    そのほかにも,状況に応じた方法があるので,どのような出力結果をファイルに出したいのかという詳細を書くとよいでしょう。
    プログラムやデータなどを提示する方法について,「 [heart] 投稿文書の書式 [heart] 」 を読むべし。 -- 河童の屁は,河童にあらず,屁である。? 2013-11-01 (金) 11:02:06

repeat(while) と return

河童の屁は,河童にあらず,屁である。? (2013-10-31 (木) 18:32:41)

# 危険!実行するな!無限ループ
foo <- function() {
  i <- 1
  repeat {
    i <- i+1
    if (i >= 10) return
  }
}
foo()

# () を付ければ問題ない
foo2 <- function() {
  i <- 1
  repeat {
    i <- i+1
    if (i >= 10) return()
  }
}
foo2()

# for なら問題ない
foo3 <- function() {
  i <- 0
  for (j in 1:100) {
    if (i >= 10) return
  }
}
foo3()

# 不当なエラーメッセージが出る状況
a <- 1:20
foo4 <- function() {
  i <- 1
  repeat {
    i <- i+1
    if (a[i] >= 10) return # () を付けると無問題
  }
}
foo4()

のようなことに気づいた。
これは,Version 0.49 Beta (April 23, 1997) から(!!)今まで,ず〜〜っと同じである。ので,バグなどではない,のである

  • returnは関数です。そしてforの場合もループは100回、回っているので、repeatの場合と同じでお望みの動作にはなっていません。 -- 2013-10-31 (木) 22:47:43

windows用のダウンロードサイトが昨日から止まっています。

のざわ? (2013-10-30 (水) 13:01:56)

http://cran.md.tsukuba.ac.jp/bin/windows/base/
が昨日から見えません。対応をお願いします。

  • 何らかの事情があるのでしょう。当面,統数研なり兵庫教育大を使えばよいだけでしょう。 -- 2013-10-30 (水) 13:11:27
  • CRAN筑波ミラーですが、ハードウェアの故障で、当面停止する見込みです。しばらくは他のサイトを利用して下さい。 -- 岡田 2013-10-31 (木) 18:07:19

出力の仕方

掃除好き? (2013-10-30 (水) 08:02:28)

何度もすみません。

CAR,REC,TRW,DTM,SHA,KENSYU,ZIP,BIT
1262021A20150,0,800,20091019063645,195001,111,7600020,1950
0E85051620170,0,800,20091019063800,195001,112,,
0E85036820151,0,800,20091019063939,195003,111,7110931,1965
0969118E20153,0,800,20091019063942,195005,111,7630071,1958
09690FD520157,0,800,20091019063943,195001,111,7620006,1951
09692DF920168,0,800,20091019064203,195007,111,7618021,1955
1049204A20168,0,800,20091019064217,195001,111,7618013,1945
104920F920166,1,800,20091019064832,195005,111,7600001,1976
0CD30E8120165,1,800,20091019070210,195001,111,,
0CD305AE20156,0,800,20091019070223,195003,111,7620021,1949
10491ADC20156,0,800,20091019070537,195001,112,7690210,1993
0CD3028120168,0,800,20091019070716,195007,111,7600013,1947
0E85080B20150,0,800,20091019070830,195001,111,,
1049209920170,0,800,20091019071029,195009,111,7620046,1965
0E850FCF20170,0,800,20091019071125,195001,112,7618004,1991
10490C5F20148,0,800,20091019071135,195004,111,7000965,1976
0AFD0A5620166,0,800,20091019071523,195001,111,7600080,1944
1049214720169,0,800,20091019071906,195005,111,7618026,1980
10491BEC20152,0,800,20091019071935,195001,111,,
10490FE120148,0,800,20091019072112,195007,111,7630091,1962
               ・
               ・

過去に質問した内容でプログラムを組んでみたのですが、上手くまわりません。このプログラムはどこが間違っていますでしょうか?教えていただければ幸いです。

foo <- function(m, k) 
for (m in 195001:195059) {
  for (k in (m+1):195060) {
    function(m, k) # 関数を呼び出す
  }

  n <- nrow(ファイルデータ)
  i <- 1
  repeat {
    if (ファイルデータ$CAR[i] == ファイルデータ$CAR[i+1] &&
        ファイルデータ$SHA[i] == m &&
        ファイルデータ$SHA[i+1] == k) {
      cat(ファイルデータ$CAR[i], ファイルデータ$CAR[i], "\n")
      cat(ファイルデータ$CAR[i+1], ファイルデータ$CAR[i+1], "\n")
      i <- i+1
    }
    i <- i+1
    if (i >= n) return
  } 
  • まずは,文法エラーを無くす必要がありますね。根本的に,関数の定義と呼出がまるでだめですね。cat で二つ同じものを並べて書き出しているけど,二番目は目的とするデータでは?なお,$CAR は factor として読み込まれているなら,as.character とする必要があるでしょう。
    プログラムやデータを提示する方法について,「 [heart] 投稿文書の書式 [heart] 」 を読むべし。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-30 (水) 09:28:07
    foo <- function(m, k) {
      n <- nrow(ファイルデータ)
      i <- 1
      repeat {
        if (ファイルデータ$CAR[i] == ファイルデータ$CAR[i+1] &&
            ファイルデータ$SHA[i] == m &&
            ファイルデータ$SHA[i+1] == k) {
          cat(ファイルデータ$CAR[i], ファイルデータ$CAR[i], "\n")
          cat(ファイルデータ$CAR[i+1], ファイルデータ$CAR[i+1], "\n")
          i <- i+1
        }
        i <- i+1
        if (i >= n) return
      }
    }
    
    ファイルデータ <- read.csv("data.csv", as.is=TRUE)
    for (m in 195001:195059) {
      for (k in (m+1):195060) {
        foo(m, k) # 関数を呼び出す
      }
    }
  • 回答ありがとうございます。エラーはかなり減ったのですが、一つだけ 以下にエラー if (ファイルデータ$CAR[i] == ファイルデータ$CAR[i + 1] &&  ファイルデータ$SHA[i] == : TRUE/FALSE が必要なところが欠損値です と出てしまいます。TRUE/FALSEは m && ファイルデータ$SHA[i+1] == k) <- TRUE という形でよろしいでしょうか? -- 掃除好き? 2013-10-31 (木) 11:30:46
  • そうですね。return を break に変えれば動くでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-31 (木) 11:32:42
  • > TRUE/FALSEは m && ファイルデータ$SHA[i+1] == k) <- TRUE という形でよろしいでしょうか?
    なんでしょうか?それは。
    いいかどうかはやってみれば,R が教えてくれます。しかし,闇雲に,見よう見まねで,あるいは適当に,何でもかんでも書いてみればよいというものではないでしょう。最低限の文法は必須。その上でのアルゴリズム(プログラム)ということでしょう。 -- 2013-10-31 (木) 18:06:09
  • すみません、同じ投稿をしてしまっていました。プログラムは簡単にまわりました。本当にありがとうございました!! -- 掃除好き? 2013-11-01 (金) 09:35:00
  • ああああああああああああああああああ -- 2013-11-01 (金) 09:39:20
  • 195001→195002となっている列を読み込んだあとにその次の195001→195003の計算を行うようなプログラムにはなったのですが、195001→195002から195001→195003へと変わる際で区切りなどを入れてそれぞれがどの程度あるのか分かりやすくしたいです。区切りを入れるまたは195001→195002、195001→195003などそれぞれ出てきた結果を列としてとらえてそれらの列がいくつあるかを和として出力する方法はありますでしょうか? -- 2013-11-01 (金) 10:11:03

Rの開き方

スケルトン? (2013-10-28 (月) 19:08:26)

Rのソフトをダウンロードしたのですが、内容全てが英語です。日本語のソフトか切替方法などはありませんでしょうか?

  • 質問内容に具体的なことが何もないので、どんな状況で何のことについて質問しているのか判断できず、回答のしようがありません。一般論で説明すると、Rの言語表示は環境変数LANGUAGEで制御されています。日本語に切り替えるには環境変数LANGUAGEにjaという値を与えます。 下のスクリーンショットは、それぞれ日本語(LANGUAGE=ja)、繁体字(LANGUAGE=zh_TW)、英語(LANGUAGE=en)という風に環境変数LANGUAGEの値を変更してRを起動した場合です(表示してみて気がつきましたが、中国語だと記述が短く、英語だと冗長になりますね)。あなたの質問への回答になりましたか。 -- 2013-10-29 (火) 13:58:49
    lang.png

gsub()で正規表現

naca? (2013-10-25 (金) 22:01:34)

下のような文字列xがあります。
xから"<>"とそれに囲まれた任意の文字列(ここでは<aaa>, <bb>, <cc 123 %>)を除いた文字列(ここでは「成功」)を抽出したいのですが、どのようなxでも対応できるような方法があればご教授いただけないでしょうか。
なお、<xxxx>のパターンは複数個あり、任意の文字列です。
よろしくお願いします。

x <- "<aaa><bb>成功<cc 123 %>"
gsub("<aaa>", "", gsub("<bb>", "", gsub("<cc 123 %>", "", x)))
      #さまざまなxに対応させたい。
  • gsub は最長一致なので簡単にはいかないのではないかと。そこで,以下のような関数を書いてみました。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-26 (土) 10:24:19
    func <- function(str) {
      str <- unlist(strsplit(str, ""))
      out <- TRUE
      select <- logical(length(str))
      for (i in seq_along(str)) {
        if (str[i] == "<") {
          out <- FALSE
          select[i] <- FALSE
        } else if (str[i] == ">") {
          out <- TRUE
          select[i] <- FALSE
        } else {
          select[i] <- out
        }
      }
      paste(str[select], collapse="")
    }
    > x <- "<aaa><bb>成功<cc 123 %>"
    > func(x)
    [1] "成功"
    > func("<html><head><title>タイトル</title></head><body>本体<br>文章</body></html>")
    [1] "タイトル本体文章"
  • gregexprではダメでしょうか?必要ならベクトル化も保てますし。 -- 2013-10-26 (土) 11:30:50
    func <- function(x) {
      matched <- gregexpr("<[^>]*>", x)[[1]]
      if (matched[1] == -1) {
        return(x)
      }
      l <- attributes(matched)$match.length
      # ↓手抜き。matchedの長さだけsubstrで切ったほうが良いと思います。
      n <- unlist(mapply(FUN=seq, matched, matched + l - 1))
      paste(strsplit(x, "")[[1]][-n], collapse="")
    }
  • お二方、本当にありがとうございました。自力では難しかったのですが、望み通りの結果を得ることができました。とても助かりました。 -- naca? 2013-10-26 (土) 16:50:06
  • いや、最短一致させれば一発でしょう。 gsub("<.*?>", "", x) -- 2013-10-27 (日) 08:50:13
  • ありがとうございます。最短一致という方法勉強になりました。 -- naca? 2013-10-29 (火) 13:03:31
  • あれ?最短マッチはperl以降の正規表現で扱える(gsubのデフォルトはperl=FALSE)と思っていたのですが... perl=TRUEでもFALSEでもうまく動きますね。Rの方言だと思っておきます。失礼しました。 -- nkoji? 2013-11-06 (水) 01:16:02

出力の仕方

掃除好き? (2013-10-23 (水) 10:04:40)

CAR,REC,TRW,DTM,SHA,KENSYU,ZIP,BIT
1262021A20150,0,800,20091019063645,195001,111,7600020,1950
0E85051620170,0,800,20091019063800,195001,112,,
0E85036820151,0,800,20091019063939,195003,111,7110931,1965
0969118E20153,0,800,20091019063942,195005,111,7630071,1958
09690FD520157,0,800,20091019063943,195001,111,7620006,1951
09692DF920168,0,800,20091019064203,195007,111,7618021,1955
1049204A20168,0,800,20091019064217,195001,111,7618013,1945
104920F920166,1,800,20091019064832,195005,111,7600001,1976
0CD30E8120165,1,800,20091019070210,195001,111,,
0CD305AE20156,0,800,20091019070223,195003,111,7620021,1949
10491ADC20156,0,800,20091019070537,195001,112,7690210,1993
0CD3028120168,0,800,20091019070716,195007,111,7600013,1947
0E85080B20150,0,800,20091019070830,195001,111,,
1049209920170,0,800,20091019071029,195009,111,7620046,1965
0E850FCF20170,0,800,20091019071125,195001,112,7618004,1991
10490C5F20148,0,800,20091019071135,195004,111,7000965,1976
0AFD0A5620166,0,800,20091019071523,195001,111,7600080,1944
1049214720169,0,800,20091019071906,195005,111,7618026,1980
10491BEC20152,0,800,20091019071935,195001,111,,
10490FE120148,0,800,20091019072112,195007,111,7630091,1962
               ・
               ・

上記のようなデータを読み込んだのですが、ここからCARの値が2つ続けて同じで、かつSHAの値が195001の次に195003となっている列の和を知りたいです。
そして、もしその195001の次に195002となっているのを計算し終えたら今度は195001の次に195005となっているものを、そして、SHAの値は195060まであるのでそれを全部出し終えたら、今度は195002の次が195003のものをというような感じで、それぞれの出力された結果がいくつあるかを知りたいです。
そのようなプログラムはありますでしょうか?
if文などを使えば良いような気がしますが、私自身プログラムに疎いのでRの練習がてらに少し難しいプログラムを学んでみたいので、分かります方は回答をお願いします。

  • 同じような質問が(3 つも)下の方にあります。今回の質問はそれらを繰り返すという所が違いますが,参考になるでしょう。「本体部分を関数化(変化する部分を引数とする)し,for ループなどで変化する部分を関数の引数として関数を呼ぶ」というようにすればよいでしょう。
    目次から,以下の見出しの付いた記事を読んでください。
    出力方法について
    プログラミング
    プログラムの組み方
    for (i in 195001:195059) {
      for (j in (i+1):195060) {
        func(i, j) # 関数を呼び出す
      }
    }
    しかしまあ,似たような質問があるもんだなあ。投稿方法について,「投稿における注意事項」と「 [heart] 投稿文書の書式 [heart] 」 を読むべきであるというところまでそっくりだ。同じグループの質問者なんだろうか。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-23 (水) 10:24:35

パッケージのインストールで出るエラー

yataro? (2013-10-22 (火) 16:32:55)

Linux(Ubuntu)でRstudioを使ってRを使用しています。
使用環境は以下の通りです。

sessionInfo() 
R version 3.0.2 (2013-09-25)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=ja_JP.UTF-8       LC_NUMERIC=C               LC_TIME=ja_JP.UTF-8       
 [4] LC_COLLATE=ja_JP.UTF-8     LC_MONETARY=ja_JP.UTF-8    LC_MESSAGES=ja_JP.UTF-8   
 [7] LC_PAPER=ja_JP.UTF-8       LC_NAME=C                  LC_ADDRESS=C              
[10] LC_TELEPHONE=C             LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C       

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

other attached packages:
[1] fishmethods_1.5-0 MASS_7.3-29       foreign_0.8-56    boot_1.3-9       

loaded via a namespace (and not attached):
[1] tools_3.0.2

ここで、以下のエラーが出てパッケージをインストールできません。

install.packages("truncnorm")
Installing package into ‘/home/seishiro/R/x86_64-pc-linux-gnu-library/3.0’
(as ‘lib’ is unspecified)
URL 'http://cran.rstudio.com/src/contrib/truncnorm_1.0-6.tar.gz' を試しています 
Content type 'application/x-gzip' length 9686 bytes
開かれた URL 
==================================================
downloaded 9686 bytes

 以下にエラー setwd(od) :  作業ディレクトリを変更できません 
 以下にエラー setwd(startdir) :  作業ディレクトリを変更できません 
 実行が停止されました 
Warning in install.packages :
 installation of package ‘truncnorm’ had non-zero exit status

The downloaded source packages are in
	‘/tmp/Rtmpj8OYYl/downloaded_packages’

ちなみにこのエラーは、端末から何らかの.rファイルを rstudio test.r として開いたときに起こり、rstudio のみを入力して新規に開いた場合にはこのエラーが起こることなくパッケージをインストール出来ます
先に新規で開いて、そのあとに.rファイルを開けば問題はないのですが、Projectを作成したときは毎度、別に新規で開くのは効率が悪いので、解決案をご教授いただければ幸いです。

  • suとして実行してもダメ、ということでしょうか。sudo R CMD INSTALLで試してみては? -- 2013-10-22 (火) 16:56:32
  • スクリプトファイルにinstall.packages()を書かなければならない理由に興味があります。演習でスクリプトを配布するとかでしょうか。 -- 2013-10-22 (火) 17:12:52
  • 念のためrootでも試して見ましたが結果は同じでした。 -- yataro? 2013-10-22 (火) 17:17:35
  • 再現できません。RStudio v0.97.551 Ubuntu 13.10 amd64, 「rstudio tmp.r」として起動。 -- 2013-10-22 (火) 17:21:36
    > install.packages("truncnorm")
    Installing package into ‘/home/xxxx/R/x86_64-pc-linux-gnu-library/3.0’
    (as ‘lib’ is unspecified)
    [snip]
    gcc -std=gnu99 -I/usr/share/R/include -DNDEBUG
        -fpic  -O3 -pipe  -g  -c rtruncnorm.c -o rtruncnorm.o
    [snip]
    * DONE (truncnorm)
  • 備忘録や他人との共有にinstall.packages()(ときには# install.packages())として残したいという気持ちもあるのですが、何より、ふと思いついたパッケージをインストールしようとしたときにConsoleに書くという習慣をとっていましたので、このエラーがおき始めて端末やRstudioを別に立ち上げてインストールするという一手間が増えたため、これを無くせないかと思った次第です -- yataro? 2013-10-22 (火) 17:25:51
  • ある日から、このエラーが起き始めたというのがヒントになると思います。しかもエラーはパーミッションエラーまたは不存在のエラー。さては、root権限で$HOME/R配下のディレクトリを上書きしてしまいましたね。 -- 2013-10-22 (火) 17:31:16
  • 再現を試みていただき、ありがとうございます。しかしながら、こちらはまだ同様のエラーが出ております。Rstudioを2個開き(片方は新規で開いてインストール専用として使用)で、ひとまずは対処していますが、いずれは解決したい問題です -- yataro? 2013-10-22 (火) 17:34:50
  • 記憶にはありませんが、root権限で$HOME/R配下のディレクトリを上書きした可能性は否定できません。これによってこのエラーが起こる原因と解決案に心当たりがおありでしたら、ご教授いただければ幸いです -- yataro? 2013-10-22 (火) 17:40:55
  • 解決策も何もUIDとGIDを確認して、原因が見つかればそれを自分(のアカウント)に書き戻せば良いのでは。まずは「ls -lR $HOME/R」で確認しましょう。もし自分ではなくrootになっているものがあれば、chownで自分に戻す。なければ、他の原因をあたる。 -- 2013-10-22 (火) 17:48:42
  • rootで試しても結果がおなじだったというなら、Rディレクトリのパーミッションの問題ではない気も... -- 2013-10-22 (火) 18:04:19

3次元棒グラフとその重ね書き

Saito? (2013-10-19 (土) 15:49:18)

いつもお世話になっております。
ネットや過去ログを調べましたが、見つからなかったので質問させてください。
座標と座標ごとに値が得られている場合に、それを3次元棒グラフで表示することは可能でしょうか。
さらに、その3次元棒グラフを近似するなんらかの関数を当てはめて、3次元棒グラフに重ね書きし、なめらかな曲面として表示することは可能でしょうか。

どなたか分かる方がいましたら、ご教授ください。
3次元棒グラフの書き方だけでも助かります。
どうぞよろしくお願い致します。

  • 本当に調べましたか?投稿における注意事項を読みましたか?質問を書き込む前にもう一度読んではいかがですか。
    RSiteSearch("3d barplot")
    で調べたら、vrmlgenパッケージのbar3d()とかscatterplot3dパッケージの例などがヒットしますよ。重ね書きは座標を計算してpoints()やtext()で書き込めば良いです。関数の当てはめと滑らかな曲面ももちろん可能ですが、私の知る限りは自分で手順を書いていく必要があります。スプライン関数を使うにしろ、Krigingで平滑化するにしろ、空間統計学の知識とRのコーディング知識が必要です。3次元を2次元に投影する変換関数の知識も必要です。詳しくは、間瀬茂先生の地球統計学とクリギング法RとgeoRによるデータ解析など、専門書を当たって下さい。 -- 2013-10-20 (日) 13:38:15

データが多すぎて無視される場合

データサイエンス? (2013-10-17 (木) 14:08:14)

何度もすみません。今扱っているデータが膨大なので、プログラムが回せても結果がほとんど無視されてしまいます。無視された場合には、その結果を別のファイルに保存や、そのまま下に続けて別のプログラムに起用することは出来ないのでしょうか?

  • 「結果がほとんど無視されてしまいます」というのはどういうことでしょうね?
    「結果を別のファイルに保存」することはできますし(結果をファイルに書き出すだけのことですから)。
    「そのまま下に続けて」というのもどういうことを言っているのか判然としないのだけど,結果を変数(オブジェクト)に代入しておいて,後々それを使って計算を続けるということは普通のことでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-17 (木) 14:13:56

if文

データサイエンス? (2013-10-17 (木) 10:32:48)

もし、英語と数字が混ざっているような値をif文にかけるにはどうすればよろしいのでしょうか?
ZAW3
DE6A
IK9U
S1S3
というような英語と数字が混ざっているような値が下にずっと続いているのですが、例えばIK9Uだけを出力するといったような方法はあるのでしょうか?if文でやるのかなと思っているのですが、数字だけとは違うのでi+1といったことでは出来ないので困っています。

  • このようなものは,「文字列」として扱えばよいだけの話です。データが a に入っているとして,「例えばIK9Uだけを出力する」なら,if なんか使う必要などはなくて,単に a[a == "IK9U"] とするだけでよいのです。
    > a
    [1] "ZAW3" "DE6A" "IK9U" "S1S3"
    > a[a == "IK9U"]
    [1] "IK9U"
    「i+1といったことでは出来ない」とはどういうことでしょうね? -- 河童の屁は,河童にあらず,屁である。? 2013-10-17 (木) 11:56:16
  • 別解。 -- 2013-10-17 (木) 12:06:39
    > grep("IK9U", a, value = TRUE)
    [1] "IK9U"
  • 文字式とおけば良いんですね!ありがとうございます! -- データサイエンス? 2013-10-17 (木) 14:01:48

出力方法について

サッポロポテト? (2013-10-17 (木) 01:44:42)

 aa  ab    ac
126 800 19507
4AD 900 19501
4AD 800 19358
J89 900 19356
J89 901 19358
MK5 900 19538
SWK 911 19333
256 800 15689
      ・
      ・

前回と同じような質問なのですが、データをファイルから出力したあと、このデータのabの列の901と911の行とその上の行以外を下記のように出力したいです。

126 800 19507
4AD 900 19501
4AD 800 19358
256 800 15689

これはこのようなプログラムで本当に合っていますでしょうか?

b <- a$ab == 901&911
a[b | c(b[-1], TRUE),]
  • 合っているかどうかはやってみて結果を見れば分かりますが,あなたのやりたいことをやるには,以下のようにしなくてはならないでしょう。
    b <- a$ab == 901 | a$ab == 911
    a[!(b | c(b[-1], FALSE)),]
    なぜそうしなくてはならないのかは,R の教科書などを参考にして考えてみてください。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-17 (木) 11:48:45

プログラミング

変体観測? (2013-10-14 (月) 14:11:53)

初めての投稿でまだ分からない部分もありますが質問させていただきます。「投稿における注意事項」等を読んで、自分で考えてはみたのですが、全くRについての知識がなく、どれも回すことが出来ませんでした。それでも回答していただけますならお願いします。

   x   y
5555 358
5555 191
2951 358
2895 191
3515 358
3515 191
3515 193

このようなデータをcsvテキストから読み込んだのですが、このデータのxの値が2つ続けて同じで、かつyの値が358の次に191となっている部分だけを出力したいです。

5555 358
5555 191
3515 358
3515 191

このような形で出力するのはどうすればよろしいのでしょうか?

  • 下の方に,似たような問題がありますね。こちらの方がちょっと複雑なのだけど,同じ考え方でプログラムできます。
    f1 <- function(a) {
      n <- nrow(a)
      b2 <- a$y == 191
      b1 <- a$y == 358 & c(b2[-1], FALSE)
      b1 <- b1 | c(FALSE, b1[-n])
      c1 <- a$x == c(a$x[-1], FALSE)
      c1 <- c1 | c(FALSE, c1[-n])
      return(a[b1 & c1,])
    }
    しかしまあ,おまじないみたいになってしまうので,以下のように素直に書く方がよいでしょうね。
    f2 <- function(a) {
      n <- nrow(a)
      i <- 1
      repeat {
        if (a$x[i] == a$x[i+1] && a$y[i] == 358 && a$y[i+1] == 191) {
          cat(a$x[i], a$y[i], "\n")
          cat(a$x[i+1], a$y[i+1], "\n")
          i <- i+1
        }
        i <- i+1
        if (i >= n) return
      }
    }
    なお,もとのデータの記述で2列目の変数名が z になっていたのは y の単純な間違いと思うので,それを前提としてプログラムしました。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-14 (月) 15:02:55
  • f2 は必要のない出力を抑制するために,以下のようにプログラムすると,公平に他のプログラムとの速度比較ができます。
    f2.2 <- function(a) {
      n <- nrow(a)
      ans <- logical(n)
      i <- 1
      repeat {
        if (a$x[i] == a$x[i+1] && a$y[i] == 358 && a$y[i+1] == 191) {
          ans[i] <- ans[i+1] <- TRUE
          i <- i+1
        }
        i <- i+1
        if (i >= n) return(a[ans,])        
      }
    }
    遅いのはいたしかたない。-- 2013-10-15 (火) 16:14:19
  • 「お*ま*じ*な*い」感を薄めると,速くなった。
    f1.2 <- function(a) {
      n <- nrow(a)
      s1 <- 1:(n-1)
      s2 <- 2:n
      flag <- a$x[s1] == a$x[s2] & a$y[s1] == 358 & a$y[s2] == 191
      return(a[c(flag, FALSE) | c(FALSE, flag),])
    }
    ほんのわずかだけど。
    そのあと,また「お*ま*じ*な*い」感を強めたものが今のところ一番速いか。
    f1.3 <- function(a) {
      n <- nrow(a)
      flag <- (a$x[1:(n-1)] == a$x[2:n]) * (a$y[1:(n-1)] == 358) * (a$y[2:n] == 191)
      return(a[c(flag, FALSE) | c(FALSE, flag),])
    }
    & を * でやるなど,こそくな手段を使う。微々たる違いだが。 -- 2013-10-15 (火) 17:10:47
  • 初心者の参考にはならないでしょうが,次のようにすることもできます. -- 2013-10-15 (火) 23:48:59
    > j <- (1:(nrow(a)-1))[diff(a$x) == 0] # j=c(1,5,6)
    > k <- j[a$y[j]==358 & a$y[j+1]==191]  # k=c(1,5)
    > a[sort(c(k,k+1)),]                   # sort(c(k,k+1))=c(1,2,5,6)
         x   y
    1 5555 358
    2 5555 191
    5 3515 358
    6 3515 191
  • お返事遅くなりました。みなさんありがとうございます!色々な方法があるんですね。ちょっと真剣にRの勉強をしてみようと思いました! -- 変体観測? 2013-10-17 (木) 01:33:48

標準化残差、調整済み標準化残差、mosaicplot()

まりも? (2013-10-12 (土) 00:01:58)

残差分析(カイ2乗検定をした上で、さらに個別の項目のどこに差があるのかを探索するための)の手法と図示についてご教示ください。

残差には、標準化残差と、調整済み標準化残差とがあり、Chisq.test関数が返す $residuals と $stdres がそれぞれ対応していることを理解しました。
ネットを検索すると、調整済み標準化残差の値を標準正規分布のzスコアとしてp値を求める方法を紹介しているサイトが多く見つかります。
http://note.chiebukuro.yahoo.co.jp/detail/n71838

一方、観測値が期待値に対して有意差がある項目をわかりやすく図示する方法として、mosaicplot(data,shade=TRUE) や library(vcd) の mosaic(data, shade=TRUE) が頻繁に紹介されていますが、ここでは(調整済みでない)標準化残差が用いられています。

どちらをzスコアに用いるかは、あまり問題にならないのでしょうか。もし問題になるとすれば、調整済み標準化残差に基づいてモザイク図を塗ることはできるのでしょうか。

  • > どちらをzスコアに用いるかは、あまり問題にならないのでしょうか。
    なるでしょう。必要のないものをわざわざ定義するというのは考えられないですし。
    >もし問題になるとすれば、調整済み標準化残差に基づいてモザイク図を塗ることはできるのでしょうか。
    出来ないのでしょうね。できるなら,作られているでしょうから。
    しかし,従来の概念からは作られないだけで,あなたがこれが適切なグラフだというものを定義すれば,その図がみんなに使われることになるでしょう。そのような図を R で描く方法が分からないとしても,こんな風なグラフなんだけどという「仕様」さえ明らかであれば,どなたかがそのようなグラフを描くプログラムを描いてくれるかも知れませんね。 -- 2013-10-12 (土) 21:03:20
  • ご教示ありがとうございます。投稿後も色々探してみましたが、おっしゃるとおりの状況のようですね。あれば便利と思うので、自分なりに描画の方法を考えてみます。 -- まりも? 2013-10-13 (日) 02:24:35

プログラムの組み方

サッポロポテト? (2013-10-11 (金) 15:32:53)

 aa  ab    ac
126 800 19507
4AD 800 19501
4AD 800 19358
J89 800 19356
J89 900 19358
MK5 900 19538
SWK 900 19333
      ・
      ・

このようなデータをファイルから出力したのですが、このデータのacの列の19358の行とその上の行だけを下記のように出力したいです。

4AD 800 19501
4AD 800 19358
J89 800 19356
J89 900 19358

そのようなプログラムを組みたいのですが、初心者なので全く分かりません。
誰か教えていただきますでしょうか?
あとこれがいくつも下に続いていくので、その19358とその上の行がデータ内にいくつあるのかが分かるプログラムも教えていただければ光栄です。

  • あなたも,投稿方法について,「投稿における注意事項」と「 [heart] 投稿文書の書式 [heart] 」 を読むべきです。
    ac 列が 19358 である行とその直前の行を出力するということですか?
    データフレームを a とすれば,
    > b <- a$ac == 19358
    > a[b | c(b[-1], FALSE),]
       aa  ab    ac
    2 4AD 800 19501
    3 4AD 800 19358
    4 J89 800 19356
    5 J89 900 19358
    このような行の組が何組あるかは,
    > sum(b)
    [1] 2
    でよいのではないですか? -- 河童の屁は,河童にあらず,屁である。? 2013-10-11 (金) 16:02:37
  • ありがとうございました!しっかりと読んでいませんでした。また、困った時はよろしくお願いします。 -- サッポロポテト? 2013-10-14 (月) 14:52:03

積み重ね棒グラフのラベリング

棒グラフ? (2013-10-06 (日) 09:39:18)

エクセルのように縦棒の積み重ね棒グラフ自身に名前を埋め込むことはできるのですが,横棒の縦棒の積み重ね棒グラフにしたときにそれができません。ご教示いただけないでしょうか?

  • 「横棒の縦棒の積み重ね棒グラフ」って,どんなものなのか。どこにどのように「名前」を埋め込みたいのか,イメージだけでも提示してください。
    「縦棒の積み重ね棒グラフ自身に名前を埋め込む」プログラムを示し,「これを90度回転させたいのだけど」といえばよい。 -- 2013-10-07 (月) 08:52:52
  • すみません。失礼いたしました。
    次のようなコードで縦棒の積み重ね棒グラフが書けるのですが,horiz=Tを使って,これを横棒にしたときに,グラフに名前が記入できません。
    どのようにすべきでしょうか?
    「回転」で調べてはみたのですが,解説が見つけられないでおります。
    教えていただけますと幸いです。 -- 棒グラフ? 2013-10-07 (月) 15:01:30
    > fruits <- c(20, 30, 50)
    > par(las=1)
    > par(mgp=c(2, 0.8, 0))
    > t = barplot(cbind(fruits), names.arg=c("fruits"))
    > text(t[1],
    +      c(fruits[1]/2, fruits[1]+fruits[2]/2,
    +        fruits[1]+fruits[2]+fruits[3]/2),
    +      c("lemon", "-orange", "apple"),
    +      col=c("white", "black", "black"))
    > axis(2, labels="%", at=100, padj=-1, las=1)
  • たびたびすみません。上の文章ですが,「~」で改行できと思ったのですが,思い違いでした。大変失礼します。 -- 棒グラフ? 2013-10-07 (月) 15:04:07
  • 直しましたが。
    あなたも,投稿方法について,「投稿における注意事項」と「 [heart] 投稿文書の書式 [heart] 」 を読むべきです。
    text 関数の第一,第二引数が何を表すか,再確認すべきですね。以下のようにすれば,あなたの思う図になると思います。 -- 河童の屁は,河童にあらず,屁である。? 2013-10-07 (月) 18:08:48
    text(c(fruits[1]/2,  fruits[1]+fruits[2]/2, fruits[1]+fruits[2]+fruits[3]/2), t[1],
         c("lemon", "-orange", "apple"), col=c("white", "black", "black"))
    ちなみに,今の場合はラベルは 3 つしかないので示されたように座標を計算してもよいけど,たくさんある場合などには,
    c(0, cumsum(fruits)[-length(fruits)])+fruits/2
    とするのがスマートでしょう。
  • どうもありがとうございました。助かりました。また失礼しました。 -- 棒グラフ? 2013-10-07 (月) 18:44:21

library(xlsx)ができない

はにわ? (2013-09-30 (月) 15:57:33)

xlsxライブラリが使いたく,

install.packages("xlsx")
library(xlsx)

とすると、以下のようなメッセージがでます。

> library(xlsx)
 要求されたパッケージ xlsxjars をロード中です 
 要求されたパッケージ rJava をロード中です 
Error :  .onLoadはloadNamespace()(xlsxjarsに対する)
         の中で失敗しました、詳細は: 
 call: .jinit() 
 error: Cannot create Java virtual machine (-4) 
 追加情報:   警告メッセージ: 
1:  パッケージ '‘xlsx’' はバージョン 2.14.2 の R の下で造られました  
2:  パッケージ '‘xlsxjars’' はバージョン 2.14.2 の R の下で造られました  
3:  パッケージ '‘rJava’' はバージョン 2.14.2 の R の下で造られました  
 エラー:  パッケージ '‘xlsxjars’' をロードできませんでした

Windows XP, R version 2.14.1です。
3か月前には同じコマンドで使えていたのでとても不思議です。
javaをインストールし直したりPATHを設定し直しましたがダメです。

何が原因か分かりますでしょうか。

  • 毎回,install.packages("xlsx") をやっていたのですか?バージョンが変わらない限り,インストールは1回で十分というか,逆に,レポジトリにあるパッケージのバージョンが変わったら新しいバージョンがインストールされてしまいますよ。あなたの場合,R が 2.14.1 なのに,エラーメッセージにあるように xlsx は R 2.14.2 の下で作られたものになっちゃったので,整合性がとれなくなっちゃったのではないですか? 対処法としては,2.14.1 の下で作られた xlsx をインストールするか R 2.14.2 にバージョンアップするかで,どうにかなるのでは?(そもそも,なんで今頃 R 2.xx.xx なの?と思うのですけど。少なくとも Mac OS-X なら R 3.0.0 対応のようですけどねぇ)
    ちなみに,C言語じゃないのだから,関数の最後の";"は不要というか目障りですね。ということで,勝手ながら削らせていただきました。-- 河童の屁は,河童にあらず,屁である。? 2013-10-01 (火) 15:51:41
  • 使用中のRと、RパッケージをコンパイルしたRのバージョンが相違するので、正常に動作しないと推測されます。これは不思議ではなく論理的にごく当然な話です。やるべきことは、javaやPATHの見直しじゃなくて、Rバージョンを合わせることです。パッケージをソースから入れるとこのような面倒はないのですが、バイナリでパッケージを入れるとこのような面倒が待ち構えています。 -- 2013-10-01 (火) 17:55:53

RStudioで動くのに、RIDEで動きません

平田光一? (2013-09-30 (月) 11:33:01)

RStudio0.97.551、R3.0.1を使用していますが、RStudioでは、動作しますが、RIDEでは、関数の呼び出し時に、ハングアップしてしまいます。
Win7 64bits、desktop PC、関数呼び出し後、直ぐに、print("abc")を挿入して見ましたが、表示する前に、ハングアップします。プログラムは、500行ぐらいで、変数は、大きいです。何か手がかりは無いでしょうか?

  • 役に立つかどうか分かりませんが,debug 関数で問題の発生箇所をあきらかにするとよいかもしれません。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-30 (月) 12:31:01

Rが起動しません

y? (2013-09-26 (木) 13:53:02)

Mac OS Xユーザーです。
R for Mac OSXの最新版をインストールして、いくつかデータを打ち込んで練習していたところ、突然固まってしまったのでRを強制終了しました。

その後Rを何度クリックして起動しようとしても、うまく起動できません(ずっと虹色のくるくるが回ったままで、アプリケーションが応答しない)。
Rのアプリケーションをゴミ箱に入れて、再びインストールしてみたのですが、やはり起動できません。アプリケーション自体をインストールするところまではできます。

Rの関連ファイルがMac内に残っているのが悪いのかなと思い、いろいろと調べてみたのですが、どれがRの関連ファイルなのか、見つけられません。

おそらく、Rのアンインストールが不完全なのだと思います。
ですので、Rの関連ファイルとして考えられるものを、どの場所にあるかも含めて、教えていただけないでしょうか?
また、他にもなにかいい解決方法がありましたら、それもご教授いただきたいです。
よろしく願いいたします。

  • 「Rのアプリケーションをゴミ箱に入れて」というのは,アプリケーションフォルダの R.app ということでしょうか。R の関連ファイルは,「ライブラリ」の中の「Frameworks」ディレクトリの中の「R.framework」ディレクトリにもありますから,「R.framework」ディレクトリも捨ててみてください(いきなり捨てるのがこわければ,デスクトップへでも移動してもいいと思う)。
    それでもうまくいかなければ,ターミナルで R と入力したらどんなメッセージが表示されるかなどがヒントになるかも。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-26 (木) 18:56:25
  • 河童の屁は,河童にあらず,屁である。様、早速のご回答、どうもありがとうございます。そうです、R.appを捨てて、ということです。おっしゃるとおり、R.frameworkも捨ててインストールし直してみましたが、やはりうまくいきません。ただ、ターミナルに R と打ち込んだところ、ターミナル上で R を起動することができました。試しにいくつかの命令を打ち込んでみたところ、きちんと動くようです。ですので、R のプログラム自体は問題ないと言うことなんでしょうか。また、ターミナル上で R を使うことについて、何か不都合はあるでしょうか? -- y? 2013-09-26 (木) 21:38:20
  • オプションキーを押しながら Finder メニューの「移動」の中程にある「ライブラリ」フォルダの中の Preferences フォルダにある
    org.R-project.R.LSSharedFileList?.plist
    org.R-project.R.plist
    も削除(移動)してみてください。この場合は,インストールし直さなくても,動くようになるかも知れません。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-26 (木) 22:36:24
  • どうもありがとうございます。おっしゃるとおり、org.R-project.R.plistのファイルを削除してから R を起動してみましたが、やはりうまくゆきませんでした。また、一つ目のorg.R-project.R.LS.plistについては、Preferences内には見つかりませんでした。 -- y? 2013-09-26 (木) 23:01:05
  • 質問者の方がまだ見ていらっしゃるのかわかりませんが、
    >ターミナル上で R を使うことについて、何か不都合はあるでしょうか?
    不都合がある人にはあるし、ない人にはありません。CLIのRは本体で、RGUIは飾りです。飾りなんてなくても良いのです。私もMacOSXでRを使っていますが、R.appは入れていません。ターミナルでRが正常に動作するということは、すなわちRが正常に動作すると言うことです。これを機会に、RStudioなど他のGUIを試してみてもよいですし、Emacs+ESSに移行するチャンスかも知れません。Emacs+ESSのコーディング効率のよさに驚愕して下さい。 -- 2013-10-01 (火) 18:05:15
  • お返事遅くなりすみません.なるほど,R.app以外にもアプリケーションソフトはあるということなのですね.どうもありがとうございました. -- y? 2013-10-07 (月) 21:24:11

REXCELのVBAで、変数をRinterface.PutDataframe?で使いたいです

wataya? (2013-09-26 (木) 06:09:48)

たびたびすみません。
Windows7 64bitでREXCELを使用しています。Rは32bit版で3.0.1。REXCELは3.2.13。EXCELは2007です。

VBAで花の名前の文字の入っている文字列配列のstr_moji(10)と、同名のデータセットをRに作成したいのですがどうすればいいのかわかりません。

Rinterface.PutDataframe? "str_moji(0)", str_moji(0)
このようにすると、str_moji(0)でデータセットが作られてしまいます。
Rinterface.PutDataframe? str_moji(0), str_moji(0)
このように""を抜いてしまうとエラーが出てとまります。

VBAから変数でデータセットを作る方法は無いんでしょうか。ご教授お願い致します。

  • データフレーム名をリネームする方法でもやれそうなんですが、方法は無いのでしょうか? -- wataya? 2013-09-26 (木) 15:35:14
  • 単純にRの, -- wataya? 2013-09-26 (木) 15:35:46
  • すみません、エンター押したら投稿されてしまいました(泣) -- wataya? 2013-09-26 (木) 15:36:41
  • REXCELのVBAのことというより、単純にRの「DF <- data.frame()」のDFを変数にできないかどうかの問題みたいです。 -- wataya? 2013-09-26 (木) 15:39:31
  • あなたも,投稿方法について,「投稿における注意事項」と「 [heart] 投稿文書の書式 [heart] 」 を読むべきです。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-26 (木) 20:47:39
  • CENTER:すみません。 -- wataya? 2013-09-27 (金) 00:06:21

REXCELでVBAを使って、.xlsmのパスを取得してsetwd()のパスを設定したい

wataya? (2013-09-25 (水) 21:30:38)

Windows7でRの32bit版を使用しています。Excelは2007です。

Rinterface.RRun "setwd (""C:/R/toukei/"") "
このようにフルパスで記述すれば、VBAで作業フォルダを指定できるのですが、

Dim strPath As String
strPath = ActiveWorkbook?.Path
VBAで取得した文字列変数strPathのパスを
Rinterface.RRun "setwd ()"に書く方法がわかりません。

どのように書けばよいのか教えてください。宜しくお願い致します。

  • 自己解決しました。RInterface.PutArrayFromVBA "path", strPathで送ってしまえばsetwd(path)でセットできました。 -- wataya? 2013-09-25 (水) 22:30:26

tapply関数の出力順序に関して

T? (2013-09-25 (水) 13:22:27)

tapply関数でcsvファイルから要素別の平均値を出しているのですが, 要素の順序がアルファベット順になってしまいます.
mydataというcsvファイルの1行目に観測値が, 2行目に要素名が入っています.

要素.M <- tapply(mydata2$観測値, mydata2$要素, mean)

これを解消する方法は何かありませんでしょうか?
出力される要素の順序をこちらで指定できると有難いのですが..
宜しくお願いします

  • factor 関数の levels 引数で指定するのです。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-25 (水) 15:32:03
  • 2つ目の引数をfactor(mydata2$要素, levels= ("X", "Z" ...))と明示的に示した所, 上手く動くようになりました! -- T? 2013-09-25 (水) 17:36:15
  • どうもありがとうございました. ただ, 一個腑に落ちないのですが.. -- T? 2013-09-25 (水) 17:36:49
  • mydata2$要素, levels= ("X", "Z" ...))"も中身の配列は変わっていないように見えるのですが, これは何が起きているのか, いまいちピンときていません.何が起きているのでしょうか -- T? 2013-09-25 (水) 17:37:50
  • mydata2$要素 <- factor(mydata2$要素, levels= ("X", "Z" ...)) のようにしないと,データファイルはもとのままですよ。
    ちなみに,投稿方法について,「投稿における注意事項」と「 [heart] 投稿文書の書式 [heart] 」 を読むべきです。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-25 (水) 18:18:47
  • ありがとうございました! -- T? 2013-09-26 (木) 21:49:09

ループ処理の結果が13回目以降NaNになってしまいます。

ndesse? (2013-09-19 (木) 09:39:08)

R使いにも慣れて来たのですが、ループに困る事態が生じました。
原因が分からず、解決出来ません。お助け下さい。

処理したいデータは以下のようなものです。
コンマきり。V1=染色体番号、V2=位置、V3=遺伝子の長さ、V4=遺伝子名、V5=遺伝子相対位置、V6=計算したい値です。

V1, V2, V3, V4, V5, V6, V7
chr01,  137.16,  1480,  geneA,  -1.50,  1.039,  1.351
chr01,  137.16,  1480,  geneA,  -1.50,  1.039,  1.351
chr01,  137.15,  1480,  geneA,  -1.49,  1.032,  1.353
chr01,  137.14,  1480,  geneA,  -1.48,  1.039,  1.355
chr01,  137.13,  1480,  geneA,  -1.47,  1.020,  1.349
chr01,  137.12,  1480,  geneA,  -1.46,  1.025,  1.344
chr01,  137.11,  1480,  geneA,  -1.45,  1.043,  1.337
chr01,  137.10,  1480,  geneA,  -1.44,  1.067,  1.316
chr01,  137.09,  1480,  geneA,  -1.43,  1.064,  1.305
chr01,  137.08,  1480,  geneA,  -1.42,  1.055,  1.311
chr01,  137.07,  1480,  geneA,  -1.41,  1.035,  1.315
chr01,  137.06,  1480,  geneA,  -1.40,  1.040,  1.297
chr01,  137.05,  1480,  geneA,  -1.39,  1.027,  1.294
chr01,  137.04,  1480,  geneA,  -1.38,  1.014,  1.321
chr01,  137.03,  1480,  geneA,  -1.37,  0.990,  1.333
chr02,  137.16,  1480,  geneB,  -1.50,  3.039,  1.351
chr02,  137.15,  1480,  geneB,  -1.49,  3.032,  1.353
chr02,  137.14,  1480,  geneB,  -1.48,  3.039,  1.355
chr02,  137.13,  1480,  geneB,  -1.47,  3.020,  1.349
chr02,  137.12,  1480,  geneB,  -1.46,  3.025,  1.344
chr02,  137.11,  1480,  geneB,  -1.45,  3.043,  1.337
chr02,  137.10,  1480,  geneB,  -1.44,  3.067,  1.316
chr02,  137.09,  1480,  geneB,  -1.43,  3.064,  1.305
chr02,  137.08,  1480,  geneB,  -1.42,  3.055,  1.311
chr02,  137.07,  1480,  geneB,  -1.41,  3.035,  1.315
chr02,  137.06,  1480,  geneB,  -1.40,  3.040,  1.297
chr02,  137.05,  1480,  geneB,  -1.39,  3.027,  1.294
chr02,  137.04,  1480,  geneB,  -1.38,  3.014,  1.321
chr02,  137.03,  1480,  geneB,  -1.37,  3.990,  1.333

このファイルは、実際は相対位置が-1.5~3.5まで0.01づつ増加、遺伝子数は300ほどあります。

このデータに関して、相対位置 (V5) が同じ値のもののV6の平均を出したいと思っています。
私のScriptでは、ループ13回以降が動きません。この例のデータだと13番目で終わっており、実際の150回ループ(-1.5~3.5の0.01刻み)では、13回以降は「i NaN」という結果がループ分プリントされます。ループの始まりをずらして(例えば i=-1.37、14行目)スタートすると、また13番目で終わってしまいます。どこが間違っているのでしょうか?
書いたループは

p <- read.table("test.txt", fill=TRUE)
i=-1.50
while (i < -1.37) { 
p.sub <- subset(p, p$V5 == i, c(V6))   
p.sub2 <- na.omit(p.sub)
m <- mean(p.sub2$V6)
sink("result.txt",append = TRUE) 
cat(i)
cat("\t")
cat(m)
cat("\n")
sink()
i=i+0.01
}

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

  • i が -1.50 から 0.01 ずつ大きくなって -1.37 を上回ったらループが終わるので 13回で終わる。 -- カップ? 2013-09-19 (木) 11:09:36
    v5 <- sort( unique(p$V5) )
    x <- matrix(0, nrow=length(v5), ncol=2)
    for(i in 1:length(v5)){
          x[i,] <- c(v5[i], mean(p$V6[p$V5==v5[i]]) )
    }
    > x
          [,1]  [,2]
    [1,] -1.50 2.039
    [2,] -1.49 2.032
    [3,] -1.48 2.039
    [4,] -1.47 2.020
    [5,] -1.46 2.025
    [6,] -1.45 2.043
    [7,] -1.44 2.067
    [8,] -1.43 2.064
    [9,] -1.42 2.055
    [10,] -1.41 2.035
    [11,] -1.40 2.040
    [12,] -1.39 2.027
    [13,] -1.38 2.014
    [14,] -1.37 2.490
  • while (i < 3.5) が正しいです。テストで試したままでした。
  • while (i < 0)としてやってみると、やはり13回以降、NaNの連続になりました。-- ndesse? 2013-09-19 (木) 12:42:20
  • ループの途中で,i が 1.37 になるだろうと,あなたは思っているのだが,コンピュータ上では i は 1.37 にはならない。
    コンピュータ上では実数は2進数として保持されているのだが,有限桁数の10進数で正確に表せる数値でも2 進数では循環小数となり有限桁数では近似値でしかない。i を 0 から 1 まで 0.01刻みで変化させてその和をとっても,49.5 にはならない(本当の正解は 50.5 であるにもかかわらず)。
    この掲示板でも何回か出てきた質問ですが,「実数を比較するときには注意」ということです。
    対処法は,あなたのプログラムが R らしくないこともあるので,書き直すのがよいでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-19 (木) 13:11:09
    > s <- 0
    > i <- 0
    > while (i <= 1) {
    + 	s <- s+i
    + 	i <- i+0.01
    + }
    > print(s) # 表示される値は 49.5 であるが,
    [1] 49.5
    > print(s == 49.5) # s の値は,正確な 49.5 ではない(真の値は 50.5 であるべき)
    [1] FALSE
    > print(sprintf("s = %a\n", s)) # 最下位にゴミがついている
    [1] "s = 0x1.8c00000000004p+5\n"
    > print(sprintf("s = %a\n", 49.5)) # なお,49.5 は 2 進数でも正確に表すことができる
    [1] "s = 0x1.8cp+5\n"
    次のプログラムと比較するとよい(これもあまりよいプログラムではないが)
    > s <- 0
    > i <- 0
    > while (i <= 100) {
    + 	s <- s+i/100
    + 	i <- i+1
    + }
    > print(s) # 正解
    [1] 50.5
    > print(s == 50.5)
    [1] TRUE
    > print(sprintf("s = %a\n", s))
    [1] "s = 0x1.94p+5\n"
    > print(sprintf("s = %a\n", 49.5))
    [1] "s = 0x1.8cp+5\n"
  • あなたのやりたいことは,tapply(p$V6, p$V5, mean, na.rm=TRUE) の 1 行でできるのでは? -- 河童の屁は,河童にあらず,屁である。? 2013-09-19 (木) 13:30:30
  • 非常に勉強になりました。 -- ndesse? 2013-09-19 (木) 16:30:48

Coxハザード解析におけるエラーについて

? (2013-09-14 (土) 16:25:38)

R初心者です。初めて投稿いたします。お力をお貸しください。
生存率に影響を及ぼす因子を検討するため、Coxハザード回帰を使い検討しました。具体的には年齢、性別、LOHという因子を共変量として検討しました。しかし、以下のようにエラーが出ます。エラーのためハザード比もおかしなことになっています。
いろいろ検討してみましたが、どうしてもわからず質問させていただきました。どうかご教授ください。

> d.cox<-coxph(Surv(duration,censor)~sex+age_56+LOH, method="exact", data=d)
 fitter(X, Y, strats, offset, init, control, weights = weights,
    中で警告がありました: 
  Loglik converged before variable  3 ; beta may be infinite.  

> summary(d.cox) 
Call:
coxph(formula = Surv(duration, censor) ~ sex + age_56 + LOH, 
    data = d, method = "exact")

  n= 53, number of events= 34 
   (15 observations deleted due to missingness)

             coef  exp(coef)   se(coef)      z Pr(>|z|)  
sex     2.677e-01  1.307e+00  3.734e-01  0.717   0.4733  
age_56  8.340e-01  2.303e+00  3.884e-01  2.147   0.0318 *
LOH    -1.958e+01  3.125e-09  5.875e+03 -0.003   0.9973  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

       exp(coef) exp(-coef) lower .95 upper .95
sex    1.307e+00  7.651e-01    0.6287     2.717
age_56 2.303e+00  4.343e-01    1.0754     4.930
LOH    3.125e-09  3.200e+08    0.0000       Inf

Rsquare= 0.349   (max possible= 0.983 )
Likelihood ratio test= 22.78  on 3 df,   p=4.487e-05
Wald test            = 5.99  on 3 df,   p=0.1121
Score (logrank) test = 16.42  on 3 df,   p=0.0009295

エラーメッセージの意味や対処方法など、ご教授頂ければ幸いです。
基本的なことが分かってないかもしれませんが、よろしくお願いいたします。

  • データがおかしい(特殊な状態)のでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-14 (土) 17:17:11
  • 河童の屁は,河童にあらず,屁である。ご返事ありがとうございました。テクニカルな問題ではなく、data自体の問題だと分かり、少し解決策が見えました。本当にありがとうございました。 -- ? 2013-09-14 (土) 21:38:55
  • 河童の屁は,河童にあらず,屁である。ご返事ありがとうございました。テクニカルな問題ではなく、data自体の問題だと分かり、少し解決策が見えました。本当にありがとうございました。 -- ? 2013-09-14 (土) 21:49:59

quantmodやTTRパッケージの使用時にエラー

yuki? (2013-09-14 (土) 16:17:17)

quantmodやTTRパッケージを使い株価チャートやテクニカル指標の表示をしたいです。
データの取得にgetSymbols()を使った場合、うまくいくのですが(下記コード参照)日本の株価を取得するためにRFinanceYJパッケージのquoteStockXtsData?()を使い、同様に実行すると次のエラーが表示されうまく行きません。

以下にエラー BBands(xx, n = n, maType = maType, sd = sd) : 
  Price series must be either High-Low-Close, or Close/univariate.

そこで対象のデータを、toyota[, c(2:4)]やtoyota[, c(4)]のようにもしましたがうまく行きませんでした。

以下にエラー runSum(x, n) : Invalid 'n'

解決方法をご教授いただけませんでしょうか。よろしくお願い致します。

library(RFinanceYJ)
library(quantmod) 
getSymbols("GS")
str(GS)
chartSeries(GS) 
addBBands()
addCCI() 
#日本の株価データで同上のことを行う
toyota <- quoteStockXtsData("7203.t", since="2013-08-23",
          date.end="2013-09-13", time.interval="daily")
str(toyota)
chartSeries(toyota) 
addBBands() # error
addCCI() #error 
chartSeries(toyota[, c(2:4)]) 
chartSeries(toyota[, c(4)]) 
addBBands() # error
addCCI() #error
  • 最初に断っておきますが,私は,この分野もこのライブラリも何にも知らないし,興味もないので,とにかくエラーなく動かすにはどうすれば良いかをみただけなので,再検証はあなたがやってください。
    まず,getSymbolsで取り込んだデータと quoteStockXtsData? の構造がどう違うかは確認しましたか。そこがスタートです。
    さて,次には,エラーの出る関数をデバグしましょう。debug(addBBands) としてから addBBands() として起動します。そうすると,対象としたデータが必要な情報を含んでいるかを調べる is.OHLC 関数が出てきます。その関数は has.Op(x), has.Hi(x), has.Lo(x), has.Cl(x) で 4 つ!の要素があるかどうかを見ますよ。エラーメッセージが示唆している High-Low-Close の 3 つじゃなあい。なので,まずは toyota[, 2:4] ではなくて,toyota[, 1:4] でなければならないことが判明します。
    それでもまだ,エラーは出ます。BBands もデバッグ対象にして作業を続けましょう。Invalid 'n' ってでるけど,関数中に n という変数があるが,なぜか n=20 というようになっている。あなたが最初に指定したデータは行数 16 ですね。少なすぎねぇか?since="2013-07-23" でやってみる。
    おお,動いたね。結果が正しいかどうかは知らない。-- 河童の屁は,河童にあらず,屁である。? 2013-09-14 (土) 18:13:07
    toyota <- quoteStockXtsData("7203.t", since="2013-07-23",
                date.end="2013-09-13", time.interval="daily")
    toyota2 <- toyota[,1:4]
    str(toyota2)
    chartSeries(toyota2) 
    addBBands()
    addCCI()
  • 河童の屁は,河童にあらず,屁である。さんありがとうございました。エラーなく動きました。 デバッグ関数を使ったことがなかったので勉強になりました。 勉強不足で大変恐縮なのですが、is.OHLC関数が4つの要素があるというのが、どこを見れば良いのかが分かりません。ご教授頂けると幸いです。-- yuki? 2013-09-14 (土) 19:10:37
    > debug(addBBands)
    > addBBands() 
    debugging in: addBBands()
    debug: {
        stopifnot("package:TTR" %in% search() ||
                  require("TTR", quietly = TRUE))
        draw.options <- c("bands", "percent", "width")
        draw <- draw.options[pmatch(draw, draw.options)]
        lchob <- get.current.chob()
        x <- as.matrix(lchob@xdata)
        chobTA <- new("chobTA")
        if (draw == "bands") {
            chobTA@new <- FALSE
        }
        else {
            chobTA@new <- TRUE
            on <- NULL
        }
        xx <- if (is.OHLC(x)) {
            cbind(Hi(x), Lo(x), Cl(x))
        }
        else x
        bb <- BBands(xx, n = n, maType = maType, sd = sd)
        chobTA@TA.values <- bb[lchob@xsubset, ]
        chobTA@name <- "chartBBands"
        chobTA@call <- match.call()
        chobTA@on <- on
        chobTA@params <- list(xrange = lchob@xrange, colors = lchob@colors, 
            color.vol = lchob@color.vol, multi.col = lchob@multi.col, 
            spacing = lchob@spacing, width = lchob@width, bp = lchob@bp, 
            x.labels = lchob@x.labels, time.scale = lchob@time.scale, 
            n = n, ma = maType, sd = sd, draw = draw)
        return(chobTA)
    }
  • library(quantmod) した後なら,コンソールに is.OHCL と入力すれば見ることが出来ます。デバグという観点からは,必要なときに必要なものを見るということですから,is.OHCL が適用されようとするところで,is.OHCL または print(is.OHCL) とすれば,is.OHCL の関数定義を見ることが出来るでしょう。 -- 河童の屁は,河童の屁は,河童にあらず,屁である。? 2013-09-14 (土) 20:28:24
  • 河童の屁は,河童にあらず,屁である。さんありがとうございました。 -- yuki? 2013-09-14 (土) 21:44:43

リストのファイルへの出力

masa? (2013-09-08 (日) 18:39:33)

リストのデータをwriteで出力すると以下の様なエラーがでます.
リストの出力はどのようにすればよいのでしょうか?

以下にエラー cat(list(...), file, sep, fill, labels, append) : 
  引数 1 (タイプ 'list') は 'cat' で取り扱えません
  • list は write(cat のラッパー)では出力できないということなので,write/cat または要素がデータフレームの場合ならば write.table などで要素ごとに書き出すことになるでしょう。単に,書き出してその後でまた読み込むだけということなら save でもよいし,print で出力されるような形式で内容をファイルに書き出したいということなら sink を使うということになるでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-08 (日) 20:55:39
  • 忘れていましたが,単純な,いい方法がありました。dput もしくは dump を使う方法です。これなら,どんなリスト構造でも保存でき,再読み込みも可能です。
    ただし,実数値については実用レベルでは何の問題もないと思いますが,all.equal で比較する程度では TRUE になりますが,identical で比較すると FALSE になることでしょう。
    ちなみに,Factor を含むようなデータでは,単に write.table などすると,levels が保存されなかったりということがあるが,dput/dump ではそういうことがないので,お勧めの方法かも。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-09 (月) 18:18:05
    set.seed(1234567)
    a <- list(c(3L, 5L, 8L), x=1.23, a=rnorm(10),
         b=letters[1:7], c=data.frame(a2=1:5, b2=factor(1:5),
         c2=month.abb[1:5]), d=matrix(1:12, 3),
         e=list(a3=1, b3="abc"), f=c(TRUE, FALSE),
         g=factor(c("male", "female")))
    dput(a, file="list.dat")
    b <- source("list.dat")[[1]] # [[1]] を忘れずに
    for (i in seq_along(b)) { # 同じであることを確認
         cat(names(b)[i], all.equal(a[[i]], b[[i]]), "\n")
    }
    # dump を使う場合は,
    # dump("a", "foo") の後,souce("foo") をすると a ができる
    # ファイル内容を見れば dput と dump の違いが分かる

tcltkで複数リストボックス使用時に要素選択解除されてしまう

はいよー? (2013-09-06 (金) 14:42:37)

tcltkでリストボックスを2個表示してそれぞれの要素を選択した後、OKボタンでそれらの要素名を取得するための下記のようなスクリプトにおいて他方のリストボックスにフォーカスを移すと選択が解除されてしまい、結局どちらか一方の要素しか選択できません。tkpackにしたり、孫フレームで両者を分けたりしてみましたがダメでした。Rコマンダーの似たようなフォームでは選択が解除されないかと思いますがどのような手直しが必要でしょうか?よろしくお願いいたします。(R3.0.1、R2.15.2)

require(tcltk)
wintop<-tktoplevel()
OnOK <- function()
{
 fru1 <- fruits1[as.numeric(tkcurselection(listbox1))+1]
 fru2 <- fruits2[as.numeric(tkcurselection(listbox2))+1]
    tkdestroy(wintop)
    msg <- paste(fru1,"and",fru2, "are selected.",sep=" ")
    tkmessageBox(message=msg)
}

listbox1 <-tklistbox(wintop, selectmode = 'single')
fruits1 <- c("Apple","Orange","Banana","Pear")
for (i in (1:4)){tkinsert(listbox1,"end",fruits1[i])}
tkgrid(listbox1)

listbox2 <-tklistbox(wintop, selectmode = 'single')
fruits2 <- c("Cherry","Pear","Mango","Pear")
for (i in (1:4)){tkinsert(listbox2,"end",fruits2[i])}
tkgrid(listbox2) 

OK.but <-tkbutton(wintop,text=" OK ",command=OnOK)
tkgrid(OK.but)
tkfocus(wintop)
  • プログラミングは他人のソースを読むことがスキル向上の近道だと思います。「コマンダーの似たようなフォームでは選択が解除されない」と分かっているなら、Rcmdrのソースを参照してはどうでしょうか。-- 2013-09-07 (土) 12:11:35
    Rcmdrのソースを参照すると、
    $ grep -l tklistbox Rcmdr/R/*.R
    Rcmdr/R/data-menu.R
    Rcmdr/R/statistics-models-menu.R
    Rcmdr/R/utilities.R
    ということなので、どれでもいいですが、例えば、utilities.Rの中を見ます。すると、
       listbox <- tklistbox(frame, height=min(listHeight, length(variableList)),
           selectmode=selectmode, background=bg, exportselection=export,
           width=min(max(minmax[1], nchar(variableList)), minmax[2]))
    と書いてあります。exportselectionが怪しいとあたりをつけて、検索すると複数のリストボックスを使用する場合などの解説が見つかります。
  • 探してみます。ご指導誠にありがとうございました。 -- はいよー? 2013-09-08 (日) 17:43:19

8桁の数字を日付型に変換する

かけだし? (2013-09-04 (水) 17:24:48)

Rを始めたばかりのものです。R3.0.1 64ビット Windowsを使用しています。
8桁の数字データ(ex. 20130904)を日付型に変換する方法について教えてください。
日付型に変換するには、as.Dateを使えばよいと考えて、データを読み込んだ後、まずas.characterで文字型に変換しました。
modeで型変換ができていることは確認しました。
しかし、それをas.Date関数に入れても、エラーとなり文字型にできません。

実際にはデータフレームの1列を使ってやっているのですが、1例として示しますと、下記のような感じです。

> as.Date("20130904")
 以下にエラー charToDate(x) : 
   文字列は標準的な曖昧さのない書式にはなっていません 
> as.Date("2013/09/04")

→スラッシュが入っているとうまくいくようです。

この場合、Rに読み込んだ後にどのような操作をすればよいのでしょうか。
ご教示いただけましたら幸いです。よろしくお願いいたします。

  • 単に / を挿入することで解決するなら,挿入するようにプログラムすれば良いでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-04 (水) 17:59:20
    > a <- "20130904"
    > as.Date(sprintf("%s/%s/%s", substr(a, 1, 4), substr(a, 5, 6), substr(a, 7, 8)))
    [1] "2013-09-04"
  • 早速ありがとうございました。無事できました。sprintfの使い方も勉強になりました。 -- かけだし? 2013-09-04 (水) 18:06:29
  • いやいや、そこはちゃんとヘルプを読んで正面から向き合いましょうよ。 -- 2013-09-06 (金) 12:05:26
    > as.Date("20130904", format = "%Y%m%d")
    [1] "2013-09-04"
    > as.Date("2013年9月4日", format = "%Y年%m月%d日")
    [1] "2013-09-04"

Rで画像( .jpgなど)の生成

tamn? (2013-09-03 (火) 01:44:54)

a.jpg, b.jpg, c.jpg(以下、a, b, c)という画像ファイルがあります。
データフレームの情報をもとに、aとbを横に並べた1つの画像(ab_yoko.jpg)や、bとcを縦に並べた1つの画像(bc_tate.jpg)を生成するような処理は可能でしょうか?
ライブラリなどあれば教えていただけないでしょうか。
難しければ、他の言語やソフトでということになるのですが、Rでできればと思ってます。
よろしくお願いします。

  • jpegパッケージのreadJPEG()で読み込んで、cbind()やrbind()で適宜結合してから、writeJPEG()で出力すればどうかと思いますが、いかが。 -- 2013-09-03 (火) 12:19:48
  • ありがとうございます。jpegの入力・出力はできたのですが、結果が思ったものになりません。rbind()の実行で列結合になっていないようで、それが原因かと思うのですが解決方法を上手く調べることができませんでした。解決方法をご教授頂けると幸いです。よろしくお願い致します。 -- tamn? 2013-09-03 (火) 22:32:52
    library(jpeg) 
    # read a sample file (R logo) 
    img <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg")) 
    # read it also in native format 
    img.n <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg"), TRUE) 
    # 画像データの結合 
    img2 <- rbind(img, img.n) 
    # img2 <- rbind(img, img) 
    # 保存
    path <- paste(getwd(), "/img2.jpg", sep="") 
    writeJPEG(img2, target = path, bg = "white")
  • readJPEG の使用例は見たようですが,なぜ,その使用例の下の部分 rasterImage の使用例のところを見なかったのでしょうか(見たけど分からなかった?)使用例では,グラフィックデバイスに描くようになっているけど,plot の前に jpeg 関数で出力ファイルを指定(最後に dev.off)してやれば,保存できますでしょ。軸や軸名や bty="n" とか mpar を調整するとかは必要でしょうが。
    readJPEG が返すオブジェクトは array なので,rbind, cbind じゃできないと思いますね。 -- 河童の屁は,河童にあらず,屁である。? 2013-09-04 (水) 12:05:56
    > # read a sample file (R logo)
    > img <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg"))
    > 
    > # read it also in native format
    > img.n <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg"), TRUE)
    > 
    > # if your R supports it, we'll plot it
    > jpeg("test.jpeg")
    > if (exists("rasterImage")) { # can plot only in R 2.11.0 and higher
    +   plot(1:2, type='n')
    + 
    +   rasterImage(img, 1.2, 1.27, 1.8, 1.73)
    +   rasterImage(img.n, 1.5, 1.5, 1.9, 1.8)
    + }
    > dev.off()
    test.jpg
  • ありがとうございます。rastetImageの使用例は確認いたしました。説明してない部分があり申し訳ないのですが、例えば縦400px 横800ピクセルの画像を2枚縦に並べたとき、最終的にオリジナル画像を並べた縦800px(400*2枚) 横800pxの画像を保存したいと思っています。ご教授頂いた方法だと縦800px, 横800pxの画像は作成できると思いますが、そのサイズの枠の中に画像を貼り付けるようなイメージであり、画像のオリジナルのサイズや縦横比を保持するのが難しいのではないかと思ったのです。オリジナルの画像サイズのまま画像を結合する方法があれば教えて下さい。なければこの方法でトライしようと思っています。 -- tamn? 2013-09-04 (水) 14:10:13
  • 最初にjpegパッケージを提案した者です。次をヒントにされてはいかが。 -- 2013-09-06 (金) 10:01:05
    > img <- readJPEG(system.file("img", "Rlogo.jpg", package="jpeg"))
    > R <- img[,,1]
    > G <- img[,,2]
    > B <- img[,,3]
    > str(img)
     num [1:76, 1:100, 1:3] 1 1 1 1 1 1 1 1 1 1 ...
    > img2 <- array(NA, c(76 * 2, 100, 3))
    > img2[,,1] <- rbind(R, R)
    > img2[,,2] <- rbind(G, G)
    > img2[,,3] <- rbind(B, B)
    > writeJPEG(img2, target = "/tmp/tmp.jpg")
    2rlogo.jpg
  • ありがとうございます。希望通りの結果を得ることができました。実際はもう少し複雑な処理をしたいと考えておりますが、大変参考になるものです。アドバイス下さったお二方、どうもありがとうございました。 -- tamn? 2013-09-06 (金) 23:14:49

ベクトルの任意の長さでの分割

mashi? (2013-08-26 (月) 22:38:17)

長いベクトルを前から順番に,指定した長さで,分割する効率的な方法にはどのようなものがあるのでしょうか。
(例えば,10個の数字を,1,3,2,4こずつに分割するなど)
データ量が多いのでループを使うと処理しきれません。
よろしくお願いします。

  • > データ量が多いのでループを使うと処理しきれません
    というのがどういうことかよく分からないので,提案するプログラムがあなたの仕様に適合するかわかりませんが...
    for を使う func2 と,mapply で for を隠蔽した func1 では実行時間にたいして差はありません。
    そもそも,どちらであっても例に挙げた程度の大きさのデータだと,あっという間の計算時間だと思いますけど。
    あなたはどんなプログラムを書きましたか?(書こうとしましたか?) -- 河童の屁は,河童にあらず,屁である。? 2013-08-26 (月) 23:25:13
    func1 <- function(vec, len) {
    	n <- length(len)
    	end <- cumsum(len)
    	begin <- c(1, (end+1)[-n])
    	mapply(function(b, e) vec[b:e], begin, end)
    }
    
    func2 <- function(vec, len) {
    	n <- length(len)
    	ans <- vector("list", n)
    	end <- cumsum(len)
    	begin <- c(1, (end+1)[-n])
    	for (i in seq_along(begin)) {
    		ans[[i]] <- vec[begin[i]:end[i]]
    	}
    	return(ans)
    }
    ベンチマーク
    > library(rbenchmark)
    > vec <- 1:15000
    > len <- rep(c(1, 3, 2, 4, 5), 1000)
    > benchmark(func1(vec, len), func2(vec, len))
                 test replications elapsed relative user.self sys.self
    1 func1(vec, len)          100   2.043    1.000     2.042    0.019
    2 func2(vec, len)          100   2.378    1.164     2.387    0.011
  • おそらく最も簡便で高速な(そして後々のポータビリティの良さ)方法は行列化してから添字操作をすることでしょう.この方法はリスト化してから行列にすれば,文字列ベクトルにも使えます. -- 2013-08-29 (木) 07:43:03
    > x <- c(0:9,0:9,0:9) # 長い数値ベクトルのつもり
    > X <- matrix(x,3,10,byrow=TRUE); X
         [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    [1,]    0    1    2    3    4    5    6    7    8     9
    [2,]    0    1    2    3    4    5    6    7    8     9
    [3,]    0    1    2    3    4    5    6    7    8     9
    > X1 <- X[,1,drop=FALSE]; X1 # オプションdrop=FALSEに注意
         [,1]
    [1,]    0
    [2,]    0
    [3,]    0
    > X2 <- X[,2:4,drop=FALSE]; X2
         [,1] [,2] [,3]
    [1,]    1    2    3
    [2,]    1    2    3
    [3,]    1    2    3
    > X3 <- X[,5:6,drop=FALSE]; X3
         [,1] [,2]
    [1,]    4    5
    [2,]    4    5
    [3,]    4    5
    > X4 <- X[,7:10,drop=FALSE]; X4
         [,1] [,2] [,3] [,4]
    [1,]    6    7    8    9
    [2,]    6    7    8    9
    [3,]    6    7    8    9
  • ↑ ??なにやってんの??matrixにする意味分からんし、やっていることは x[1]; x[2:4]; x[5:6]; x[7:10] と同じだし、長さの指示ぶんだけ、自分で添え字を書くつもりか? -- 2013-08-29 (木) 10:46:24
  • 上の行列化って言っている人、題意を読み間違えていますよ。10個の数字が循環するわけではありませんよ。例えば、次のようなニーズをどうやって行列化で解決しますか? -- 2013-08-30 (金) 10:48:35
    > set.seed(123)
    > x <- round(runif(10000))   #長いベクトル
    > head(x, 20)
     [1] 0 1 0 1 1 0 1 1 1 0 1 0 1 1 0 1 0 0 0 1
    > g <- abs(round(rnorm(1000))) + 1  #長さ指定のベクトル
    > head(g, 20)
     [1] 2 1 2 3 2 1 2 4 2 3 2 1 1 1 1 1 1 3 1 1
    gが指定する長さで、長いベクトルxを区切りたい。さて、どうしますか?河童さんの方法なら、一発で解決ですが、あなたの方法なら、2000個の添え字をいちいち計算しながら、入力しなくてはいけません。全く簡便ではないし、1000回も手で計算しているうちにミスも混入します。 ここはWikiシステムなので、ご自分の書き込みが不適切を思われれば、ご自分の書き込みとその反応(上の人の突っ込みと、私の書き込み、そして下のsample()を提案している人の書き込み)も含めてさくっと削除してもOKだと思います。
  • ちなみに,「長さ」のベクトル作るなら,sample 関数を使うのがモア・ベター。sample(10, 1000, replace=TRUE) などのようにね。 -- tinami? 2013-08-30 (金) 11:08:48

シェアを被説明変数とした入れ子型ロジットモデル(nested logit model)について

マルボロ川越? (2013-08-23 (金) 15:31:43)

選択結果(0,1)を被説明変数とした入れ子型ロジットモデルでの分析方法はわかりました。しかし、被説明変数をマーケットシェアとして分析した場合、t値が非常に小さくなりうまくいきません。
パッケージはlogit modelの対数尤度関数の定義であるfunction()やoptim()を用いています。
単純に選択結果をマーケットシェアに変更しただけではよろしくないのでしょうか?

NAを含むデータで,factanal2の因子得点を利用したい

(2013-08-17 (土) 09:25:35)

NAを含むデータで,青木先生のfactal2関数で因子得点を利用したいと思ったのですが,NAを含む行を削除しているために,既存のデータセットに加えることができません。以下のエラーが発生しました。

以下にエラー data.frame(..., check.names = FALSE) : 
   引数は異なった列数を意味します:  5256, 5001, 4883, 487

そこで,削除された行を挿入して,NAにしたいと思ったのですが,どのように行ったらよいのでしょうか。

  • 以下のようにすればよろしいかと。merge について調べると吉。merge 以下の3行は,もとのデータフレームの行の順序を維持するためで,維持する必要がなければなくてもよい。 -- 河童の屁は,河童にあらず,屁である。? 2013-08-17 (土) 11:43:22
    set.seed(4649)
    d <- data.frame(matrix(rnorm(300), 50))
    d[6, 3] <- d[24, 2] <- d[48, 5] <- NA
    A <- factanal2(d, factors=2, scores="regression", verbose=FALSE)
    B <- merge(d, A$scores, by="row.names", all=TRUE, sort=FALSE)
    C <- B[order(as.numeric(B[,1])),]
    rownames(C) <- C[,1]
    C <- C[,-1]

tcltkで書き込んだ変数を変数として保存したい

たく? (2013-08-15 (木) 17:26:34)

例えば以下の例のようにtcltkでGUIで値を入れたりすることができますが、この例だと関数の中に変数が入ってしまうために、入力した値を変数として保存できません。
入力値を変数に残してその後使えるようにする良い方法をご存じでしたらどなたかお教えいただければ幸いです。
(環境はWin7 R3.01 64bitで、macではXのインストールが必要だと思います。)

require(tcltk)
tt<-tktoplevel()
Name <- tclVar("Anonymous")
entry.Name <-tkentry(tt,width="20",textvariable=Name)
tkgrid(tklabel(tt,text="Please enter your first name."))
tkgrid(entry.Name)
OnOK <- function()
{
	NameVal <- tclvalue(Name)
	tkdestroy(tt)
	msg <- paste("You have a nice name,",NameVal)
	tkmessageBox(message=msg)
	return(NameVal)
}
OK.but <-tkbutton(tt,text="   OK   ",command=OnOK)
tkbind(entry.Name, "<Return>",OnOK)
tkgrid(OK.but)
doneval1 <- NameVal #関数の中なので変数として保存できない
doneval2 <-  tclvalue(Name) #関数の中なので変数として保存できない
tkfocus(tt)
  • 禁じ手かも知れないけど、「NameVal? <- tclvalue(Name)」を「NameVal? <<- tclvalue(Name)」にすると、GUIで入力した値を持つNameVal?が残るよ。 -- 2013-08-16 (金) 01:35:28
  • 大変ありがとうございます。help.search("<<-")で調べてみると関数内からグローバルに定義する方法として普通に使われるんですね。助かりました。 -- たく? 2013-08-16 (金) 11:43:46

ROC曲線の重ね書き

yaito? (2013-08-11 (日) 17:32:25)

R初心者、というか今日から始めたばかりです。
EZRというコマンダーを使ってROC曲線を書いてみたのですが、いくつかのROCを重ねたFigureが作りたいのですが、作れません。2つまでならソフトにあるのですが、3つ以上重ねるにはどのようなスクリプトが必要なのでしょうか。何かおすすめの本などもありましたら御教授お願いします。

一般的なsumについて

chaemon? (2013-08-07 (水) 22:31:06)

初投稿です。
結合法則が成り立つ2項演算子☆が定義されているとして、ベクトルv=(v_1, v_2, ..., v_n)に対して(v_1☆v_2☆v_3☆・・・☆v_n)を高速に計算してくれるような関数はありますか。
+に対するsumのようなイメージです。
ベクトルによる並列処理などをしてくれて、for文で回すよりも早いものがよいです。
ないとすれば、作成したいのですが、その場合どちらのページを参考にするのがよいですか。
よろしくお願いします。

  • 速度を重視するなら、C言語で書いてRから呼び出すべきで、R言語だけで努力してもそれほど速くなりません。お題の演算は再帰関数を作成することになると想像しますが、例えば「+」をベクトル処理する再帰関数をRで書いても、Cで書かれたsum()には勝てませんでした。 -- 2013-08-09 (金) 15:57:02
    f1 <- function(x){
        if(length(x) <= 1) return(x)
        else {
            i <- length(x)
            y <- sapply(1:floor(i/2),
                        function(m){
                            x[2 * m - 1] + x[2 * m]
                        })
            if(i %% 2 != 0) y <- c(y, x[i])
            return(Recall(y))
        }
    }
    > system.time(f1(1:10000))
       ユーザ   システム       経過  
         0.032      0.000      0.029 
    > system.time(sum(1:10000))
       ユーザ   システム       経過  
             0          0          0 
    従って、C言語のリファレンスを参照してださい。マニュアルのWriting R Extensionsには、C言語とRの連携について解説されています。
  • 「並列処理」をする必要性は分かりませんが,単にベクトルを引数としてforなどを使わない関数ということなら,上の人が言うように R でがんばるのは意味がないでしょう。再帰関数は for を使うよりも遅いですし,絶対にお勧めできませんね。C でプログラムを書いて R を呼び出してというのは Rcpp を使えば簡単至極です(C の端っこでも囓っていればでしょうが)。
    このやりかたならば,for を使っても何の問題もないです。sum と f2 を比較してみればわかります。
    ということで,Rcpp を参照。 -- 河童の屁は,河童にあらず,屁である。? 2013-08-09 (金) 21:56:41
    library(inline)
    src <- '
    	Rcpp::NumericVector x(X);
    	double ans = x(0);
    	for (int i = 1; i < x.size(); i++) {
    		ans += x(i);
    	}
    	return wrap(ans);
    '
    f2 <- cxxfunction(signature(X="numeric"), src, plugin="Rcpp")
    f3 <- function(x){
    	ans <- 0
    	for (y in x) ans <- ans+y
    	return(ans)
    }
    実行結果
    > n <- as.numeric(1:1e6)
    > library(rbenchmark)
    > benchmark(sum(n), f1(n), f2(n), f3(n), Reduce("+", n),
    +           replications=10)
                test replications elapsed relative user.self sys.self
    2          f1(n)           10  32.789  964.382    32.750    0.244
    3          f2(n)           10   0.063    1.853     0.064    0.000
    4          f3(n)           10   3.144   92.471     3.144    0.014
    5 Reduce("+", n)           10   3.544  104.235     3.522    0.037
    1         sum(n)           10   0.034    1.000     0.034    0.000
  • ?Reduce 速さは? -- 2013-08-10 (土) 06:46:45
  • ↑ Reduce は,R で for を使うより遅いようだね。上の結果に追加した。 -- 河童の屁は,河童にあらず,屁である。? 2013-08-10 (土) 11:06:29
  • 大変遅くなってしまい申し訳ありません。皆様、ありがとうございます。やはりC言語を呼び出すことになるんですね。Rcppの使い方を勉強してみます。確かに、用意されている関数の中ではReduceがこの用途に最も近いように思いますが、速度における最適化がなされていないようですね。 -- chaemon? 2013-08-15 (木) 17:40:16

多分岐のツリー分析モデル作成時のエラー対応について

イズミ? (2013-08-03 (土) 08:04:11)

初めてこちらに投稿します。
よろしくお願いします。

多分岐(C5.0)でツリー分析のモデルを作成しようとしたところ、以下のようなエラーメッセージが表示されました。

以下にエラー paste(apply (x,1,paste,collapse = ","),collapse = "\n"):
結果が2^31-1バイトを超えました

モデル作成は、以下のデータで行いました。
・データのファイル容量:約2.5GB
・データのレコード件数:約300万件
・説明変数とした項目数:約50項目

処理で使用したPCの物理メモリは32GBで、データ量を約40万件に減らしたところ、上記のエラーメッセージは表示されず、モデルは作成できました。
また、C5.0ControlでminCaseを10000とか20000にして、ノード内の最小データ件数を増やすことで、作成されるノード数を減らそうとしたのですが、同じメッセージが表示されます。

なお、上記データにて、tree関数で二分岐のツリーモデルを作成することができたので、データの中身は問題ないと考えています。


Google等で調べてもわからず、こちらにやってきました。
恐れ入りますが、解決策のご教示のほど、よろしくお願いします。

  • 32bit R ですか?64bit R ではどうなりますか? -- 河童の屁は、河童にあらず、屁である。? 2013-08-03 (土) 14:12:24
  • 使用しているのは、64bit R です。基本情報に記載しておらず、申し訳ございません。 -- イズミ? 2013-08-03 (土) 16:43:08
  • 意外な関数も限界は持っているようです。たとえば rep
    > a <- rep(1, 2^31)
     以下にエラー rep(1, 2^31) :  'times' 引数が不正です 
     追加情報:  警告メッセージ: 
     強制変換により NA が生成されました
    > b <- rep(1, 2^31-1) # エラーなし
    > length(b)
    [1] 2147483647
    > 2^31-1
    [1] 2147483647
    ということなので,paste も「結果が2^31-1バイトを超えました」というからには,案外な限界を持っているということなのでしょう。
    エラーを実際に出そうとしても,データフレームを作るだけで結構な時間が掛かるので,やめました。
    ということで,解決法はナシということかな。
    もっとも,実質的に限界なしの paste を書けばよいのでしょうが。
    いかにビッグデータばやりといえど,300万件を使う必要があるのかなとも思いますし,使う必要があるなら R 以外の方法を採るべきなのかも知れませんね。-- 河童の屁は,河童にあらず,屁である。? 2013-08-05 (月) 21:50:07

chrome os

77? (2013-08-01 (木) 23:03:13)

chrome os でRはインストールできますか?

ある時刻のデータを抽出したい

かものはし? (2013-08-01 (木) 15:24:29)

下記のようなデータがあって、例えば13:00〜15:00のデータだけ抽出する場合、どのようにすれば良いでしょうか。また、数日間にわたって採取したデータの中から昼間のデータ(6:00〜18:00)だけとか、夜間のデータ(18:00〜翌朝6:00)だけを抽出することも可能でしょうか。Googleで調べてもそれらしい方法に出会えなかったのでここにやってきました。よろしくお願いします。

                     x   y
1  2010-08-01 12:14:00 230
2  2010-08-01 13:14:00 260
3  2010-08-01 14:14:00 300
4  2010-08-01 15:14:00 260
5  2010-08-01 16:13:00 240
  • x が文字列(あるいは文字列に変換できるもの),データフレーム名を d として,以下のような方法も。あれこれさがすより,取りあえず動くものを作る。
    hm <- as.integer(paste(substr(d$x, 12, 13),
    +                substr(d$x, 15, 16), sep=""))
    d[1300 <= hm & hm <= 1500,] # 13:00 〜 15:00
    d[0600 <= hm & hm <= 1800,] # 06:00 〜 18:00
    d[!(0600 < hm & hm < 1800),] # 06:01 〜 17:59 でないもの
    秒まで考慮する必要があるならそれなりに。 -- 河童の屁は,河童にあらず,屁である。? 2013-08-01 (木) 16:03:51
  • すばらしい! 何かそういう関数があるのではないかと固執していました。ありがとうございます。 -- かものはし? 2013-08-01 (木) 17:21:03
  • もちろん「そういう関数」はあります。日付、時間関数Tips大全を参照して下さい。 -- 2013-08-01 (木) 21:42:14
  • 「そういう関数」の存在は知っているが,それをどう組み合わせれば望みのことが出来るかがわからない -- 2013-08-01 (木) 23:04:33
  • 上の河童さんの回答が理解できるのに、何故、straightforwardな方法が分からないのか謎だけど、次のようにすればいかがでしょうか。 -- 2013-08-02 (金) 09:54:38
    > a <- data.frame(x = as.POSIXct("2010-08-01 12:14") + 
    +                     cumsum(c(0, rep(60 * 60, 47))),
    +                 y = round(runif(48, 200, 300)))
    > head(a, 3)
                        x   y
    1 2010-08-01 12:14:00 241
    2 2010-08-01 13:14:00 280
    3 2010-08-01 14:14:00 239
    というサンプルデータをあなたのデータに似せて作りました。
    > a$hours <- format(a$x, "%H")
    時間を新しいカラムに入れます。13時から15時を取り出します。
    > a[with(a, hours >= 13 & hours <= 15), ]
                         x   y hours
    2  2010-08-01 13:14:00 280    13
    3  2010-08-01 14:14:00 239    14
    4  2010-08-01 15:14:00 266    15
    26 2010-08-02 13:14:00 237    13
    27 2010-08-02 14:14:00 300    14
    28 2010-08-02 15:14:00 270    15
    目で見て分かりやすいようにhoursをデータフレームに追加しましたが、本当はそうする必要はないです。念のため。もし、秒まで考えたいなら0時0分0秒からの経過秒を考えればよいと思います。分かりやすいベタな方法はformat()とas.numeric()を使う方法です。
    as.numeric(format(a$x, "%H")) * 60 * 60 +
        as.numeric(format(a$x, "%M")) * 60 +
        as.numeric(format(a$x, "%S"))
    私は計算式文字列を作成してからeval()で計算する方が好みです。
    sapply(a$x, function(i){eval(parse(text=format(i, "%H * 60 * 60 + %M * 60 + %S")))})
  • format関数もwith関数も知らなかったので、この方法はハードルが高いように感じましたが、勉強して理解できるようになりたいです。どうもありがとうございました。 -- かものはし? 2013-08-03 (土) 13:24:29

構築したモデルの予測(PLS)

さぼりん? (2013-07-25 (木) 16:22:51)

さぼりんです。またお世話になります。
トレーニングデータをもとにモデルを構築し、テストデータを用いてモデルの当てはまりの良さを確認したいです。
トレーニングデータ"130725_test31_train.csv"は、X(入力)が7行x6列で、Y(出力)が7行x1列です。また、テストデータ"130725_test31_test.csv"は、Xが3行x6列で、Yが3行x1列です。(CSVファイルは別途アップロードします。)
下記のコマンドを実行したところ、モデルからの予測値(test.pred)が7行表示されました。テストデータに対する予測を行うのだから、値は3行表示されるべきだと考えています。コマンドの出力結果は正しいのでしょうか。
恐れ入りますが、ご教授をお願い致します。

test31.train <- read.csv ("130725_test31_train.csv")
Y <- as.matrix(test31.train[ ,7])
X <- as.matrix(test31.train[ ,1:6])
Y <- scale(Y)
X <- scale(X)
test31.pls <- plsr(OUTPUT ~ X, 2, data = test31.train,
                   validation = "LOO")
test31.test <- read.csv ("130725_test31_test.csv")
Y <- as.matrix(test31.test[ ,7])
X <- as.matrix(test31.test[ ,1:6])
Y <- scale(Y)
X <- scale(X)
test.pred <- predict(test31.pls, ncomp = , test31.test$X)
test.pred
, , 1 comps
OUTPUT
1 437321.1
2 437871.6
3 436570.5
4 439711.1
5 438163.7
6 440080.2
7 437147.9
, , 2 comps
OUTPUT
1 439055.4
2 439095.0
3 436742.8
4 440570.5
5 436976.8
6 439369.7
7 435055.7
  • predict(test31.pls, ncomp = , test31.test$X) の newdata として指定されている test31.test$X はおかしいでしょう。test31.test[,1:6] などとなるはず。
    なお,test31.train と test31.test のデータを scale により正規化しているが,最終列(7 列目)は正規化する必要はないし(実際,使っていない),1 〜 6 列もデータフレームごとに正規化しても意味をなさない(たとえば,1,3,5 と 3,4,5 を別々に正規化した結果と,1,3,5,3,4,5 を正規化した結果を想像すれば自明)。
    ということで,以下のようにすべきでしょう。 -- 河童の屁は,河童にあらず,屁である。? 2013-07-26 (金) 11:22:02
    test31.train <- read.csv ("130725_test31_train.csv")
     # 7 行 7 列,最終列の名前が OUTPUT
    test31.pls <- plsr(OUTPUT ~ ., 2, data = test31.train,
                       validation = "LOO")
    test31.test <- read.csv ("130725_test31_test.csv")
     # 3 行 7 列,最終列の名前が OUTPUT
    test.pred <- predict(test31.pls, test31.test[,1:6])
     # OUTPUT を含まない場合は [,1:6] は不要
    test.pred                                            
     # そもそも predict に OUTPUT は不要
  • ご回答ありがとうございます。うまくできました。暗中模索の初心者にとって、こういったサイトがあるのは非常に助かります。素晴らしいです。 -- さぼりん? 2013-07-26 (金) 12:32:00

確率の期待値計算

koheizm? (2013-07-25 (木) 12:12:44)

少し統計よりの質問なので恐縮なのですが、下記のような期待値を算出したい時の関数やライブラリをご存知でしたらご教授願います。
===
コイントスで三枚同時に投げる
表の確率1/2 裏の確率1/2
表が出た回数をxとする
===
この時のE(x)とV(x)を導きたいのです。
n数が少ない場合は順を追って計算し算出出来るのですが~、もっと上手く算出できるのではないかなと思って質問させていただきます。
二項分布のdbnoimや一様分布のrunif、コインパッケージなどを調べてて行き詰まってしまいました。

  • この分布は二項分布です。表の出る確率を p,n 枚のコインを投げるとすると(1 枚のコインを n 回投げるのも,n 枚のコインを同時に投げるのも同じ),二項分布の平均値は np,分散は np(1-p) です。
    あえて計算してみたいというなら以下のようなプログラム(シミュレーションではないので,結果は正確--つまり,理論値が得られる)。 -- 河童の屁は,河童にあらず,屁である。? 2013-07-25 (木) 13:40:48
    func <- function(n) {
    	if (n <= 20) {
    		require(e1071)
    		f <- table(rowSums(bincombinations(n)))
    		x <- as.numeric(names(f))
    		mean <-  sum(f*x)/2^n
    		variance <- sum(f*(x-mean)^2)/2^n
    		return(c(mean=mean, variance=variance))
    	}
    }
    使用例
    > n <- 20
    > p <- 1/2
    > func(n)
        mean variance 
          10        5 
    > c(n*p, n*p*(1-p)) # 理論値
    [1] 10  5

PLS回帰用データ構造の制限について

foo? (2013-07-22 (月) 16:58:39)

質問事項
PLSに関するデータ構造の制限(仕様)を教えて下さい。 (例:0は処理できない、次元数はxxまで等)
以下、テスト内容。
1. PC環境
 Windows 7 Enterprise Service Pack 1
 Intel(R) Core(TM) i5 CPU 2.67 GHz
 RAM 2.00GB
 32bit
2. R環境
 R-3.0.1
 PLS 2.3.0
3. データ構造
 3-1. Xが入力、Yが出力
  X 19列x15行
  Y 1列x15行
 3-2. Xが入力、Yが出力
  X 719列x23行
  Y 1列x23行
4. PLS検証結果
 4-1. 上記3-1、3-2のデータにおいて、
  0が含まれると5.のエラーが出力され計算できない。
 4-2. 上記3-1のデータで5.のエラーが出力され計算できない。
  上記3-2のデータについては一度計算できた。<-- 再現性に疑問。
5. エラー
 Invalid number of components, ncomp

  • 0が処理できないとか,次元数にきつい制限があるなんてことはないはず。0が含まれるあなたのと同じサイズのテストデータで,問題なく分析できましたが。
    > set.seed(37564)
    > x <- matrix(rnorm(23*719), 23)
    > y <- matrix(rnorm(23), 23)
    > x[1, 1] <- y[2, 1] <- 0
    > a <- plsr(y~x, ncomp=2) # pcr にしても,エラーにはならない
    > summary(a)
    Data: 	X dimension: 23 719 
    	Y dimension: 23 1
    Fit method: kernelpls
    Number of components considered: 2
    TRAINING: % variance explained
       1 comps  2 comps
    X    4.406    8.622
    y   95.943   99.886
    あなたの使い方が悪いのでは?関数をどのように使ったかわからないのでどうともいえないけど。
    エラーメッセージを素直に受け取ると,ncompに指定された値が不正ということなのだから,その値をもう少し小さい値にする(1とか2にしてみる)とどうなるか。そもそもあなたは,幾つを指定したのか。理論的に許される範囲外の値を指定しても,理論的に可能な最大の数値を仮定しての結果は返してくれると思いますが?
    また,再現性がないというのも,あなたの使い方が同じではなかったせいではないですかね?
    同じエラーが出る,この掲示版にペーストしても差し支えない程度のもう少し小さいデータセットとともに再質問されることをお勧めします。 -- 河童の屁は,河童にあらず,屁である。? 2013-07-22 (月) 17:12:19
  • CSVファイルを読み込ませて次のような形で処理させました。ncompは1〜21まで試しました。データ構造が原因ではないようなので、他のアプローチで再チャレンジしてみます。-- さぼりん? 2013-07-24 (水) 13:54:08
    future21 <- read.csv ("xxx.csv") 
    Y <- as.matrix(future21[ ,720]) 
    X <- as.matrix(future21[ ,1:719]) 
    Y <- scale(Y) 
    X <- scale(X) 
    future21.pls <- plsr(BCD ~ X, 10, data = future21, validation = "LOO")   
    summary(future21.pls) 
  • xxx.csv から読みましたというのは,なんの意味も持たない。どんなデータなのか全く分からないのだから。
    「この掲示版にペーストしても差し支えない程度のもう少し小さいデータセットとともに再質問」と書いたでしょう?-- 河童の屁は,河童にあらず,屁である。? 2013-07-24 (水) 14:17:16
  • 「データ構造が原因ではない」というのは取り消します。そう断定するのはまだ早いと思ったので。下記データセットだと問題なくPLSの計算を行えます。列を5倍にすると現象が発生します。-- さぼりん? 2013-07-24 (水) 14:46:39 791,791.5,792,792.5,793,793.5,794,794.5,795,795.5,796,796.5,797,797.5,798,798.5,799,799.5,800,OUTPUT
    684.9813665,768.4782609,896.0124224,1174.484472,254
    8< 8< 8< 8< チョッキン
    2.652174,10124.80124,19166.38509,28904.43478,34559.7
  • こんなに大きいデータを貼り付けられても困ります。しかも,エラーなく計算されるデータでは意味がありません。
    zip かなんかにしてアップロードする?
    列を50倍に水増ししても,なんなく答は出ましたけど。 -- 河童の屁は,河童にあらず,屁である。? 2013-07-24 (水) 15:41:18
    library(pls)
    future21 <- read.csv("pls.csv")
    n <- 20
    Y <- as.matrix(future21[,n])
    X <- as.matrix(future21[ ,1:(n-1)]) 
    # 1000 列+1列に水増し
    n <- 1000
    future21times50 <- cbind(data.frame(matrix(sample(X,
        nrow(future21)*n, replace=TRUE), ncol=n)), Y)
    Y <- as.matrix(future21times50[ ,n]) 
    X <- as.matrix(future21times50[ ,1:(n-1)]) 
    Y <- scale(Y) 
    X <- scale(X) 
    future21times50.pls <- plsr(Y ~ X, 10,
        data = future21times50, validation = "LOO")   
    summary(future21times50.pls)
  • エラーが出たファイルをアップします。ファイル名は"130724_test24_NG.csv"です。 -- さぼりん? 2013-07-24 (水) 17:30:56
  • 分析する前に各変数の基礎統計量(平均値とか標準偏差とか,最大・最小値とか)をみるなど,データを確認しましょう。
    件のデータの2,3,4,28列の標準偏差が0です。それぞれの列で,全部同じ値(64187)を取るからです。その列を除けば答は得られます。
    自分で解決することもできたはず。やり方は,20列で問題ないのなら,いきなり5倍にするのではなく30列,40列と増やして行き,エラーが起こったら1列ずつ減らしてゆく。そうすれば,ある列が含まれるとエラーになることがわかる。そうすれば,その列がどのようになっているか確認すれば「なんかおかしいな?」と気づくはず。プログラムじゃないけど,それも(データの)デバッグ。 -- 河童の屁は,河童にあらず,屁である。? 2013-07-24 (水) 17:44:40
  • ありがとうございました。なるほどです。そのアプローチは思いつきませんでした。危うくまた違う方向に行くところでした。MacにRをインストールして、やってみようと数10分前は考えておりました。 -- さぼりん? 2013-07-24 (水) 18:03:26
  • R自体の質問ではなく、恐縮です。標準偏差が0だと答えが得られないのは何故なのでしょうか。今、PLSの原理を追いかけて原因を探っているのですが、理解できず悩んでいます。アドバイスだけでもいただけますとありがたいです。 -- さぼりん? 2013-08-20 (火) 21:05:50
  • > 標準偏差が0だと答えが得られないのは何故
    標準偏差が0ということはどういうことか分かりますか?その変数は,全てのケースで同じ値を取る(つまり,分散が0で,その平方根の標準偏差も0)ということです。数学的には,そのような標準偏差や分散が分母に来るような演算では(たとえば相関係数を求めるときなど) 0 による割り算が生じ,計算結果は NA になるでしょう。たとえば,相関係数行列の一部がNA だと,その固有値固有ベクトルを求めようとしても,当然エラーになりますね。
    実際的な観点からは,全部が同じ値を取る変数なんて何の情報も持たないのだから(入学試験である教科の得点がみんな80点なら,その教科は受験生のふるいわけには何の役にも立たないということ),そんな変数含めて分析しようとすること自体が間違い。 -- 河童の屁は,河童にあらず,屁である。? 2013-08-20 (火) 23:07:47

neuralパッケージのインストール方法を教えてください

tetsuro? (2013-07-20 (土) 20:43:08)

こんにちは。
windows7 64bit で R 2.15.1 を使っています。
豊田氏のデータマイニング入門を読んでいるのですが、neuralパッケージがインストールできず困っています・・・。
install.packages(neural)としてもパッケージがありません。
この方の記事に書かれている通りに、下記リンク先からneural_1.4.2.zipをダウンロードしたところ、下記のようなメッセージがでました。
参照記事:
http://d.hatena.ne.jp/astrobot/20110628/1309278036
リンク先:
http://cran.ms.unimelb.edu.au/bin/windows/contrib/2.6/

エラーメッセージ:
 utils:::menuInstallLocal()
 パッケージ ‘neural’ は無事に展開され、MD5 サムもチェックされました 
> library(neural)
エラー:  パッケージ '‘neural’' は R 2.10.0 以前に造らました。再インストールして下さい 

下記Q&Aの内容も参照したのですが、エラーメッセージが出てしまいました。
参照Q&A:
neuralパッケージのインストールについて
hiro? (2010-06-24 (木) 02:54:33)
http://cran.stat.nus.edu.sg/src/contrib/Archive/neural/にライブラリがありました。ここにアクセスし、neural_1.4.tar.gzをDL&解凍し、出てきたneuron/Rディレクトリをinstall.packages("出てきたRディレクトリ")で読み込んでやれば、インストール出来ました。お騒がせしてすみませんでした。 -- hiro? 2010-06-24 (木) 03:14:01

エラーメッセージ:
> install.packages("C:/Users/(ユーザー名)/Documents/R/win-library/
     2.15/neural/R")
パッケージを ‘C:/Users/(ユーザー名)/Documents/R/win-library/2.15’
 中にインストールします 
 (‘lib’ が指定されていないので) 
警告メッセージ: 
package ‘C:/Users/(ユーザー名)/Documents/R/win-library/2.15/neural/R’
is not available (for R version 2.15.1) 

どなたかご教示いただけないでしょうか・・・。
よろしくお願いします。

  • どこから説明をすれば良いの変わらないけど、packageのインストール方法には(1)コンパイル済みのバイナリ(2)ソースからコンパイルの2通りがあり、windowsの場合は基本的に前者です。ですが、古いRでコンパイルされたバイナリしか存在しないなどの理由で、後者の方法でインストールする必要がある場合があります。今回はこのケースでしょう。従って、あなたがすべきことは(Windowsマシンが手元になくて確認できていませんが、おそらく)、Windowsに開発環境を入れてinstall.packages()にtype="source"オプションをつけることです。そうすると、Rはcranからそのpackageのソースをダウンロードして(ただし、cranからneuralが削除されていれば別途入手する必要がある)、そのpackageをコンパイル・インストールをしてくれます。開発環境のインストールはRtoolsを参照して下さい。 -- 2013-07-20 (土) 22:28:15
  • コメントありがとうございます!Rtoolsをインストールし、neuralのパッケージはCRANからは削除されているようなのでneural_1.4.2.1.tar.gzをダウンロードしました。install.packages(C:\Users\ユーザー名\Desktop\neural_1.4.2.1.tar.gz,repos = NULL, type="source") と打ってみたところ、エラー: 予想外の 入力 です in "install.packages(C:\" となってしまいました・・・。 -- tetsuro? 2013-07-21 (日) 13:08:20
  • Rでは文字列に引用符をつけないとRオブジェクト名だと解釈されます。引用符をつけましょう。また、パスの区切りは「/」か「\\」というお約束ではありませんでしたか。Rの入門書を参照して下さい。 -- 2013-07-21 (日) 13:31:04
  • ありがとうございます!2.15.1では無事インストールできました!(R3.0ではなぜかできませんでしたが。。。) -- tetsuro? 2013-07-21 (日) 14:53:29
  • おめでとうございます。インストールできて良かったですね。R3.0にインストールできなかったのが、最新バージョンのCRANリポジトリからneuralが削除されている理由です。開発チームから新しいRに対応するようにpackageのメンテナに連絡があるのですが、メンテナがそれに対応できないとそのpackageは現行のリポジトリから削除されます。 -- 2013-07-21 (日) 16:46:23

ls() を for で囲むと機能しなくなる

かい? (2013-07-10 (水) 13:31:52)

全ての変数の値を一括表示しようとして

for (n1 in 1:length(ls())) {
	eval(parse(text = paste(ls()[n1],sep="")))
}

をRで実行したのですが、何も表示されませんでした。試しに、簡略化した

for (n1 in 1:10) {
	ls()
}

を実行しても何も表示されませんでした。その場合でも ls() を単独で実行すると正常に変数の名前の一覧が表示されます。ls() を for で囲んでも機能するようにするためには、どうすれば良いでしょうか。
よろしくお願い致します。

  • 頻出ですね(6個下の「for の使い方」も同じです)。for ループの中では print 関数を明示的に使用しないと結果を書き出すことはできません。for について解説されている場合には,必ず言及されていると思うんですけどね? -- 河童の屁は,河童にあらず,屁である。? 2013-07-10 (水) 14:22:43
    > for (n1 in 1:length(ls())) {
    + 	print(eval(parse(text = paste(ls()[n1],sep=""))))
    + }
    [1] 1
    [1] 4
  • 早速ご回答いただき、ありがとうございました。てっきり ls() の問題かと思っていましたが、for が原因だったのですね。for 以外に、while にも同じ問題があるので

添付ファイル: fileellipse.png 353件 [詳細] fileboxplot20140217.png 283件 [詳細] filegapstat.png 664件 [詳細] filebarplot.png 454件 [詳細] filea.LZH 221件 [詳細] filesoukyokusen.png 341件 [詳細] fileNAO sunspots.pdf 171件 [詳細] file130724_test24_NG.csv 162件 [詳細] file2rlogo.jpg 687件 [詳細] filesample.png 633件 [詳細] fileno-gap.png 375件 [詳細] file3_test_vector.r 130件 [詳細] filesample.PNG 270件 [詳細] filebarplot-ubuntu.png 602件 [詳細] file20140327a.png 617件 [詳細] filetest.jpg 655件 [詳細] filelang.png 667件 [詳細] file140103nao54sunspots54.R 104件 [詳細] filesunspots54.csv 113件 [詳細] filecorr.png 706件 [詳細] filewavelet.png 848件 [詳細] filesample2.PNG 592件 [詳細] fileR2.png 691件 [詳細] file20130702.png 364件 [詳細] file20140327.png 642件 [詳細] filepie-labels01.png 774件 [詳細] filenao54.csv 156件 [詳細] filepie.png 746件 [詳細] filex2_1101b8a4.jpg 405件 [詳細] file20140103a.png 653件 [詳細] filetwo-axis-plot.png 559件 [詳細] fileR2-2.png 706件 [詳細] fileAO1900.csv 112件 [詳細] file20140408.png 650件 [詳細] filetest_12.jpg 457件 [詳細] filecorr2.png 729件 [詳細] filetest_12_2.jpg 417件 [詳細] file198311-200206.csv 143件 [詳細] filesample-pdf.png 668件 [詳細] filermoeJ2.png 383件 [詳細] filerainbow.png 676件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Google
WWW を検索 OKADAJP.ORG を検索
Last-modified: 2016-10-03 (月) 18:36:25 (263d)