読者です 読者をやめる 読者になる 読者になる

にしもと.blog

色々してます。

Railsで"wrong argument type symbol(expected Module)"

DBの先読みで 

@comments = @micropost.comments.include(:user)

をしたらハマった。

 

Moduleが来るはずのところにSymbolが来てるよ、というエラー。

includeはモジュールを読み込むとに使うやつで、DBの先読み時に使うのはincludesでした。

 

ということで

@comments = @micropost.comments.includes(:user)

としたら解決

Rails tutorialで「DEPRECATION WARNING: Sprockets method `register_engine` is deprecated.」

Waningの続きを見るとsprocketsが悪いと書いてあるが、Gemfileにはsprocketsないやん!! と思った。

 

Gemfile.lockにてsprocketsを調べると、sass-railsの中で使われているようだ。

↓ 

f:id:no-ku-ma:20160924152026p:plain

 

sass-railsのバージョン指定をなくして bundle installのあとbundle updateをしたら治った。

 

 

AtomのPlatformIO IDE Terminalでエディタにターミナル機能を付加する

Rstudioのbash版が欲しいと思っていたらAtomにあった。

atom.io

 

なにこれめっちゃ便利

Googleスプレッドシートからjsonを取り出してcsvにconvertする

意外と落とし穴があるのでメモ

1. スプレッドシートを公開する

ハマったポイント^^;

f:id:no-ku-ma:20160811155153p:plain

 

2. URLの調査

https://spreadsheets.google.com/feeds/cells/#{spread_sheet_id}/od6/public/values?alt=json

ただし、od6の部分は複数シートある場合はちょっと違う。

spread_sheet_idはスプレッドシートのURL見れば長い文字列があるからわかると思う

 

3. jsonからcsvにコンバートする

個人的にはtsvの方が好きなのでtsvにコンバートするRubyのプログラムをちゃちゃっと書いた

 

終わり

Rubyでtsvファイルをhashに収める

最初はこれだった

def file_to_hash(file_name=ARGV[0])
    file = File.open(file_name,"r")
    hash = Hash.new()
    file.each do |line|
        line.chomp!
        hash[line.split("\t")[0]] = line.split("\t")[1]
    end
    file.close
    return hash
end

start_time = Time.now
hash = file_to_hash(ARGV[0])
p "take time is  #{Time.now - start_time}s"

ただ最近ひらめいて

def file_to_hash(filename)
    file = File.open(filename,"r")
    arr1 = file.read.split(/\n|\t/)
    file.close
    return Hash[*arr1]
end
start_time = Time.now
h = file_to_hash(ARGV[0])
p "処理概要 #{Time.now - start_time}s"

に変えた

結果として100万行処理するのに15秒かかる処理が2秒で終わった。はやっ。

Rですべての行に関してapply関数を用いてt検定

↓のコードをコピペで1行ずつ動かせば理解できる。

gistebe7cd16dbeed0453106

apply関数は

apply(<使いたいデータ>、 <1なら行について 2なら列について>、 <やりたいこと>)

という感じで使えるのは知っていたが、具体的なやり方がわからなかった。

ただ今回ので function(x) がrubyとかpythonでの↓と同じなんですね!! というのがわかった。今さら過ぎる。。。

x = file.gets.to_vec

(.to_vecはそんなのないけど、行をベクトルに変換するメソッドだと思ってもらえれば)

RでAnosimをやる方法(具体例とともに)

自分のラボのWikiはそろそろなくなる、とのことなのでこっちに移設。

まずコードから

# dataの準備
data <- cbind(c(1,2,3),c(4,5,6),c(7,8,9),c(10,11,12),c(8,5,7))
rownames(data) <- c("A","B","C")
colnames(data) <- c("Sample1","Sample2","Sample3","Sample4","Sample5")

# groupingの準備 Sample1,2で1グループ, Sample3,4,5で1グループだとしよう
grp <- as.factor(c(1,1,2,2,2))

# パッケージインストール
install.packages("vegan")
library("vegan")

# Test
anosim(data,grouping=grp)

anosimって何やっているの

伝え聞いた話です。論文等は読んでいません。↓が参考になるでしょう。
vegan研究(2)ANOSIM実践編: 足軽日記

上の例を使って説明するとする。
Sample1と2、 Sample3と4と5 が違うグループなのか(同じ母集団からサンプリングされたものとみなせるか?)が見たいこと。
ここでは
・Sample1と2をグループ1
・Sample3と4と5をグループ2
としよう。

そこでラベルを適当にシャッフルする。
Sample3と4
Sample1と2と5

このときのカテゴリ内距離の和(のようなもの)を求める。
そうすると、きっと正規分布っぽいものができるはず。

それに対し、Sample1と2やSample3と4と5が同じ母集団からとられているならばカテゴリ内距離は近くなるはず。
よって正規分布から外れる。
こんな解釈。