間違ったリポジトリにマージした

はじめに

油断して間違ったローカルリポジトリに対して最新のリモートをマージした

感想

git操作は自信をもって「こうだよな...?」というところまでできてない。毎度ググってる。

今回は誤ったローカルブランチを消して, リモートの正の状態のブランチと同期させた。消えて困るものがなかったので

おわりに

一生初心者

生乾きの知見

はじめに

最近、生乾きの対策をいろいろ見たので雑にまとめる

基本形

  • 粉ワイドハイター or オキシクリーン
    • 酸素系漂白剤が有効
    • お湯と併用するとさらに効果あり
    • 液体ワイドハイターでもよいみたい
  • 過炭酸ナトリウム
  • オスバン
    • 逆性石鹸(界面活性剤の効果を打ち消す機能)
    • 消毒薬らしく、生乾きのにおいの菌に効くらしい
    • 洗剤が服に残ってると機能しない、つまり洗濯機に洗剤と入れるのはダメ
  • アタック消臭ストロングジェル
    • 介護用品の洗濯に使われる

手持ち

今のところ液体ワイドハイターをシューズ洗濯用に買っているので、漂白剤はいらない。

オスバンも洗濯と分けてつけ置きの必要があるので、ちょっとめんどくさい。

アタック消臭ストロングジェルを買うのが今の手持ちを考えると最適っぽい

おわりに

化学は苦手でした...

主成分分析の解き方のバリエーションで迷うところがあったのでメモ

はじめに

主成分分析は導出や解釈がいくつかあり、調べていると混乱することが多い。

特に導出についてどうなんだっけ...となった部分を整理する

導出って何があったっけ

分散が最大となる係数をラグランジュの未定乗数法にて解く

ベーシックな解法。ストーリー的にも

  1. 各特長量を重みづけした際の分散を最大化する
  2. 重みベクトルは傾きだけわかればいいので、重みベクトルのノルム=1の制約がかけられる
  3. 制約があるうえでの最大値の問題はラグランジュの未定乗数法が使える
  4. ラグランジュの未定乗数法に従って、各変数を偏微分した式同士を解く際に固有値の計算の形式がそのまま使える
  5. 固有値が大きいものから代入して第一, 第二主成分を得られる

という流れ。

分散共分散行列の固有値から主成分を求める

特徴量の分散共分散行列の固有値を求めることで、前節の1~4をスキップできる計算方法。そうなりそうとは思っていたけど100%理解していなかったケース。式を追いながら確認する

主成分1はz = a_1x_1 + a_2x_2、めんどくさいのでzの下付きは省略しています。バー付きは平均。

主成分の分散をV_zと置くと、主成分の分散はこう書けそう


V_z = \cfrac{i=1}{n}\Sigma_1^n(z_i-\bar{z})^2

z = a_1x_1 + a_2x_2なので展開して整理する


V_z = \cfrac{i=1}{n}\Sigma_{i=1}^n(a_1x_1+a_2x_2 - a_1\bar{x_1}-a_2\bar{x_2})^2 \\
= \cfrac{1}{n}\Sigma_{i=1}^n\{a_1(x_1-\bar{x_1})  + a_2(x_2-\bar{x_2})\}^2 \\
= \cfrac{1}{n}\Sigma_{i=1}^n\{a_1^2(x_1-\bar{x_1})^2 +2a_1a_2(x_1-\bar{x_1}(x_2-\bar{x_2})) +a_2^2(x_2-\bar{x_2})^2 \} \\
= a_1^2\cfrac{1}{n}\Sigma(x_1-\bar{x_1})^2 + 2a_1a_2\cfrac{1}{n}\Sigma(x_1-\bar{x_1})(x_2-\bar{x_2}) + a_2^2\cfrac{1}{n}\Sigma(x_2-\bar{x_2})^2

分散の式が出現しているのでs_{ij}^2で置き換える


V_z = a_1^2s_{11}^2 + 2a_1a_2s_{12}^2 + a_2^2s_{22}^2

でこれを最大化するには、[tex:a_12 + a_22=1](aのそれぞれの比率が分かればいいので=1の制約でよい)

このような制約がある状態の関数の最大値はラグランジュの未定乗数法を用いる。式はこう


L(a_1, a_2, \lambda) =  (a_1^2s_{11}^2 + 2a_1a_2s_{12}^2 + a_2^2s_{22}^2) - (a_1^2+a_2^2 -1)

で各変数で偏微分するとこう


\cfrac{\partial L}{\partial a_1} = 2s_{11}^2a_1 + 2s_{12}^2a_2-2\lambda a_1 \\
\cfrac{\partial L}{\partial a_2} = 2s_{12}^2a_1 + 2s_{22}^2a_2 -2\lambda a_2 \\
\cfrac{\partial L}{\partial \lambda}= -a_1^2-a_2^2-1

第一式と第二式を=0として連立方程式を解くことを考えて行列表記にする。


\begin{bmatrix}
   s_{11}^2 & s_{12}^2 \\
   s_{12}^2 & s_{22}^2
\end{bmatrix}
\begin{bmatrix}
   a_1 \\
   a_2
\end{bmatrix}
= \lambda \begin{bmatrix}
   a_1 \\
   a_2
\end{bmatrix}

ここで左辺に着目すると、分散共分散行列に対する固有値を求める問題になる。つまり、実用上は元データxの共分散分散行列を何かしらで計算して、さらに何かしらで固有値を求めればいいことになる。

おわりに

おそらく、表記も考えかたも結構ミスがあるんだろうけど思い出す手がかりを作っているだけなんだという強い気持ちで書いた。あまり参考にしないでください。

いろんな本の主成分分析を読んでいた

はじめに

主成分分析についてちゃんとやらんとなと思い立ったので、手元にある本の主成分分析に関わる記述について読んでいた。

文意を正確に解釈できる頭はないので、変換がかかっているとは思うがせっかくなのでメモする

データ分析に必須の知識・考え方 統計学入門

  • 主成分分析は相関している変数同士をまとめる処理
  • 変数間の相関が高い場合は、寄与率(各主成分における分散の割合)が高い軸が生成される
    • この場合、より相関が高い変数が多いほどよく次元圧縮できる

なるほど感。相関(線形の関係性)が強いものだけをまとめているという表現が分かりやすい

データサイエンス体系 データサイエンス入門

滋賀大学のDS学部のやつ

主成分分析については本当に概念だけで、似ているものをまとめる軸を作成する という感じの表現

入門統計学(栗原伸一)

これは普通に教科書なので導出(スカラーで展開できるものはしてあってウっとならない)もあってよい

流れ的には * 主成分は各特長量に重みづけして足したものです * 主成分分析とは、主成分に畳み込む前の元の観測変数をデータのばらつく方向に軸を回転させること * 分散が大きい = 情報を損なわない

というスタートから、

  • 主成分の分散はこう書ける
  • 主成分分析の前処理として観測変数が標準化してあるなら、分散はこう書ける
    • この標準化の前提でだいぶ楽になる
    • 実際の解析でもStandardScalerなりで標準化することが多いと思うので良い実態にも合う
  • 主成分の重みづけにおいて大切なのは大きさではなく比率、なので制約条件を付けます
  • 制約条件下の最大化ならラグランジュの未定乗数法
  • そのまま解いてもいいが、固有値問題として解いた方が拡張できてよい
  • 固有値と分散の関係、制約条件を考えると分散=固有値となる
  • 固有値問題を解く、固有値計算→固有ベクトル計算
  • 固有値の大きいものから第一主成分、その時の固有ベクトルの各成分が観測変数に対する重みになる

数学クソ雑魚なので成分表記助かるな...。最後まで意味を追いながら読めたので良かった。

分析者のためのデータ解釈学入門

こちらはカバー範囲が広いのでPCAについての説明はちょろっとという感じ。今回気になっていたことを調べるには用途が違う

データ分析のための数理モデル入門

これもPCAそのものの情報は触れる程度、ただし、独立成分分析やその他の手法が紹介されていたのでその点は良かった

例題でよくわかる はじめての多変量解析

これも教科書なので詳しく書いてある。こちらは3変数での導出なので入門統計学を読んでから読むとよさそう

流れは基本的に変わらないが、例題があるのが良い。また第二主成分については第一主成分との相関が0であることより導出してあり、気になるところをやっている感じがする。

ただし、3変数なので導出がちょっと大変

ビッグデータ統計解析入門

表記が難しい...ほかの教科書を読んでいれば変数の対応はわかるけど、いきなりこれ読むと結構厳しい感じがする。

多変量解析入門1(河口至商)

結構古めの文献で、印刷が明らかに古いのもありビビってたけどわかりやすかった。

もちろんそれまで読んだ本のおかげで理解できた点もあるが、ベクトルを使いつつ、簡単な例から始まったので良かった。

おわりに

なんとなくわかった

