niszetの日記

10年目エンジニアが最近勉強したことを忘れないようにメモをする

(雑記) 特に書くことがない続き。

つづき

Analysis and Design of Analog Integrated Circuits

続き。Grayの新しい版が12/Eに出るみたいですね。

https://www.amazon.co.jp/dp/1118078896/

4版が和訳されていますが、5版はされていないはず。両方持っていますが、和訳4版の下巻に安定性解析に関しての記述があるということで購入した記憶があります。
ただ、実際にはあまり使わなかったんですよね…。
バイポーラ、CMOSともに記述があり良い感じではあるのですが、どちらかしか使わない場合、情報としてあまり必要ではないものが載っていることはプラスにはならないのですよね…。難しいですね。

とはいえ、このご時世で新しい版が出るというのは良いニュースなので、内容を確認して必要そうなら購入かなぁ。

CMOS: Circuit Design, Layout, and Simulation

  1. Jacob Bakerのこの本は結構広範囲にわたって回路が書かれていて、コンパレータなどの回路の設計をどうすればよいのか?などのときにお世話なりました。
    これも割と初期に読んだ本のうちの1つで、比較的諸学者向きかなーとは思います。 こちらは和訳されてないはずなので原著を読むしかないです。2版は持っていますが、3版は持っていませんね。

思い返せば、かなり初期、2年目までにラザビを読了、その後も積み増ししていましたが、そのころは全然アナログ回路の設計はしておらずでした。 3年目にコンパレータを(といっても比較のみの簡単なもの)をやりましたが、実設計は実は4年目がほとんど初めての状態でしたな…。

運が悪い中では良かったのか、回路設計をする機会を得て、そこで結果を残したことで今も回路設計やれています。
チャンスが来た時に対応できるように準備をしておかなくては。そのためには普段からの勉強が必要、という認識です。

実際、力をつけるにはアウトプットがないと(業務レベルでの実践がないと)実感としてあまり能力向上しないとは思うのですが、それでもやらないよりはやった方が良い。はず、です。

今はそれがRであったりするのですが、本業の方が力を試されているフェーズなので、ちょっとRの方への力の振り方を抑えていく予定・・・

バランスよくやっていかねばですね。

(雑記) 特に書くことがないので…

たまには半導体のことも思い出してあげてください。

最近はちょっとしたことなら検索したら出てくる、良い時代ですね(嘘情報があったり、深い話はなかったり色々あるけれども)

最近全然更新してなかったのでアナログCMOS関係の話題をちょっとずつ書いていこうかなと思いました。といっても、基本はネットで調べることのまとめですけど。

自分が若かったころを振り返ってみることで、今後に活かす・・・当てがあるのか不明ですが、まぁとりあえず。

Design of Analog CMOS Integrated Circuits, Behzad Razavi

定番of定番。最近、新しい版が出ましたが、そのソフトカバー版もあるように見えます。旧版持っているのであまり必要ないのですが、財布に余裕があったら買うかも。
この本、行間が多い点と、分かった気にさせるが実際にやろうとすると壁にぶつかることが多いですが、自分が経験を積んでわかってくると「あぁ、これはそういうことだったのね」と思う日がきます。その日が来るまで繰り返しやると良いのではと思います。
実際、この本の行間を全部自分で埋めるという経験がかなり後後まで役に立ったので。 とにかく最初は1冊を仕上げることが大事だったなぁという記憶があります。PLLはいまだに良く分からない。

最初から洋書だときっついので、素直に和訳されたものを読むほうが個人的にはお勧めです。

CMOS Analog Circuit Design. Phillip E. Allen, Douglas R. Holberg

この本も名著。3版?まで出て、そちらも買いました。
フォールデッドカスコードの解析、PSRRの数式が載っている等々、かなりお世話になったのですが、こちらは数式が多め。数式を追うことが必ずしもアナログ回路設計においては重要ではない(感覚を養うという意味で。数式が解けないとそれはそれで困るので、ちゃんと解ける前提)ので、この本は個々の問題に当たった時に効果が大きかったかな、と。
ペーパーバッグで出ているので、結構安くなった(ハードカバーで買っちゃった)

