統計解析R たぶんpart3くらい
上のコード`uncertainly`の挙動を"プロミスの罠"と書くことにする。 ここでの"プロミス"は、JSの"プロミス"ではなくて、Rでの"変数"の 実装方法を指す。 * [6 Functions | Advanced R](https://adv-r.hadley.nz/functions.html ) この記事には次の一節がある。 > You cannot manipulate promises with R code. Promises are like a **quantum state:**: ... 多分、ここでの"量子状態"はハイゼンバグと同じ現象を指しているんだと思う。 観測すると、状態が変化してしまう。 関数`do.call`自体はプロミスの罠と関係しないと思う。 ``` {r a_28697, dependson = ""} do.call (`+`, list (1L, 2L)) ``` Pythonだと次のコードに対応する。 ``` {python a_10786, dependson = ""} (lambda x, y: x + y) (* range (1, 3)) ``` 殆どのプログラミング言語で、関数の引数リストは [一級市民](https://en.wikipedia.org/wiki/First-class_citizen ) でないように思う。一級市民でない代わりに、一級市民の配列からの変換が 用意されている。Pythonでは`*`という関数がビルトインで用意されている。 Rでは引数リストを直接作れるかもしれないが、`do.call`で配列から 変換するのが一般的だと思う。 自分の知る限り、プロミスの罠にハマるのは次のパターンに限られる。 ~~~ {.r} x = "hello" g = f (x) x = "world" g () ~~~ "関数を返す関数"`f`に、"変数"`x`を代入した時にプロミスの罠が可能性が 出てくる。Rの評価戦略はHaskellと同じ [コールバイニード](https://en.wikipedia.org/wiki/Evaluation_strategy ) に分類されている。上の例では、次の場合にプロミスの罠が発生する。 1. 関数`f (x)`の中で引数`x`がニードにならず、 1. 返り値の関数`g`に渡される。 次の例はプロミスの罠が発生する。 ``` {r a_20914, dependson = ""} rude = with (new.env (), { const = \(x) \(...) x x = "hello" g = const (identity (x)) x = "world" g () |> print () }); ``` 関数への代入はニードでないので(by definition)、関数適用の連鎖 `const (identity (x))`の中にはニードがない。そのために、最終的に`g ()`が コールされるまで引数`x`は評価されない。コード`g ()`がコールされた時点で 引数`x`の定義を探しに行くので、プロミスの罠にハマる。 コールバイニードを実現するためには、コンパイラーが内部的に次のように 書き換える必要があると思う。 ``` {r a_1451, dependson = ""} polite = with (new.env (), { const = \(x) \(...) x x_1 = "hello" g = const (identity (x_1)) x_2 = "world" g () |> print () }); ``` [静的単一代入](https://en.wikipedia.org/wiki/Static_single-assignment_form ) と呼ばれる操作と同じだと思う。この書き換えはループ処理では必須になる。 コード`rude`はアカン奴として切り捨てることができるかもしれないが、 ループ処理では変数の多重定義が避けられない。Rでは、何らかの理由で、 この書き換えが省略されているために、プロミスの罠が発生するのかな?と 思っている。 コード`rude`からコード`polite`への書き換えを上とは異なる形で行ってみる。 Rではできないので、Pythonを使う。 ``` {python a_14213, dependson = ""} ##| cache: false # def none (): id = lambda a: a const = lambda x: lambda * y: x def lhs (): x = "hello" g = const (id (x)) x = "world" return g () def rhs (): return (lambda x: (lambda g: (lambda x: g ()) ("world")) (const (id (x)))) ("hello") assert lhs () == rhs () none (); ``` 関数`lhs`から関数`rhs`への書き換え規則は次のようになる。[rule]{#rule} ~~~ {.python} y = f (x) z = g (x, y) rest (x, y, z) == (lambda y: z = g (x, y) rest (x, y, z) ) (f (x)) == (lambda y: (lambda z: rest (x, y, z)) (g (x, y))) (f (x)) ~~~ この書き換え規則を適用した結果、関数`rhs`では、静的単一代入への変換は、 [ラムダ計算](https://en.wikipedia.org/wiki/Lambda_calculus )のアルファ変換 に置き換わる。この意味では、静的単一代入とアルファ変換は同じことになる。 実際のコードでは、分岐、ループ、副作用が入ってくるので、こんな単純は 話では済まないと思うが、極度に単純化すると、静的単一代入とアルファ変換は、 単に、方言の違いということになる。 Rの場合は、書き換え規則[rule](#rule)は等価な変換にならない可能性がある。 特に、プロミスの罠が現れた場合は、挙動が変わると思う。 余談だが、書き換え規則[rule](#rule)をモナドに拡張したものがHaskellの [do-記法](https://en.wikibooks.org/wiki/Haskell/do_notation )になっている。 ~~~ {.python} y <- f (x) z <- g (x, y) rest (x, y, z) == kleisli-extension (lambda y: z <- g (x, y) rest (x, y, z) ) (f (x)) ~~~ モナドが恒等関数の場合に[rule](#rule)に一致するので、do-記法を [rule](#rule)の拡張と言って差し支えないと思う。 おしまい [トランスフォーマー](https://en.wikipedia.org/wiki/Transformer_ (machine_learning_model)) についての記事: オーサーヒアーかな? * [Coinductive guide to inductive transformer heads](https://news.ycombinator.com/item?id=34970877 ) 中を読んでいないが、アテンション機構を [ホップ代数](https://en.wikipedia.org/wiki/Hopf_algebra )で説明、もしくは、 ホップ代数を使ってアテンション機構の類似物を導出するという話のようだ。 この手の救世主的な話はがっかりすることが多いので、過大な期待は禁物かも。 g = do.call(const, list(x)) ではどうだろう RのS5クラス定義(setRefClass)ってsave、loadでシリアライズ、デシリアライズ出来ないのか デシリアライズされたメンバ関数にアクセスできない ## Rにおけるオブジェクト指向への取り組み 趣旨は新規フレームワークR7の紹介だが、既存のフレームワークの俯瞰図 としても使いやすいと思う。 * [What is R7? A New OOP System for R](https://www.jumpingrivers.com/blog/r7-oop-object-oriented-programming-r/ ) ## オブジェクト指向とは? 次の記事を取り上げてみる。 * [Object Oriented Programming Features of Rust](https://doc.rust-lang.org/book/ch17-00-oop.html ) 内容については賛否両論だと思う。しかし、箇条書きできるということが、 オブジェクト指向が単一の概念でないことを示しているように思う。 ## S3はオブジェクト指向か? 比較のために、S3のキーワード`default`を使わないで書く。 ``` {r a_3770, dependson = ""} none = with (new.env (), { to_string = \(x, ...) UseMethod ("to_string", x) as_string = \(x, ...) UseMethod ("as_string", x) to_string.Base = \(x, ...) as_string (x, ...) as_string.Base = \(x, ...) to_string (x, ...) to_string.Derived = \(x, ...) paste0 ("hello ", class (x)) as_string.Derived = as_string.Base structure (identity, class = "Derived") |> as_string () |> print () }); ``` `Base`クラスは、関数`to_string`か関数`as_string`の"どちらか1つを実装せえ"と言っている。 似た内容をPythonで書いてみる。 ``` {python a_8560, dependson = ""} class Base: def to_string (self): return self.as_string () def as_string (self): return self.to_string () class Derived (Base): def to_string (self): return "hello " + type (self).__name__ Derived ().as_string () ``` Haskellで書いてみる。 ``` haskell class Base_ a where to_string :: a -> String to_string = as_string as_string :: a -> String as_string = to_string instance Base_ () where to_string :: () -> String to_string = ("hello " ++) . show as_string () ``` <pre> "hello ()" </pre> ワンセットの関数群をインターフェースと書く。 1. Pythonのクラスでは、 * 構造体の定義とインターフェースの定義と実装が同時に行われる。 1. HaskellのクラスやRのS3では、 * 構造体とインターフェースは別々に定義される。 * インターフェースの実装は既存の"構造体"に対して行われる。 HaskellやRの"構造体"には、通常の構造体に加えて、関数も含まれる。 構造体とインターフェースが別々に定義される点で、RのS3はHaskellのクラスに 近いように思う。 おしまい join_by()が便利で感動した 気象データのマージがすごくシンプルになった 任意の地点・期間における測定値についての風向風速などの気象の影響をみるため近傍アメダスの気象データをマージする際に、便利になったと実感しました 具体的にはマージの際にbetween(時刻,)の条件が追加できるようになったのが大きいです 処理が重いかコードが長いかだった上のマージ処理が、join_by(地点名, between(time, start_time, end_time))で済むようになりました [非等価ジョイン](https://en.wikipedia.org/wiki/Relational_algebra )は 最近になって関数`dplyr::xxx_join`に導入されたらしい。 * Rで非等価結合 (2) * [dplyr 1.1.0: Joins](https://www.tidyverse.org/blog/2023/01/dplyr-1-1-0-joins/ ) [ラッキー](https://www.youtube.com/watch?v=xBJMr1v5Zuw )。 関数`vctrs::vec_locate_matches`には、以前から限定された形の非等価ジョイン のオプションがあったので、実用的な形にするのに時間がかかったのかもしれない。 リスト内包表記が使いたいのでPythonで書く。 ``` {python a_32372, dependson = ""} #| cache: false # def slow_matches (pred, zipper): #{ def go (a, b): #{ a = pandas.DataFrame ({"" : a}).groupby ("").groups b = pandas.DataFrame ({"" : b}).groupby ("").groups key = ((j, k) for j in a.keys () for k in b.keys () if pred (j, k)) val = (zipper (a [j], b [k]) for (j, k) in key) val = zip (* itertools.chain (* val)) return (numpy.fromiter (val, dtype = numpy.int32) for val in val) #} return go #} def none (): #{ a = numpy.random.choice (8, 2 * 8, replace = True) b = a + 4 def go (pred, zipper): #{ (j, k) = slow_matches (pred, zipper) (a, b) out = pandas.DataFrame ({"a" : a [j], "b" : b [k]}) print (out) #} go (lambda a, b: a == b, itertools.product) go (lambda a, b: a == b, lambda a, b: itertools.islice (zip (a, b), 1)) go (lambda a, b: abs (a - b) <= 1, itertools.product) go (lambda a, b: abs (a - b) <= 1, lambda a, b: itertools.islice (zip (a, b), 1)) #} none (); ``` `dplyr::xxx_join`の数々のオプションは理解できていないが、`NA`絡み以外は、 コールバック`pred`と`zipper`でかなりカバーしてるんじゃないかと思う。 ジョインの操作自体は明朗会計だが、実行時性能がボッタクリ価格に転嫁される というプログラミング社会が抱える構造的な問題が反映されている。 おしまい 一応Rスレだしコード一式を載せるならRにしてほしいな 正直、書き方を思い出すためだけに、話題にかこつけて、わざと異なる プログラミング言語で書くこともある。しかし、今回は純粋に、処理の道筋を 単刀直入な形で表せるプログラミング言語を選択した。 [線形回帰](https://en.wikipedia.org/wiki/Linear_regression )を例にとる。 Rで線形回帰はとても書きやすい。しかし、線型回帰をRのイディオムとして 覚えるよりも、線形代数として覚えた方が長い目で見た時に利益になると思う。 同じように、等価ジョインは [プルバック](https://en.wikipedia.org/wiki/Pullback_ (category_theory)#Sets) に対応する。等価ジョインを、Rのイディオムとして覚えるよりも、 単純な`for`ループの形で覚えた方が長い目で見た時に利益になると思う。 リスト内包記法は`for`ループを簡潔に書くための記法になっている。 プルバックの話の続きをアップした。 * [JSFiddle](https://jsfiddle.net/ytkhdpcq/show ) プルバックのカリー化の話になっている。プルバックの話はこれでお終い。 洗練された話は次の記事にある。 * [locally cartesian closed category in nLab](https://ncatlab.org/nlab/show/locally+cartesian+closed+category ) 表計算の立場で見ると、"何が問題なのかわからない"問題かもしれない。 ある規則を満たす表でサマリーするとプルバックのカリー化になる。 4.3.0入れてみた パイプがまたひとつ便利になっていい感じ Windowsでパスが長くても通るようになったのも嬉しい どなたか教えてくだされ 対照実験の医療統計をしたいと思って 傾向スコアマッチングにしようと思ってます 肺がん手術を実施した人たち200症例のうち10人だけ 手術後に合併症を起こしていました この場合 「合併症を起こしたグループ」・・・10人 「合併症を起こさなかったグループ」・・・190人になり 患者の背景で傾向スコアマッチングをキャリパー幅0.2でペア分けすると 各群8人ずつの比較になってしまいます。 これで優位差を出す統計するには数が少なすぎるのであまりにも乱暴な統計になりますか? それとも元々のサンプルが200人から選りすぐりのマッチングさせた8人ずつを選んでいるので8人ずつと少なくても問題ないですか? 共変量のバイアスがより少ないサンプルが得られますが、サイズが8人の二群比較なのは変わらないんじゃないかと思います >>493 つまりサイズが8人ずつの比較では 優位差を言うには弱いと思いますか? >>494 検定はサンプルサイズ込みの判定なので8人であっても二群に有意な差があったと言って差し支えありません 有意水準が甘ければ弱いとは感じますが 一方で、検定は標本のバイアスが除去できていることを保証してくれません スレッドの質をガクッと下げるが、Rの非標準評価で遊んでみた。 * [JSFiddle](https://jsfiddle.net/fo1qjt87/show ) 4.3.0のWindows版はdir()にバグあるね リストがまともに取得できない 4.2.3に戻した tibbleを利用してデータ探索しているんだけど、2つの変数で条件つけて散布図つくるにはどんな手順踏んだらいいのか… 変数1をプロットの色にして変数2をサイズにするとかじゃだめなの? それも一つの方法ですね。ありがとう ただ、目的以外の条件をプロットしたくないのです。 tibbleの構成としては、観測が4時点、変数がたとえば6個(うち1つは個体識別番号で、変数としてはA-Eの5種類あるとしましょう)のような感じで、 散布図のx軸に「観測時点1における全個体の変数A」 y軸に「観測時点4における全個体の変数E」 をプロットしたいのです。 個体識別番号をキューにして、異なる時点の異なる種類の変数を散布図にするとでもいいましょうか… その要件だと以下のような感じでいけると思います library(tidyverse) df <- tibble( time = rep(1:4, each = 5), id = rep(1:5, 4), a = rnorm(20), b = rnorm(20), c = rnorm(20), d = rnorm(20), e = rnorm(20) ) df |> pivot_wider(id_cols = id, names_from = time, values_from = c(a, e)) |> ggplot(aes(a_1, e_4)) + geom_point() ありがとうございます! それをヒントに試してみます。 >>507 要件の理解が違っていなければ散布図作成まで行きますよ time1でのaの値とtime4でのeの値をid毎にプロットしています >>508 失礼しました こちらのビューワの問題で、ブラウザでみたらスクリプトの最後まで表示されました💦 >>508 教えてもらったスクリプトでドンピシャでした、ありがとうございます。 どなたか統計素人の私に教えてください 医療でA群100名とB群100名をいろんな観点から 比較するとします 背景を揃えるために傾向スコア分析で キャリパー0.2で取って30ペア(合計60人)を抽出しました 例えば ①アミラーゼの値とかを統計にかけたいときは、その60人のアミラーゼのデータをまずは正規分布かどうかをShapiro-wilk検定で測って、0.05を上回っていたら「正規分布」と見なして、今度はこれら60人のアミラーゼのデータが等分散かどうかを確認するためにf検定を行なって等分散だったらt検定(Student's t-test)、違ったらWelch's t-testで優位差があるかどうかを調べる。 もしShapiro-wilk検定が0.05未満で非正規分布だったときはMann-whitney's U検定で優位差があるかどうかを調べる。 ↑Q1. この認識であってますか? Q2. この正規分布を計るのはペアを作った後のデータ(n=60)で、正規分布かどうか?等分散かどうか?を見ますか? それともマッチング前のデータ(n=200)で正規分布かどうか?等分散かどうか?を確認するべきですか? Q3. アミラーゼじゃなくて他の連続変数の項目(BMIだったり、血圧だったり、白血球数だったり)の優位差を調べる場合も 全て上の流れで一つ一つの項目ごとで正規分布か?等分散か?など確認していって適宜、該当する算出法を項目ごとに採用して優位差を測る必要がありますか? もし良ければ教えていただけるとありがたいです 素人だと思ううちは傾向スコアには手を出さないほうがいいような気がする >>512 上記の場合はどういうかんじでやるのが 最適解になるのかだけでも教えてもらえないでしょうか? writexlパッケージで保存すると時刻のタイムゾーンは反映されないのね ggraggedパッケージがなかなか便利 facet_grid()を詰めて並べられる R4.3.1にした dir()関連が直ってるようでひと安心 標準パイプの新機能もようやく使える ggplot2のカラーパレットのデフォルトが変わったりしました? 棒グラフの色の割り当てが変わった気がする… >>518 変わってないはず ただggplot2のデフォルトはグループ数に応じて関数で色を割り当ててるのでグループ数が異なると違うパレットのように感じるとは思います 株価データを取得したいがためにRを弄り始めたけど中々難しいね ググってコピペしたコードを一つ一つパッケージと関数の挙動を調べているけど やりたいこと全てができるようになるまでは遠そうだ >>520 データをどこから持ってくるかによって随分難易度は違う。 ファイルとしてダウンロードできるところもあるし、 スクレイピングが必要なところもある。場合によってはせれにうむとか。 企業が求めるエンジニア言語ランキング 2位「R」 https://www.itmedia.co.jp/news/spv/2306/20/news183.html 3位以下を大きく引き離しててすごいけど… Rユーザの少なさを反映しただけな気もする >求人数のトップ3は1位「C言語」(39万2559件)、2位「R言語」(30万3759件)、3位「Go」(8万3922件)だった。 >このランキングは、SalesNow DBに1月1日から5月31日までに載った114万5294件の有効求人から算出した。 5ヶ月で30万件もあったらしい Pythonが4万件弱なところを見るとデータ解析用言語を列記したわけじゃなく純粋にRの需要があったみたいだ 不思議 結局企業で欲しいのは統計処理だから、統計処理ならRだろうっていう短絡的な 求人が多かったってことじゃない? いくつか求人サイト見てみたけどRのみなんて求人はほぼ皆無でほとんどがPythonとの併記だった これ集計ミスかもね 同じ会社の別の期間のランキング見るとRは10位以内に入ってないし 業∞!!!! 字∞!!!!! 苗∞!!!!!! 米∞!!!!!!! 畑∞!!!!!!!! 灰∞!!!!!!!!! 糞∞!!!!!!!!!! 机∞!!!!!!!!!!! 結構何年か前にRは結構古臭いし、言語仕様もわかりづらいし衰退するのでは、と書いているのを 読んだことがあるけど、逆に今だと他の商用統計パッケージが廃れる勢いなのにRって立場が盤石な 気がする なんで? AIブームでPythonに全部もってかれると思ったけどそうでもなかったね 先発優位で統計屋や大学教授が昔からRユーザーってのもあるのかも? ユーザー視点からだとtidyverseの存在が大きいと思う 505のように地味に手間がかかりそうな処理が関数ひとつでひょいと処理できるとかすごい >>529 今でもC/C++が盤石なのと同じ理由な気がする とくに大学の研究室とかは、同じような機能のプログラムを別言語に コンバートする作業は雑用でしかないので誰も積極的にはやらない。 RでできるのならこのままRでいいじゃん、もしくはフォートランでもw みたいな感じ やったところでなにか新しい知見が得られるわけもなし。 昔の医学分野の統計処理はSASがデフォだったけど COVID-19で疫学の人(西浦先生とか)がRガンガン使ってるの見て疫学以外でもRが広がってる 学会行くとggplotで書いたグラフいっぱい見る ggplot2のデフォルトテーマは微妙なので変えているけどいつも悩む ggthemesをもとにそこから装飾することが多い ついにExcelでPython使えるようになるらしい マイクロソフトはRのベンダー買収してMRANとかやってたのに時代の流れかな Pythonでexcel弄るのは 15年以上前から出来てるのを今更 excel上のpythonで実行する方が遅い可能性まである PythonからExcelをいじることとExcelでPythonが動くことは全く違う pythonは何故かPCでJupyter notebookが不具合で使えなくてな 導入時点でコケるとその言語をやる気失くす…Rはその点、導入が簡単で良かった Excelも最近はTidydata志向で、パワークエリやパワーピボットで再現性のある加工や分析が できるようになってきているけど、使い始めはなかなかいいかな、と思ったがちょっと凝ると やっぱり複雑化してメンテできないVBAみたいになっちゃうなw ま、RやPythonだからメンテ性がいいというわけでもない気はするけどw Excelマクロ禁止してきた企業はPython機能も禁止しそう Rを社員が使うケースなんてのはもうレア度SSRなんだろうね Rで学ぶなんとか分析とかいう本いっぱい出ているし、結構個人でやる気のあるやつは覚えるんじゃね? R人口増えている印象。 昨日の統数研のワークショップ見て、大学や企業によってはライブラリのインストールに制限あったりでデフォルトで解析できるのがRが多言語に置き換わらない理由の一つなのかもなと思った 今後も「選択と集中」続けるどころか懸賞金型推進するようだから商用に金払うのも辛くなるとこも出てきそうね 数が増えてることと数が少ないこととは違う これ混同する人は結構多い 自分は今の部署にいる間だけは統計解析するけど異動したらもう解析なんてしないからRのモチベは低いな 人事の巡り合わせでいつかまた今の部署に戻るかもしれないけど 前回のおーまんちょーでは一部のコードで途中から行番号が表示されるようになっていた。 多分、JSFiddleのエディターで`tidy`というボタンを押してしまったからだと思う。 実は、`prettydoc::html_pretty`で行番号が表示されないのを直したいと思っていた。 しかし、どこから手を付けたら良いかわからなかった。それが、ハプニングのおかげで 手の入れ場所がわかった。多分、HTMLとしては不整合な状況になっているが、 意図した通りに表示されるようになった。 [ありがとう、おーまんちょー](https://jsfiddle.net/105nohbq/show ) group_by()はmap()と組み合わせて使えないんだね 一般的な意味では、そんなことないと思うよ。 状況によってはgroup_byとmapを組み合わせると上手く行くことがあると思う。 ぐるぐる図のくだりでグダグダなところがあったので、 [修正した](https://jsfiddle.net/6z7u3d09/show )。 アップした後にタイポを見つけたが、覆水盆に返らず。 多変数の時系列データをクラスタリングするpackageをご存知であれば教えていただけますか…? 知らない。 人がいれば、意味のない返事はしない方が良いかもしれないが、過疎だからね。 あなたは地球上で何日過ごしてますか? という問いに答えるRのスクリプト 干支と誕生日(月日)から今日が生まれて何日めか計算 eto=("ひつじ") tag="10-17" Eto=c("子(ね=ねずみ)","丑(うし)","寅(とら)","卯(う=うさぎ)","辰(たつ=龍(りゅう))","巳(み=へび)","午(うま)","未(ひつじ)","申(さる)","酉(とり=にわとり)","戌(いぬ)","亥(い=いのしし)") # Eto i=grep(eto,Eto) this_year=as.numeric(strsplit(as.character(Sys.Date()),'-')[[1]][1]) j=this_year%%12 - 3 age=12*(0:9) + j-i age=age[18<=age][1:5] age AD=paste0(this_year-age,"-",tag) days=\(x) as.numeric(Sys.Date() - as.Date(x)) rbind(age,days=sapply(AD,days)) あってますか? マジで聞いているんなら、テストツールの使い方を覚えた方が建設的だと思う。 個人的には、Haskellからの流れで [quickcheck](https://github.com/RevolutionAnalytics/quickcheck ) しか経験したことがないが、他にもあると思う。 コードが合っているかどうかわからないが、パット見問題なさそうに見える。 問題があったとしても、デバッグで十分対応できるように見える。 [リーナスの法則](https://en.wikipedia.org/wiki/Linus%27s_law ): あたなが十分な暇人ならばバグはいずれ塞がれる。 ChatGPTはなんていい奴なんだろう。 クソ野郎: I'd like to test the following code: ``` r 拝借 ``` * The code is written in the programming language R. * "子", "丑", ..., are the Chinese / Japanese zodiac called Eto in Japanese. This code have to calculate the age for given birth date in Eto, e.g. `eto = "ひつじ", tag = date = "10-17"`. Are there any advice to test this code? ChatGPT: Certainly! To test the provided R code, you can follow these steps: 1. Understand the Code: * Make sure you understand the logic of the code and how it calculates age based on the Eto and birthdate information. 1. Run the Code: * Copy and paste the code into an R script or R console. * Ensure that there are no syntax errors or issues when running the code. 1. Test Cases: * Define several test cases with different combinations of Eto, birthdate (tag), and current date. * For example, you can use different values for eto and tag, and verify the calculated age against your expectations. 1. Expected Results: * Manually calculate the expected age for each test case based on the provided Eto information and current date. * Compare the manually calculated age with the age calculated by the R code. 1. Edge Cases: * Test the code with edge cases, such as birthdates close to the boundary of age ranges, to ensure the code handles them correctly. 出禁になった。書けるかな? てなわけで、ちゃっとじーぴーてーの残りの部分は割愛する。 意地悪クソ野郎と親切じーぴーてーにも共通することろがあって、 最後の締めはやっぱりリーナスの法則になる。言い方が全然違うけど。 親切じーぴーてーが例に挙げたテストコードがテストの基本形になると思う。 くいっくちぇっくのようなテストツールでは、テストケースをランダムに発生させるが、 そうしたテストツールが使えない場合も多々ある。テストツールが使えない場合は、 親切じーぴーてーが示したようなベタな方法で行くしかない。 >>566 書き込めるかどうか判らぬままに 黙々とその低能感溢れる文章を書いている姿を想像すると泣けてくる 書き込めてよかったな 親切じーぴーてーとの会話を見返すと、関数を細分化して、(ナウ、干支、月日) という三つ組を引数とする関数を作るのもありかな?という気がしてきた。 このように関数を細分化すると、テストケースが作りやすくなる。 クラスタリングとか次元削減に関する教科書的な本ってありますか? かけるかな 統計の人でも機械学習の人でもないので、返事を書くのは心苦しいものがあるが、 過疎なのでしょうがない。統計処理と機械学習の区別がつかないぐらいの素人だよ。 ありきたりだけど: * [朱鷺の杜Wiki](http://ibisforest.org/index.php?FrontPage ) グーグルとアヒルで検索してみたけど、この検索については英語の方が情報が取りやすいと思った。 英語でも日本語でも本屋の広告が多くなるが、英語の方が俺が推薦図書はこれだ! みたいなのが多いような気がした。検索で見つけた本だけど非売品と商品の両方がある。 * [Modern Dimension Reduction](https://arxiv.org/abs/2103.06885 ) * [Modern Dimension Reduction](https://www.cambridge.org/core/elements/abs/modern-dimension-reduction/D1506D1D7D51CC4EF375E4633D54F377 ) このようなケースでは立ち読みしてから買うこともできる。時々、非売品と商品の 両方が用意されていることがあるので、注意した方が良いかもしれない。 殊、次元削減で言えば、線形代数みないなもので、ありとあらゆる場所で使われるので、 俺の次元削減にジャストフィットするものを探すのは難しいかもしれない。 ちなみに、専門的には、学校の教室で研究会を開くのが統計で、リゾート地で 国際会議を開くのが機械学習らしい。 read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる