Hatena::ブログ(Diary)

My Life as a Mock Quant このページをアンテナに追加 RSSフィード Twitter

2016-11-27

use_testthat()でテスト用のディレクトリ・ファイルを一発で作る

| 14:03 | use_testthat()でテスト用のディレクトリ・ファイルを一発で作るを含むブックマーク

devoolsにあったと思った関数が、いつの間にかusethisという新しいパッケージに移っていたので、そのメモ。

こいつに入っている use_testthat()を用いると、Rのパッケージを作る際のテストディレクトリ・ファイルを一発で作ってくれる。

> devtools::install_github("hadley/usethis")
> library("usethis")
> use_testthat()
* Adding testthat to Suggests.
* Creating 'tests/testthat'.
* Generating template 'testthat.R'.
* Writing './tests/testthat.R'
Warning messages:
1: In readLines(file) : incomplete final line found on './DESCRIPTION'
2: In readLines(file) : incomplete final line found on './DESCRIPTION'

これでパッケージ開発時のテストファイル作衛の手間から解放される。

ここの.Rファイルに対するテストファイルを作りたい場合はuse_test()関数を用いればOK。

2016-10-23

値を動的に生成して、動的に取得する

| 22:12 | 値を動的に生成して、動的に取得するを含むブックマーク

assignで動的に値を生成して、getをうまく活用すれば取れる、が、あまりきれいではない。

> f <- function(){
+   for(i in 1:10){
+     assign(paste0("variable_", i), i)
+   }
+   variable_names <- ls(pattern="^variable_.*")
+   sapply(variable_names, function(variable_name){get(variable_name, envir=sys.frame(1))})
+ }
> f()
 variable_1 variable_10  variable_2  variable_3  variable_4  variable_5  variable_6  variable_7  variable_8  variable_9 
          1          10           2           3           4           5           6           7           8           9 

2016-10-09

ABテストに関する某氏の助言

17:13 | ABテストに関する某氏の助言を含むブックマーク

分野違いすぎてよくわからんが、言っていることは正しい(はず)

[6:54 PM]

A/B テストをやっているのですが、A/A も同時にやっていて、A1/A2/B の3つのグループのデータがあります。

サンプルサイズはアホなほどあり、A/A でもすべてのデータを使うと有意差が出ます。

このとき、3グループから同じだけサンプルサイズをとってきて、A/A では有意差なし、A/B では有意差ありみたいにしたいのですが、どういう方法があるのでしょうか?p-hackingになるのでやらないほうがいいのでしょうか?

[9:32 PM]

まず検定は有意差なしを示すものではないので(有意差なしなら何も言えない)、「A/Aでは有意差なしを示したい」というのがすでに検定のフレームワークではないですね。

仮にA/AもしくはA/Bの両方を考慮して有意差を示したいとかならば、closed procedure(閉手順)などでα漏れないで(p-hackingにならないで)検定することができます。多重検定とかと似た感じ。

あと検定の枠組みならば、あらかじめ使用するサンプルサイズは決めておかないといけない。全データや一部をあとから選ぶ時点で検定ではないので、やめた方がよさそうです。特にあるデータをすべて使わずに一部だけ使うのは×。

2016-09-23

captionerパッケージで図・表に対する参照(レファレンス)を取得する

| 09:42 | captionerパッケージで図・表に対する参照(レファレンス)を取得するを含むブックマーク

http://datascienceplus.com/r-markdown-how-to-number-and-reference-tables/にあった話。

captionerパッケージを用いると、R Markdownの中での図表の参照を簡単に書くことができるというお話。

以下、簡単な例だが、こんな様に書けば図表に対する参照もできますよと。


---
title: ""
output: html_document
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
```

## Example of caption
Define caption.
```{r}
table_nums <- captioner::captioner(prefix = "Tab.")
tab.1_cap <- table_nums(name = "tab_1", caption = "German Bundesliga: Final Table 2015/16, Position 7-12")
```

Use it.

`r table_nums('tab_1')`
```{r fig.cap = tab.1_cap}
knitr::kable(mtcars[1:10, c(1,2,7,9)], align = c('c', 'l', 'c', 'c'), row.names = TRUE)
```

Define customized reference function.
```{r}
f.ref <- function(x) {
  stringr::str_extract(table_nums(x), "[^:]*")
}
```

Original version.
`r table_nums('tab_1')` says that ....

Customized one.
`r f.ref('tab_1')` says that ....

2016-08-28

リストに名前を付けるのは最後にした方がいいっぽい(へんなのR)

| 13:14 | リストに名前を付けるのは最後にした方がいいっぽい(へんなのR)を含むブックマーク

へんなのRというハッシュタグがある。

そこに投げつけるための話。

適当な関数の用意

3の時だけNULLであとはirisデータの頭を返す関数を用意する。

これはNULLを返す場合があるってのが本質で、あとは適当でよい。

#3の時だけNULLほかは適当
f <- function(i){
  if(i==3){
    NULL
  } else{
    head(iris,i)
  }
}

以下、この関数を適当にループさせ、その結果をリストに格納する形で使ってみる。

うまくいくケース

まずは何も考えずに使ってみたケース。

想像どおりの動き方&結果だ。

> x <- vector("list", 4)
> for(i in 1:4){
+   x[[i]] <- f(i)
+ }
> x
[[1]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa

[[2]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

[[3]]
NULL

[[4]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa

うまくいかないケース

気を良くして、上のコードに一行、names(x)という処理を追加すると・・・名前がずれる。

> x <- vector("list", 4)
> names(x) <- paste0("name", 1:4)
> for(i in 1:4){
+   x[[i]] <- f(i)
+ }
> x
$name1
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa

$name2
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa

$name4
NULL

[[4]]
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa

原因と対策

にも書いてあるように、NULLを代入することは要素の削除と同義になっちゃうんでNGという話。

回避するには、この例だと最後に名前を割り当てるようにするか、あるいは汎用的な解決法としてはlapply使えと。

変なのー。