Hatena::ブログ(Diary)

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

2016-07-21

各グループごとにXXX(標準化など)したデータを作成する

| 18:17 | 各グループごとにXXX(標準化など)したデータを作成するを含むブックマーク

今までは、例えば、下記のようなあるデータフレームのデータを、日付ごとにスケーリング(scale())し、その結果をデータフレームとして返すような処理として、以下のように書いていた。

これは「各日付ごとに全IDのデータ(r)列が存在し、それを日付ごとにスケーリングしたい!」という処理である。

(これはsummarizeだとうまくいかないので四苦八苦したあげく、以下のように書いていた)

> library("dplyr")
> library("tidyr")
> df <- data.frame(date=rep(Sys.Date() + 1:3, each=3), id=rep(1:3, 3), r=rpois(9, 2))
> df
        date id r
1 2016-07-22  1 1
2 2016-07-22  2 2
3 2016-07-22  3 1
4 2016-07-23  1 2
5 2016-07-23  2 0
6 2016-07-23  3 5
7 2016-07-24  1 4
8 2016-07-24  2 2
9 2016-07-24  3 0
> df %>%
+   group_by(date) %>%
+   do(tmp=data.frame(id=.$id, r=as.numeric(scale(.$r)))) %>%
+   unnest
Source: local data frame [9 x 3]

        date    id          r
      <date> <int>      <dbl>
1 2016-07-22     1 -0.5773503
2 2016-07-22     2  1.1547005
3 2016-07-22     3 -0.5773503
4 2016-07-23     1 -0.1324532
5 2016-07-23     2 -0.9271726
6 2016-07-23     3  1.0596259
7 2016-07-24     1  1.0000000
8 2016-07-24     2  0.0000000
9 2016-07-24     3 -1.0000000

で、

にて教えてもらったんだが、こんな面倒な書き方しなくても

> df %>% group_by(date) %>% mutate(r_scaled=scale(r))
Source: local data frame [9 x 4]
Groups: date [3]

        date    id     r   r_scaled
      (date) (int) (int)      (dbl)
1 2016-07-22     1     1 -0.5773503
2 2016-07-22     2     2  1.1547005
3 2016-07-22     3     1 -0.5773503
4 2016-07-23     1     2 -0.1324532
5 2016-07-23     2     0 -0.9271726
6 2016-07-23     3     5  1.0596259
7 2016-07-24     1     4  1.0000000
8 2016-07-24     2     2  0.0000000
9 2016-07-24     3     0 -1.0000000

でOKだった。

シンプレ&ビューティー。

0, 1でやっときゃFactor型と同じ結果になる

| 18:03 | 0, 1でやっときゃFactor型と同じ結果になるを含むブックマーク

回帰の時あえて変数をFactorにする必要あるのかな?ってのを確かめておいた。

Factorが0,1の場合だけだけど。

> set.seed(71)
> x <- 1:100
> z <- rep(0:1, 50)
> y <- 1.2*x + 2.3*z + 3.4 + rnorm(100)

これで普通に回帰すると

> glm(y ~ . , data=data.frame(x, y, z))

Call:  glm(formula = y ~ ., data = data.frame(x, y, z))

Coefficients:
(Intercept)            x            z  
      3.177        1.202        2.517  

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:	    120800 
Residual Deviance: 107.8 	AIC: 299.3

となる。

一方、無理やりFactor入れたデータフレーム(data.frame)にして同じ計算をしてみても・・・

> str(data.frame(x, y, as.factor(z)))
'data.frame':	100 obs. of  3 variables:
 $ x           : int  1 2 3 4 5 6 7 8 9 10 ...
 $ y           : num  4.17 7.65 6.52 10.92 8.98 ...
 $ as.factor.z.: Factor w/ 2 levels "0","1": 1 2 1 2 1 2 1 2 1 2 ...
> glm(y ~ . , data=data.frame(x, y, as.factor(z)))

Call:  glm(formula = y ~ ., data = data.frame(x, y, as.factor(z)))

Coefficients:
  (Intercept)              x  as.factor.z.1  
        3.177          1.202          2.517  

Degrees of Freedom: 99 Total (i.e. Null);  97 Residual
Null Deviance:	    120800 
Residual Deviance: 107.8 	AIC: 299.3

となりちゃんと一致する。まぁ、そりゃそうだよなという。

2016-07-09

MD5(Message Digest 5)のハッシュ値を計算したい時にはmd5ライブラリ

| 06:16 | MD5(Message Digest 5)のハッシュ値を計算したい時にはmd5ライブラリを含むブックマーク

と同じ話をPythonでやりたかった。

md5ライブラリを使えばよい&Rと答えを合わせるためには`serialize=FALSE`せんといかん点に注意。

seriarize引数説明

A logical variable indicating whether the object should be serialized using serialize (in ASCII form). Setting this to FALSE allows to compare the digest output of given character strings to known control output. It also allows the use of raw vectors such as the output of non-ASCII serialization.

とのことだが、俺にはちょっと何言ってるのかよくわからなかった。

> library("digest")
> digest("123", serialize=FALSE)
[1] "202cb962ac59075b964b07152d234b70"
>>> import md5
>>> md5.new("123").digest().encode('hex')
'202cb962ac59075b964b07152d234b70'

ちゃんとおなじになってる。

2016-06-16

data.frame, cbindは文字列(character)ではなく因子(Factor)がデフォルトだった・・・っけ?

| 18:58 | data.frame, cbindは文字列(character)ではなく因子(Factor)がデフォルトだった・・・っけ?を含むブックマーク

掲題の件、どうやらそうだったらしい。

なので、毎回stringsAsFactorsを設定すると(Hadleyverseはあえてつかわない)


お元気で。

> df <- data.frame(x=1:3, y=letters[1:3])
> str(df)
'data.frame':	3 obs. of  2 variables:
 $ x: int  1 2 3
 $ y: Factor w/ 3 levels "a","b","c": 1 2 3
> df <- data.frame(x=1:3, y=letters[1:3], stringsAsFactors = FALSE)
> str(df)
'data.frame':	3 obs. of  2 variables:
 $ x: int  1 2 3
 $ y: chr  "a" "b" "c"
> 
> str(cbind(df, LETTERS[1:3]))
'data.frame':	3 obs. of  3 variables:
 $ x           : int  1 2 3
 $ y           : chr  "a" "b" "c"
 $ LETTERS[1:3]: Factor w/ 3 levels "A","B","C": 1 2 3
> str(cbind(df, LETTERS[1:3]), stringsAsFactors = FALSE)
'data.frame':	3 obs. of  3 variables:
 $ x           : int  1 2 3
 $ y           : chr  "a" "b" "c"
 $ LETTERS[1:3]: Factor w/ 3 levels "A","B","C": 1 2 3

2016-06-07

dockerメモ

| 12:51 | dockerメモを含むブックマーク

私的メモ

VOLUMEコマンド後に当該ディレクトリに作成したファイルは作成されない

環境変数はコンテナ起動時にその時のユーザに割り当てられる(多分)

2016-06-04

ないパッケージはインストールして、残りは全部読み込む

| 15:39 | ないパッケージはインストールして、残りは全部読み込むを含むブックマーク

pacman使えよって話だが。

# ほしいパッケージ全部書いとく
packages <- c("ggmap", "dplyr", "tidyr", "data.table", "rgl", "stringr", "R.utils", "scales")
# ないやつはインストール
new_packages <- packages[!(packages %in% installed.packages()[,"Package"])]
if(length(new_packages)){install.packages(new_packages)}
# 全部読み込む
sapply(packages, require, character.only = TRUE)

参考