habit系のiphoneアプリで自分に合うものを調べていた

はじめに

禁欲したいのでいろいろ習慣化のアプリを探してた。

選ばれたのは

  • habitica
    • Web版あり、ウィジェットあり、APIありで基本はこれを使ってる
    • マイナスはしいて言うなら各エントリーごとの継続を可視化できない点だけ
      • APIがあるので自分でやれと言われたらそれはそう
  • Habit Tracker (Davetech Co.)
    • habiticaにない継続の可視化を担っている
    • 加えてデザインがいい、詳細な分析レポートを求めていないので無課金でも十分
    • (フリープランだと制限がかかっているって機能、使えるのはなんでなんだ...。サブスクリプションにも入っていないのに)
  • TickTick
    • 多機能なやつ
    • habit trackerのプレミアムでしか使えない機能がなぜか使える問題で、一応課金機能を使わないようにしたらいくつかタスクが漏れたのでこっちで管理してみた
    • きっかけはネガティブな理由だけど、ウィジェット上で達成した項目を確認できるのはいい

その他禁欲系のアプリ

  • Quitzilla

    • 継続したい目標期日が設定できたり、デザインもよい
    • ウィジェットがあればこれ一択だった。ないので結局使わなかった
  • 禁欲タイマー

    • これはquitzillaのウィジェット部分を補完するために使った
    • 結局二重管理はだるいので、Habit Trackerにまとめてこれも使わなくなった

おわりに

こういうツールを探している時間を減らすのが一番いいのかもしれん

Rのdata.frameの行名はユニーク

はじめに

Rのデータフレームを触っている

気づき

  • 行(おそらく列も)ユニークじゃないといけないらしい

おわりに

Pandasに比べていい意味で制限がある。ただPandasと行ったり来たりする+メインはPythonなのでいい感じにしないといけない

SeuratでDEG解析する

はじめに

DEGの解析をすることになった。 RだとDESeq2, edgeRあたり、PythonだとScanpyがマジョリティーっぽい。

で、ツール選定ではなるべくPythonに寄せたかったのでScanpyを使おうとしたのだが、2群間のDEG解析の手法がどうもわからず(群を示すパラメーターを受ける引数がなかった)。

そこで、なるべくPythonに巻き取りやすいようツールを探すとSeuratがよさそうだった。以下、理由

  • Scanpyで扱うAnnDataと相互にやり取りできるらしい
  • 比較的新しめのツールだが、作りっぱなしではなく開発が活発
  • コミュニティも活発な印象

ただいくつかハマったので注意点をメモする

使ってみた

Pandasのデータフレームと流儀が違う部分

  • 列名(多分行名も)はユニークなリスト、重複はダメ
  • 列名、行名へのアクセスはメンバ変数やgetメソッドではなく、列名を取り出す関数にRのseuratオブジェクトを渡す

ハマったところ

  • 同じ群に含まれる細胞ということを示す重複を許すラベルの付け方

    • Idents(seurat) <- identified_col この部分
    • ChatGPTやドキュメントにも記載が見当たらなかったのでだいぶ時間を溶かした
    • https://qiita.com/amufaamo/items/01ee43e1d959caab479f これにIdentって記載があってやってみたらできた
  • どっちが実験群?

    • markers <- FindMarkers(seurat, ident.1 = "treatment", ident.2 = "control")
    • log2FCの説明を見るところident1が実験群
    • ident1, ident2って変数名の説明もよくわからんので時間が溶けた

解析コード

install.packages('Seurat')
library(Seurat)

# csvのデータを読み込む
filename <- "hogehoge.tsv"
output <- "deg_list"

data <- read.table(filename, header=TRUE, row.names = 1)

# データの列名の整形
colnames(data) <- gsub("_", "-", colnames(data))  # アンダースコアをハイフンに書き換える
identified_col <- sub("\\..*", "", colnames(data))  # 列名に含まれるピリオド以下を削除する

# seuratオブジェクト生成
seurat <- CreateSeuratObject(data, project = "hogehoge")
Idents(seurat) <- identified_col  # 細胞にdayごとのラベルをつける
print(Idents(seurat))  # FindMarkersに指定できるidentとして何が使えるかを確認

# 2群間でDEGを取る
markers <- FindMarkers(seurat, ident.1 = "treatment", ident.2 = "control")
print(markers)
write.csv(markers, file = output)

おわりに

write.csvで無理やりファイル出力できることを後で知ったのでもっと資料があるDESeq2とかにした方がさっさと解決できたかもしれん。