その他

早くも飽きてきた、、、というより、沢山読み過ぎて書ききれないので適当にいずれ書く。Razaviを復習して書いていくのもあり(ない)ですね。

他にも、 * edaboard * designer’s guide * 国内の大学講義の資料などを探す * 国外の資料を探す(英語)

などなど、情報源はネットにも色々とありました。 最新の情報は論文や発表にあるので、それらを追うのも大事ですね。

そろそろ初心に返って勉強しなおそう…

第64回 TokyoRに参加してLT発表してきました (発表資料等リンク集)

もはや恒例の、資料まとめです。

togetterをkashitanさんがまとめてくださいました。 togetter.com

ATNDはこちら

atnd.org

初心者セッション

R言語データマイニング基礎

@yokkuns

www.slideshare.net

データフレームの扱い方 初級編

@y__mattu
https://ymattu.github.io/TokyoR64/beginner/for_beginners.htmlymattu.github.io

応用セッション

空間統計を使って地価分布図を描いてみる

@Magna_Spes_Est

Rによる日本語テキスト前処理(形態素解析を中心に)

@y__mattu
https://ymattu.github.io/TokyoR64/apply/apply.html#/ymattu.github.io

LT

LT1

真面目に検定したいあなたに

@berobero11

twitter.com

LT2

R markdownで図表番号の自動付与と参照

@t_macya

www.slideshare.net

LT3

KaggleのKernelsで学ぶデータのレポーティング技術

@yasu_919
speakerdeck.com

LT4

Leaflet for Rで好きな Leaflet JSプラグインを使おう

@Hiromoooo

www.slideshare.net

LT5

fukuoka.r告知reafletでお手軽可視化on_r

@doradora09

www.slideshare.net

LT6

Rからmidiファイルを読んでplotしてみたお話

@niszet0
https://niszet.github.io/tokyor_lt_2017_Aug/TokyoR_64_LT.html#/niszet.github.io

LT7

コンテナで暮らそう

@u_ribo
speakerdeck.com

昔の。

第63回の時 niszet.hatenablog.com

第62回の時

niszet.hatenablog.com

ひとまず

置いておきます。このリストを運営さんに送ってATNDに追加してもらうのが一番良いのかもしれないな、と、思いつつ。。。

(R) 隠れtidyverse modelr編 とりあえず使ってみる 3回目 誤差の指標関係

前回の続き

niszet.hatenablog.com

niszet.hatenablog.com

本題

mae

Mean Absolute Errorを計算してくれます。

modelr::mae(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.3264736

実際に定義に従って計算してみます。

iris %>%  modelr::add_residuals(lm(iris$Sepal.Length ~ iris$Petal.Length)) %>% select(resid) %>%  abs() %>% unlist() %>% mean()
# [1] 0.3264736

一致しました。しかし、以降の関数も含めてpipeフレンドリーではない(データが第2引数)なのが惜しい…
ただし、pipe受け付けないわけではなく、以下のように.を置いてあげれば書けます。

iris %>% modelr::mae(lm(iris$Sepal.Length ~ iris$Petal.Length), .)
# [1] 0.3264736

記述量がかなり減るので便利感ありますね。

qae

quantiles of absolute errorのことだそうです。

modelr::qae(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
#         5%        25%        50%        75%        95% 
# 0.02893018 0.12853812 0.29006196 0.47718642 0.74273864 

先の残差の絶対値をstats::quantileを使って上記の%の値を表示しています。

rmse

Root Mean Square Errorを計算してくれます。

modelr::rmse(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.4043516

こちらも定義にしたがって計算。

iris %>%  modelr::add_residuals(lm(iris$Sepal.Length ~ iris$Petal.Length)) %>% select(resid) %>%  abs() %>% unlist() %>% `^`(2) %>%  mean() %>%  sqrt()
# [1] 0.4043516

一致しました。

rsquare

ヘルプによれば、the variance of the predictions divided by by the variance of the response.とのことですが、これって普通にbroom::glanceでとってくれば良いのでは…?

やってみます。

modelr::rsquare(lm(iris$Sepal.Length ~ iris$Petal.Length), iris)
# [1] 0.7599546
iris %>%  modelr::fit_with(lm, formulas(~Sepal.Length, model1=~Petal.Length) ) %>%  map(broom::glance)
# $model1
#   r.squared adj.r.squared     sigma statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1 0.7599546     0.7583327 0.4070745  468.5502 1.038667e-47  2 -77.02021 160.0404 169.0723 24.52503         148
# 

glanceの結果に含まれていますね。これを抜き出せば良いはずですが、値がそのまま出るという意味では便利…かも?ですね。

次以降は重い…

これでmodelrの簡単な方の関数が概ね終わり?
あとはresample系が結構重いので全部見るのは9月に入ってしまうかも。

あ、TokyoR 64 でLTやります。
タイトルは「Rからmidiファイルを読んで
plotしてみたお話」になる予定。。。

なので、この続きは週明けから。動作を確認していかなくては…

個人的には前回のfit_withがかなり便利だと思っていて、データとモデルの式を分離できる。しかもモデルの関数部分も分離できるということで、あれはかなり汎用性が高いのではないかと思いました。
broomとあわせて使いこなしたいですね…

Enjoy!

(R) 隠れtidyverse modelr編 とりあえず使ってみる 2回目 fit_withと関連する関数

前回の続きです。

niszet.hatenablog.com

fit_with

ヘルプのパクリになってしまいますが、この関数は予測変数が複数ないとあまり意味がないので、使用例と同じmtcarsデータセットを素直に使用します。
用語として、説明変数なのか予測変数なのかちょっとよくわかっていませんが、moderlrでは式の右辺をpredictorと表現しているため予測変数と書いています。統計ガチ勢の方からの優しいマサカリをお待ちしております。。。

mtcarsデータセットの詳細については?mtcarsでヘルプを参照するか、こちらを参照ください。 R: Motor Trend Car Road Tests

でもリンク先見るのが面倒くさいので、一部抜粋して貼っておきます。
mtcarsデータセットは下記のようなデータになっています。

head(mtcars, n=3)
#                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

ヘルプから、それぞれの列は下記を示しているそうです。

[, 1]   mpg Miles/(US) gallon
[, 2]  cyl Number of cylinders
[, 3]  disp    Displacement (cu.in.)
[, 4]  hp  Gross horsepower
[, 5]  drat    Rear axle ratio
[, 6]  wt  Weight (1000 lbs)
[, 7]  qsec    1/4 mile time
[, 8]  vs  V/S
[, 9]  am  Transmission (0 = automatic, 1 = manual)
[,10]  gear    Number of forward gears
[,11]  carb    Number of carburetors

さて、前回同様に、下記のライブラリをロードしておきます。

library(tidyverse)
library(broom)
library(modelr)

さて、ヘルプにあった例をそのまま実行してみます。…と思ったのですが、最初のモデルだけmodel1という名前に変えています。結果の差異を見たかったのでその名残…。

disp_fits <- mtcars %>% fit_with(lm, formulas(~disp,
model1 = ~drat + cyl,
interaction = ~drat * cyl,
full = add_predictors(interaction, ~am, ~vs)
))

色々と知らない関数が使われていて、わかりづらいので1つずつ見ていきます。

formulaについて

これは深入りすると結構重い話になるのでさらっと。
前回の例のように、yが応答変数xが予測変数であるような場合は

y~x
# y ~ x

のようにして書きますね。xyは未定義の変数で良いです。

str()で見ると、こんな感じですね。

str(y~x)
# Class 'formula'  language y ~ x
#   ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 

また、左辺と右辺を別々に、~y, ~x のように書いて使用することもあります(あとで使います) ~ x + z~ x:z, ~x * z 等々、色々あるのですが…ここでは割愛。

formulaについてはこちらの記事が良いと思います。私も、大変参考になりました。

ill-identified.hatenablog.com

また、そのリンク先のこちらの記事も参考になると思います。

m884.hateblo.jp

modelr::formulas

これもmodelrパッケージに含まれている関数です。modelr::formulaeという関数もありますが、中身は同じです。

# 確認。
identical(modelr::formulae, modelr::formulas)
# [1] TRUE

さて、この関数formulasformulaの右辺を複数受け取り、複数のformulaを作ることが出来ます。…なんのこっちゃ?
実際に先の例からこの部分を取り出して実行してみます。

tmp <- formulas(~disp,
         model1 = ~drat + cyl,
         interaction = ~drat * cyl,
         full = add_predictors(interaction, ~am, ~vs))

tmp
# $model1
# disp ~ drat + cyl
# 
# $interaction
# disp ~ drat * cyl
# 
# $full
# disp ~ drat * cyl + am + vs

…と、このようにリストが返却されます。formulasの引数として、要素の名前(モデルの名前)を指定して式の右辺を与えることが出来ます。
左辺の変数は固定のようです(ヘルプより)ので、応答変数が複数ある場合は別々に行う必要がありますね。

さて、この関数の引数にもまた関数が…

add_predictors

これもmodelr(ry

これは上に結果があるので良いですかね?右辺に変数を追加してくれます。 予測変数を足していって結果を見る際に便利ですね。例でも、交互作用のあるモデルinteractionamvsを追加していますね。

interaction <- ~drat * cyl
interaction
# ~drat * cyl
full <-  add_predictors(interaction, ~am, ~vs)
full
# ~drat * cyl + am + vs

モデルから変数を取り除く方はできないと思います(あれば教えてください。)

さて、最初の実行結果はリストだったので、要素にアクセスすれば、

disp_fits$model1
# 
# Call:
# .f(formula = disp ~ drat + cyl, data = data)
# 
# Coefficients:
# (Intercept)         drat          cyl  
#       18.72       -35.83        55.09  

となりますね。例によってtidyで整形すれば、

> broom::tidy(disp_fits$model1)
         term  estimate  std.error  statistic      p.value
1 (Intercept)  18.71579 127.836537  0.1464041 8.846154e-01
2        drat -35.83058  25.150896 -1.4246243 1.649392e-01
3         cyl  55.09059   7.529809  7.3163322 4.652654e-08

このように。 listの処理なので、purrr::mapの出番ですね。

> disp_fits %>%  map(tidy)
$model1
         term  estimate  std.error  statistic      p.value
1 (Intercept)  18.71579 127.836537  0.1464041 8.846154e-01
2        drat -35.83058  25.150896 -1.4246243 1.649392e-01
3         cyl  55.09059   7.529809  7.3163322 4.652654e-08

$interaction
         term    estimate std.error  statistic    p.value
1 (Intercept) -193.487202 335.44306 -0.5768109 0.56867604
2        drat   20.389801  85.87195  0.2374442 0.81404100
3         cyl   88.674520  49.59003  1.7881522 0.08457908
4    drat:cyl   -9.154652  13.35808 -0.6853269 0.49877264

$full
         term    estimate std.error  statistic   p.value
1 (Intercept) -164.832719 385.89073 -0.4271487 0.6727877
2        drat   27.577726  90.83136  0.3036146 0.7638379
3         cyl   75.843245  56.04986  1.3531390 0.1876606
4          am  -38.217318  31.42983 -1.2159567 0.2349265
5          vs  -15.529580  40.06479 -0.3876117 0.7014585
6    drat:cyl   -6.969767  14.00552 -0.4976442 0.6229177

こんな感じに出力されました。便利ですね。mapではなくmap_dfrに与えることで下記のようになります。

disp_fits %>%  map_dfr(tidy)
#           term    estimate  std.error  statistic      p.value
# 1  (Intercept)   18.715788 127.836537  0.1464041 8.846154e-01
# 2         drat  -35.830577  25.150896 -1.4246243 1.649392e-01
# 3          cyl   55.090585   7.529809  7.3163322 4.652654e-08
# 4  (Intercept) -193.487202 335.443063 -0.5768109 5.686760e-01
# 5         drat   20.389801  85.871954  0.2374442 8.140410e-01
# 6          cyl   88.674520  49.590030  1.7881522 8.457908e-02
# 7     drat:cyl   -9.154652  13.358081 -0.6853269 4.987726e-01
# 8  (Intercept) -164.832719 385.890732 -0.4271487 6.727877e-01
# 9         drat   27.577726  90.831360  0.3036146 7.638379e-01
# 10         cyl   75.843245  56.049855  1.3531390 1.876606e-01
# 11          am  -38.217318  31.429835 -1.2159567 2.349265e-01
# 12          vs  -15.529580  40.064790 -0.3876117 7.014585e-01
# 13    drat:cyl   -6.969767  14.005520 -0.4976442 6.229177e-01

出力が1つのデータフレームになりますが、このままではどのモデルだったのかがわからなくなってしまいますね。もう少し工夫が必要そうです。

なお、broom::tidy以外にも、broom::glance, broom::augmentに食わせてあげることもできます。

disp_fits %>%  map(glance) 
# $model1
#   r.squared adj.r.squared   sigma statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1 0.8258511     0.8138408 53.4748  68.76206 9.848099e-12  3 -171.1657 350.3315 356.1944 82927.08          29
# 
# $interaction
#   r.squared adj.r.squared    sigma statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1  0.828724      0.810373 53.97056  45.15962 7.426765e-11  4 -170.8996 351.7991 359.1278 81559.01          28
# 
# $full
#   r.squared adj.r.squared    sigma statistic      p.value df    logLik      AIC      BIC deviance df.residual
# 1 0.8381416     0.8070149 54.44635  26.92684 1.658079e-09  6 -169.9947 353.9894 364.2496 77074.53          26

augmentは結果が長くなるので1つだけ(かつhead()に食わせて)、下記のようになりますね。

# disp_fits$model1 %>%  augment() %>%  head()
#           .rownames disp drat cyl  .fitted  .se.fit     .resid       .hat   .sigma      .cooksd .std.resid
# 1         Mazda RX4  160 3.90   6 209.5200 11.59803 -49.520050 0.04704028 53.57031 0.0148068727 -0.9486251
# 2     Mazda RX4 Wag  160 3.90   6 209.5200 11.59803 -49.520050 0.04704028 53.57031 0.0148068727 -0.9486251
# 3        Datsun 710  108 3.85   4 101.1304 15.94755   6.869592 0.08893844 54.40433 0.0005894354  0.1345885
# 4    Hornet 4 Drive  258 3.08   6 238.9011 16.90633  19.098877 0.09995406 54.28819 0.0052464695  0.3764665
# 5 Hornet Sportabout  360 3.15   8 346.5742 13.68171  13.425848 0.06546100 54.35801 0.0015748949  0.2597131
# 6           Valiant  225 2.76   6 250.3669 23.99234 -25.366907 0.20130145 54.15633 0.0236699055 -0.5307951

なお、このbroom::augmentは使用すると

Warning messages:
1: Deprecated: please use `purrr::possibly()` instead 

のようにwarningが出てきます。しかしこれはbroom::augmentが内部で使用しているbroom:::augment_columns()が出しているようなので、たぶん無視してよいと思います(いずれ動かなくなるのだろうか…?)

長くなってしまったのでこの辺で(まだまだかかりますね…)

(R) 隠れtidyverse modelr編 とりあえず使ってみる 1回目

久々のRの日記な気がする…

これから数回にかけて、modelrというパッケージに入っている関数を使ってみる、という趣旨で日記を書いていきます。

知らないうちに、インストールされてる…

modelrパッケージについて、日本語で書かれた情報が全然見当たりませんが、実はtidyverseをインストールすると一緒に入っています。ただし、library(tidyverse)ではロードされないので、意識して読み込む必要があります。

# インストールされてなければ
# install.packages("tidyverse")

# tidyverseをロード
library(tidyverse)

# modelrをロード
library(modelr)

# broomをロード
library(broom)

確認してみましょう。

 tidyverse::tidyverse_packages()
#  [1] "broom"     "dplyr"     "forcats"   "ggplot2"   "haven"     "httr"      "hms"       "jsonlite"  "lubridate"
# [10] "magrittr"  "modelr"    "purrr"     "readr"     "readxl"    "stringr"   "tibble"    "rvest"     "tidyr"    
# [19] "xml2"      "tidyverse"

お。11番目にありますね。

なお、broomとmodelrそれぞれにbootstrapという関数が含まれているため、このようなメッセージが出てきます。

 次のパッケージを付け加えます: ‘broom’ 

 以下のオブジェクトは ‘package:modelr’ からマスクされています: 

     bootstrap 

このbootstrapのそれぞれのパッケージでの差についてはいずれ…(まだちゃんと見てない)とりあえず気にせずに進めましょう。

broomと仲が良い。

以前、broom::tidy、broom::tidyMCMCについて書きました。

niszet.hatenablog.com

このときはstanの結果についてみてみましたが、tidyはlmやglmの結果をtidyにしてくれます(実際はtidyでtidyMCMCと同じようにstanの結果も見れる)

modelrはlmやglmなどの解析をtidyにしてくれます。また、ブートストラップやらCVなどに使える関数も色々入っており、broomとあわせることで解析が楽になるのではないかと思います。

実際に使ってみる

とりあえず、実際に使って結果を見る方が早いので。 modelrの例文だとmtcarsを使っていることが多いのですが、簡単のためにirisのデータを使ってみます。

plot(iris$Sepal.Length ~ iris$Petal.Length)

こんな図になりますね。特に面白みのない図です。 f:id:niszet:20170823225820p:plain

さて、lmに入れてみます。

lm(iris$Sepal.Length ~ iris$Petal.Length)
# 
# Call:
# lm(formula = iris$Sepal.Length ~ iris$Petal.Length)
# 
# Coefficients:
#       (Intercept)  iris$Petal.Length  
#            4.3066             0.4089  

せっかくなのでbroom::tidyで整形します。

broom::tidy(lm(iris$Sepal.Length ~ iris$Petal.Length))
#                term  estimate  std.error statistic       p.value
# 1       (Intercept) 4.3066034 0.07838896  54.93890 2.426713e-100
# 2 iris$Petal.Length 0.4089223 0.01889134  21.64602  1.038667e-47

printで見れないパラメータはsummaryで見れる値です。std.error、statistic、p.valueですね。

summary(lm(iris$Sepal.Length ~ iris$Petal.Length))
# 
# Call:
# lm(formula = iris$Sepal.Length ~ iris$Petal.Length)
# 
# Residuals:
#      Min       1Q   Median       3Q      Max 
# -1.24675 -0.29657 -0.01515  0.27676  1.00269 
# 
# Coefficients:
#                   Estimate Std. Error t value Pr(>|t|)    
# (Intercept)        4.30660    0.07839   54.94   <2e-16 ***
# iris$Petal.Length  0.40892    0.01889   21.65   <2e-16 ***
# ---
# Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
# 
# Residual standard error: 0.4071 on 148 degrees of freedom
# Multiple R-squared:   0.76,  Adjusted R-squared:  0.7583 
# F-statistic: 468.6 on 1 and 148 DF,  p-value: < 2.2e-16

summaryから、statistic = t value、std.error = Std. Error、p.value = Pr(>|t|)が対応していますね。tidyMCMCと違って、オプションは特にないのだと思いますが、見つけたら教えて下さい…。

add_predictions

broomの話しかしてなかった。add_precictionsは、データとモデルの式を与えると、もとのデータ列にモデルでの予測値を追加したものを返します。

head(modelr::add_predictions(iris, lm(iris$Sepal.Length ~ iris$Petal.Length)),n=3)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species     pred
# 1          5.1         3.5          1.4         0.2  setosa 4.879095
# 2          4.9         3.0          1.4         0.2  setosa 4.879095
# 3          4.7         3.2          1.3         0.2  setosa 4.838202

先の結果から、Sepal.Length = 4.3066034 + 0.4089223 * Petal.Length が得られていますので、1行目の1.4を与えて計算すると4.879095が得られ、一致しますね。

add_residuals

今度は残差を足す方です。

head(modelr::add_residuals(iris, lm(iris$Sepal.Length ~ iris$Petal.Length)),n=3)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species      resid
# 1          5.1         3.5          1.4         0.2  setosa  0.2209054
# 2          4.9         3.0          1.4         0.2  setosa  0.0209054
# 3          4.7         3.2          1.3         0.2  setosa -0.1382024

一行目、予測値4.879095に対して実際の値は5.1なので、5.1 - 4.879095 = 0.220905 となり一致します(桁数の問題で完全一致ではないですが)
予測値、残差ともに加える場合、pipeフレンドリーな関数なので、このように書くことが出来ますね。もちろん、先の例も全部pipeで受け渡すようにも書けます。

modeleq <- lm(iris$Sepal.Length ~ iris$Petal.Length)

iris %>%  add_predictions(modeleq) %>%  add_residuals(modeleq) %>%  head(n=3)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species     pred      resid
# 1          5.1         3.5          1.4         0.2  setosa 4.879095  0.2209054
# 2          4.9         3.0          1.4         0.2  setosa 4.879095  0.0209054
# 3          4.7         3.2          1.3         0.2  setosa 4.838202 -0.1382024

とりあえず今回はここまで。
含まれている関数が結構多いので全部やると時間がかかりそうですが…。

tidyverseに含まれているだけあって、使っていると便利さがわかってきました。
分析を本業にされている方はもう使っているのかもしれませんが…

まぁ、R4DSにも書かれていますけどね。modelr, broomは23章あたりから。

r4ds.had.co.nz

読んでからそろそろ半年なのでいろいろ忘れてきましたが…

本業はRからも分析・機械学習その他からも遠いところにあるので、このあたりは勉強しながら・・・です。コツコツいきましょう。。。

modelrパッケージもぜひぜひ使ってみてください。

Enjoy!

(R/Rcpp/WiringPi/RasPi3) R on ラズパイで Lチカする。完結編

ようやくこのシリーズも終わり

長い道のりでしたが、ラズパイ上のR/RcppでwiringPiを使用することで、Lチカを確認できました。
前回のwiringPiをRcppから呼び出せた時点でほぼ完了していたわけですが、まぁけじめとしてちゃんとLチカさせないとね…ということで。

本題

さて、cppのソースは以下の通り。

#include <Rcpp.h>
#include <wiringPi.h>

using namespace Rcpp;

// [[Rcpp::export]]
int l_chika(NumericVector v)
{
  wiringPiSetup();
  pinMode(pin, OUTPUT);

  int pin =15;
  int cnt = 0;

  while(cnt < 5){
    digitalWrite(pin, 1);
    delay(500);
    digitalWrite(pin, 0);
    delay(500);
    cnt++;
  }
  return(0);
}

今回、ピンの番号をwiringPiの使用している番号を示すためにwiringPiSetup();を入れています。これがないと他の指定方法になってしまいますので注意。15番は右列の上から4番目、GPIO14でありPIN番号8であり、TXD0であるピンのことを指しています。

回路図がないと意味不明ですが、このIOの出力とGNDとの間にLEDと電流制限用の抵抗を入れています。GNDは右列三番目、PIN番号06を使用しています(20とか14とかでももちろんOKです)

これで500ms毎にLEDが光ったり消えたりをします。while(1)でも良かったのですが抜けられないと怖いのでまた適当にカウンタ回しています。引数のvは例のようにダミーの引数。今回はこれを秒に変えても良かったですね。

ここまで書いて気づきましたが、プログラム側だけではなんだかよくわかりませんね。最低限ハード側の接続や説明がないとなんのことやら…。

動画か、回路図か何かがないといけない…という課題を残しつつも、ひとまずこれにてラズパイ上でRを動かしてハードウェアの制御をおこなう部分については一旦区切りとします~

とはいえ、まだこれは入り口に過ぎないので、少しずつ何かやっていきます。

さて、次は何をしようかな。

Rcppを活用すれば、Rでもラズパイ使っていろいろ出来ることが伝わればいいなと思います。

Enjoy!!