統計解析R たぶんpart3くらい

2012/06/22(金) 13:33:12.40
あっても良さそうなんですが,需要ないの?

過去スレのうちのひとつ
統計解析R
http://toro.2ch.net/test/read.cgi/tech/1285597198/
393デフォルトの名無しさん
垢版 |
2021/06/20(日) 18:54:38.51ID:dkTIMvj9
前説が長いので最初に結論:
>353は真似しないで欲しい。
[IHaskell](https://github.com/gibiansky/IHaskell)でコードを書く。
``` haskell
import GHC.Exts (groupWith)
分割 = groupWith length
仕事 (a : as) = (length a, length as + 1)
集計 = foldl push mempty where push out a = out ++ pure a
個々 = map
物件 = words "Lorem ipsum dolor sit amet, consectetur adipiscing elit"
比較 前処理 後処理 = lhs == rhs where
lhs = 後処理 $ 集計 . 個々 仕事 . 分割 <$> 前処理 物件
rhs = 後処理 $ 集計 <$> 個々 仕事 <$> 分割 <$> 前処理 物件
--
比較 Identity runIdentity
比較 (\a -> [a, a ++ a]) (flip (>>=) id)
比較 (\a j -> [a !! k | k <- j]) (flip id [1, 3, 5])
```
[関手](https://en.wikipedia.org/wiki/Functor)と呼ばれるデザインパターンを
使っている。このパターンをRに翻訳する。
``` {r self, dependson = ""}
self = with (new.env (), { id = \(a) a;
hom_snd = \(bc) \(ab) \(a) bc (ab (a)); flip = \(abc) \(b) \(a) abc (a) (b);
const = \(a) \(b) a; r_curry_fw = \(abc) \(a) \(b) abc (a, b);
r_curry_bw = \(abc) \(a, b) abc (a) (b); `%.%` = r_curry_bw (hom_snd);
as.list (rlang::current_env ());
});
```
つづく
394デフォルトの名無しさん
垢版 |
2021/06/20(日) 18:56:30.60ID:dkTIMvj9
例題を次の記事から拝借する。[fmap]{#fmap}
* [Split-Apply-Combine and Map-Reduce in R](https://burtmonroe.github.io/SoDA501/Materials/SplitApplyCombine_R/)
``` {r fmap, dependson = "self"}
self = with (self, {
分割 = \(x) x |> split (~ cyl);
仕事 = \(x) coef (lm (mpg ~ wt, x));
集計 = \(x) purrr::map_dbl (x, \(x) x ["wt"]);
個々 = \(f) \(x) purrr::map (x, f);
物件 = mtcars;
比較 = \(管, 前処理, 後処理) with (list (`%管%` = 管), {
lhs = 前処理 (物件) %管% (集計 %.% 個々 (仕事) %.% 分割) |> 後処理 ();
rhs = 前処理 (物件) %管% 分割 %管% 個々 (仕事) %管% 集計 |> 後処理 ();
testthat::test_that ("", testthat::expect_equal (lhs, rhs));
# lookme
a = 前処理 (物件);
b = 管 (a, 分割);
c = 管 (b, 個々 (仕事));
d = 管 (c, 集計);
rhs = 後処理 (d);
testthat::test_that ("", testthat::expect_equal (lhs, rhs));
});

比較 (r_curry_bw (flip (id)), \(x) rbind (head (x), tail (x)), id);
比較 (purrr::map, \(x) list (head (x), tail (x)), id);
比較 (r_curry_bw (flip (hom_snd)), \(x) \(y) rbind (head (x), y), \(x) x (tail (物件)));

as.list (rlang::current_env ());
});
```
つづく
395デフォルトの名無しさん
垢版 |
2021/06/20(日) 18:58:13.34ID:dkTIMvj9
1つめの"比較"は表を面倒くさい方法で`lm`している。2つめの"比較"は
表の代わりに表のリストを渡している。この場合の"%管%"が前回の投稿の
`%pipe%`に相当する。3つめの"比較"は表の代わりに表への写像を渡している。
このように関手パターンを使うと、引数が様々な"形状"に変化する。

本題に入る。以前、次のようなコードを書いた。[boxplot]{#boxplot}
``` {r, dependson = ""}
none = with (new.env (), {
. = ggplot2::ggplot (mtcars);
. = . + ggplot2::aes (x = factor (cyl), y = wt);
. = . + ggplot2::geom_boxplot ();
print (.);
});
```
`.`が定数である限り問題はないが、途中一箇所でも`. `が関数になると、
無限ループする。[fmap](#fmap)で`lookme`以下の変数`a..d`を全て`a`にすると、
三番目の"比較"で無限ループする。厄介なことに、全て`a`にしても、
一番目と二番目の"比較"は普通に動作する。関数内の変数は検索経路が
異なることに起因する。

単純化すると、次のコードは動くが、
``` {r, dependson = ""}
tryCatch ({
a = 1;
a = 2 + a;
a;
}, error = identity) |> print ();
```
つづく
396デフォルトの名無しさん
垢版 |
2021/06/20(日) 19:00:12.82ID:dkTIMvj9
次のコードは無限ループする。
``` {r, dependson = ""}
tryCatch ({
a = 1;
a = \(.) . + a;
a (2);
}, error = identity) |> print ();
```
PythonとJSも似たような挙動をするので、現在主流のインタープリターでは
[boxplot](#boxplot)のような横着コードはご法度かもしれない。

おしまい
2021/06/24(木) 19:35:28.50ID:zSqJWO4e
最新のggsaveはデフォルトがragg出力になってかなりきれいになってた
いい感じ

同じ条件で比較
https://i.imgur.com/5UOzASY.png
https://i.imgur.com/sFisKxS.png
398デフォルトの名無しさん
垢版 |
2021/06/26(土) 13:40:20.41ID:oCVQCLW/
特典がいろいろありそう。
* [Modern Text Features in R](https://www.tidyverse.org/blog/2021/02/modern-text-features/)

話変わって>384の続き まずコードを並べる。

``` {r dict, dependson = "round_py"}
dict = with (new.env (), {
who_max_h = \(h) \(x) {
x = x - max (x);
x = exp (x / h);
x / sum (x);
};
who_min_h = \(h) \(x) who_max_h (h) (- x);
ge_h = \(h) \(x) 0.5 * (1 + tanh (0.5 * x / h));
le_h = \(h) \(x) ge_h (h) (- x);
as.list (rlang::current_env ());
});
```
つづく
399デフォルトの名無しさん
垢版 |
2021/06/26(土) 13:41:22.67ID:oCVQCLW/
``` {r round_r, dependson = "dict"}
dict = with (dict, {
round_theta = \(h) \(x) {
reticulate::py $ round_theta (reticulate::np_array (x), h);
};
round_1nn = \(h, n) {
self = (- n) : n;
\(x) purrr::map_dbl (x, \(x) {
x = self - x;
p = who_min_h (h) (0.5 * x * x);
sum (self * p);
});
};
round_count = \(h, n) {
self = 1 : n - 0.5;
\(x) purrr::map_dbl (x, \(x) {
sum (ge_h (h) (x - self) - ge_h (h) (- x - self));
});
};
as.list (rlang::current_env ());
});
```
つづく
400デフォルトの名無しさん
垢版 |
2021/06/26(土) 13:41:58.53ID:oCVQCLW/
``` {r round_anime, dependson = "round_r", animation.hook = 'gifski', fig.width = 4 * 3}
dict = with (dict, {
x_max = 3;
x = x_max * seq (- 1, 1, len = 1e+2);
x_huge = x_max * seq (- 1, 1, len = 1e+3);
h = 10 ^ c (- 8, - 6, - 4, (- 3) : 3);
old_par = par (mfrow = c (1, 3));
on.exit (par (old_par));
purrr::map (h, \(h) {
if (h < 1) {
x = x_huge;
}
title = sprintf ('h = %.1e', h);
draw = \(y, ylab, ...) {
plot (x, y, type = 'l', ylim = c (- x_max, x_max), xlab = 'x', ylab = ylab, main = title, ...);
};
draw (round_theta (h) (x), 'theta');
draw (round_1nn (h, x_max) (x), 'deep');
draw (round_count (h, x_max) (x), 'shallow');
});
as.list (rlang::current_env ());
});
```
つづく
401デフォルトの名無しさん
垢版 |
2021/06/27(日) 21:55:25.14ID:a078pUkp
書けるかな? 次の関数から始める。
~~~ {.r}
nearest_neighbor_integer = \(n) {
self = (- n) : n;
\(x) purrr::map_dbl (x, \(x) {
x = self - x;
j = which.min (0.5 * x * x);
self [j];
});
};
~~~
実数`x`に最も近い`(-n):n`中の整数を選んでいる。この関数の`which.min`
のところを`(- n):n`上の確率分布に変更したものを`round_1nn (h, n) (x)`
としている。`n`無限大の極限をとると、
[ヤコビのテータ関数](https://en.wikipedia.org/wiki/Theta_function)
で書けて`round_theta (x, h)`になる。ヤコビの三重積を有限和で近似して
`round_count (h, n) (x)`を得る。`n`を"容量"、`h`を"温度"と書く。

`ge_h (h) (x)`は低温極限でデジタル的な関数`ifelse (x >= 0, 1, 0)`になり、
`round_count`の低温極限は、容量が十分大きければ、ゼロと`x`の間にある
半整数`n + 1 / 2`の数を数える関数になる。
[1-nn](https://en.wikipedia.org/wiki/K-nearest_neighbors_algorithm)
で解いていた問題`round_1nn`が、ヤコビの三重積を通して、数え上げの問題
`round_count`に転化した形になっている。

アニメを見ると、低温では全部同じ感じだが、高温で`round_theta`とその他に
違いが出てくる。対称性`round_theta (x + k, h) == round_theta (x, h) + k`
にガードされて、`round_theta`だけは、高温極限でもゼロへの定数写像に
ならない。他の2つは、容量を有限で近似しているために、この周期性が
成り立たない。

つづく
2021/07/03(土) 00:33:16.13ID:gqk6Zgdk
四捨五入や浮動小数点の話を蒸し返す感じになるけど…

1.275-1と0.275を第二位でround()してみる
前者は0.27で後者は0.28になる
x1 <- c(1.275-1, 0.275)
round(x1, 2)
[1] 0.27 0.28

sprintf()で眺めてみるとなんとなく理由がわかる気がする
sprintf("%.24f", x1)
[1] "0.274999999999999911182158" "0.275000000000000022204460"


0.265でも試してみると両者とも0.26になる
x2 <- c(1.265-1, 0.265)
round(x2, 2)
[1] 0.26 0.26

sprintf()で眺めてみると…
sprintf("%.24f", x2)
[1] "0.264999999999999902300374" "0.265000000000000013322676"

偶数丸めで切り下げになるケースだけ誤差の範囲が広いのかな??
403デフォルトの名無しさん
垢版 |
2021/07/04(日) 14:19:14.50ID:HlOj3EiR
書けるかな?書けたら話をぶった切ってごめん。who_max_hとge_hは個別に
覚えるより、次の関数から芋づる式に覚えた方が安上がりかもしれない。
ニョロニョロニョロ ドット ハスケル
max_h h a b = h * log (exp (a / h) + exp (b / h))
min_h h a b = - max_h h (- a) (- b)
ニョロニョロニョロ
max_hの低温極限はRのpmaxになる。関数
reduce_max (h, x) := reduce (.init = - Inf, .x = x, .f = max_h)は
log_sum_expと呼ばれ、低温極限がRのmaxになる。reduce (0, x, +)にsumを
使うのと同じで、"モノイドはreduceしとけ"パターンの1つになっている。
reduce_max (h, x)をxについて微分すると、soft_maxになり、低温極限がRの
which.maxをワンホットで表したものになる。コードではsoft_maxをwho_max_h
と書いている。関数max_zero (h, x) := max_h (h, x, 0)の低温極限はreluの
有限温度版にあたるsoft_plusと呼ばれる。max_zero (h, x)をxについて微分
すると、シグモイド関数になる。コードではシグモイド関数をge_hと書いている。
ge_h (h, x)をxについて微分すると、Rのdlogisになる。どの関数も低温極限で
デジタル的な関数になり、アルゴリズム的な描像を与える。
温度hをプランク定数だと思うと、マスロフの脱量子化という言い方も理解できる。
シグモイド関数はフェルミ分布関数とも呼ばれるが、対となるボース分布関数は
zero_maxの逆写像を微分して得られる。ボース分布関数を使っても、
ヤコビの三重積経由で、また別の低温極限が四捨五入になる関数が作れる。
reduce_maxの連続版はlog_integral_expとなるが、reduce_minの連続版は
ラプラス近似と呼ばれる。ラプラス近似の補正第一項を正規分布にとることが
多いので、max_zeroが正規分布に対応すると見ることもできる。また、
max_zero (h, reduce_max (h, x))をxについてルジャンドル変換すると、
soft_maxの負のエントロピーになる。

おしまい
2021/07/04(日) 15:45:28.20ID:17wSvTes
どうせ過疎だから話をぶった切るなんて気にせず好きに書き込んでいいと思うよ
405デフォルトの名無しさん
垢版 |
2021/07/04(日) 22:15:36.27ID:HlOj3EiR
[どんな短所にも長所がある](https://en.wikipedia.org/wiki/Cruijffiaans)
例の1つかもね。
2021/07/05(月) 18:25:33.98ID:ZKGJ/Wxf
最近知ったpurrrとpatchworkの組み合わせは役に立たないけど面白いと思った

library(patchwork)
library(tidyverse)

iris %>%
nest_by(Species) %>%
mutate(plot = list(ggplot(data, aes(Sepal.Length, Petal.Length)) + geom_point() + ggtitle(Species))) %>%
pull(plot) %>%
reduce(`+`)

https://i.imgur.com/Qet93Lj.png
407デフォルトの名無しさん
垢版 |
2021/07/10(土) 20:16:42.51ID:MrP/qszp
ルジャンドル変換を一般化した凸共役についてまとまった表がある。

* [凸共役](https://en.wikipedia.org/wiki/Convex_conjugate)

この記事中の表の下二行と次の記事を照らし合わせてみる。

1. [Softmax Cross-Entropy and Negative Sampling](https://arxiv.org/abs/2106.07250)
2. [Noise Contrastive Estimation](https://arxiv.org/abs/1202.3727)

| 凸 | 凸共役 | Bregman情報量 |
|:--|:--|:--|
| ln (1 + e^x) | x^* ln x^* + (1 - x^*) ln (1 - x^*) | KL情報量 |
| - ln (1 - e^x) | ln p (x^*) + x^* ln (1 - p (x^*)) | NCE |

p (x) := 1 / (1 + x)

前に書いた四捨五入と対比すると、KLの方がフェルミ分布関数、NCEの方が
ボーズ分布関数に対応する。四捨五入の場合はフェルミ分布関数とボーズ分布関数
の裏にテータ関数がいた。KLとNCEの裏にも何かいるかな?
論文をちゃんと読めば答えもしくはヒントがあるかもしれない。

JIS丸めの話がどうしてこうなった?JIS丸め恐るべし。
2021/07/11(日) 09:10:03.37ID:XVisAPLs
JIS丸めや四捨五入については皮肉なことにExcelのほうがずっと信用できたりする
良くも悪くもうまいこと誤差処理してくれてる
402の数値をExcelで四捨五入するとすべて期待どおりの結果が得られる
2021/07/11(日) 09:57:15.88ID:7245Xdb7
で、Excelはどういう処理してるの?
2021/07/11(日) 15:54:55.28ID:bUjii7MO
知りたきゃ自分で調べろよ
2021/07/20(火) 19:29:44.08ID:rbQqbOPX
ggrepelってのいいね
凡例と見比べなくてすむ図が作れる
これならカテゴリ多くて色が飽和する場合でも対処できそう

極端な例
https://i.imgur.com/3aKWSES.png
412デフォルトの名無しさん
垢版 |
2021/08/08(日) 09:20:58.98ID:0/5jqUiQ
readr2.0.0から複数ファイルの読み込みが可能になっていた
map_dfr()使わなくていいし読み込みも圧倒的に速くて良い
2021/08/08(日) 12:25:05.96ID:67RjEJ28
readr 2.0.0のwrite系関数は、カラム名に日本語があると正しく処理されないバグがないか?
414デフォルトの名無しさん
垢版 |
2021/08/09(月) 17:11:15.46ID:ScMN2hA5
write_csv試したけど列名に日本語あっても問題なかった
でもデータも日本語にしたらたしかに化けた
ちなWindows
2021/08/09(月) 19:25:00.36ID:78aLRiJY
すべての言語は、Linux 用

例外は、Windows, Android, iOS 用の言語だけ
2021/08/09(月) 23:00:48.70ID:azeQoSgE
>>414
追確認ありがとう。やっぱり化けるか。

カラム名の出力抑止したら日本語含むデータは無事に出力されたので、当面、これで逃げとく。
417デフォルトの名無しさん
垢版 |
2021/08/10(火) 19:09:10.38ID:gvV+H24C
>>416
write_csvのヘルプ見たらutf8で保存されるとあったからこれが理由ぽい
データと列名の両方をutf8にしたら化けずに出力できた

具体的には以下を噛ませた
#データ変換
    %>% mutate(across(where(is.character), enc2utf8)) %>%
#列名変換
     %>% rename_with(enc2utf8) %>%
2021/08/28(土) 10:48:33.69ID:C1PCSCJR
RStudioチートシート一式が更新されてる
dplyrなんかは構文が少し違ってきてたからありがたい
2021/09/01(水) 11:39:20.62ID:tJCXmvec
>>413 自己レス
readr 2.0.1にアップデートしたら>>417の変換を行わないでもヘッダー、データに日本語を含む場合でも意図した通りに出力されるようになった。
2021/09/02(木) 18:05:05.53ID:YRbuJpNa
>>419
これ見て自分も2.0.1にした
確かに問題なくなった
報告ありがとう
2021/10/01(金) 16:50:28.77ID:zXL6XNPn
間違って機械学習スレに書き込んでしまったので、こちらに再書き込み。

Rmdファイル名に日本語が入っているとRStudioでread系の出力が表示されなくなるという謎のトラップに嵌った。
2021/10/01(金) 23:25:13.49ID:uStRU2+C
read系の出力ってどういうこと?
2021/10/03(日) 00:12:40.33ID:TxMIGVRv
read.csv関数、readr::read_csv関数、readxl::read_excel関数などを端折ってread系と書いてしまった。
動くんだけどエラーも何も表示されないという現象だった。
2021/10/03(日) 22:36:37.13ID:A1Dyon2q
適当に日本語のrmdからread_csv試してみたけど動作もメッセージも特に問題ないみたい
自分が条件を勘違いしてるだけかもだけど
2021/11/21(日) 09:23:02.27ID:fh+D1s+K
readrの2.1.0が来てた
デフォルトで遅延読込するのが評判悪くて戻したらしい
426デフォルトの名無しさん
垢版 |
2022/02/27(日) 21:39:32.73ID:9Ko2k5KG
Rstudioで100個のtxtファイル
(中身はTsvで3万行2列、1列目は全ファイル共通)
を3万行、101列のマトリクスファイルにしようとしています。

left_joinで1列目をキーにして結合するためにデータを100個読み込む際に
lf <- list.files(full.names = T)
data <- lapply(lf,read.delim)
を用いたのですが、
mat <- full_join(data)で結合させようとすると
'full_join' をクラス "list" のオブジェクトに適用できるようなメソッドがありません
となってしまいました。
別の関数でこのような結合が可能でしょうか。
427デフォルトの名無しさん
垢版 |
2022/02/27(日) 21:47:12.25ID:9Ko2k5KG
>>426
dplyr::bind_cols()
があるとわかり(rowsしか見つけられていませんでした)、
こちらでdata2<-dplyr::bind_cols(data[1],data[2])
でエラーが出ないことまで分かったのですが、
今度は 1列目が全残りしてしまいました。。。
2022/02/27(日) 22:16:06.74ID:gyXBEzmR
>>426
詳細はわかりませんがとりあえず読み込みの部分を以下にすれば結合されたdata.frame(tibble)ができると思います
data <- readr::read_tsv(lf)
2022/02/27(日) 22:19:10.43ID:gyXBEzmR
あ、ごめんなさい
勘違いしてたのでいったん428は無視してください
2022/02/27(日) 22:24:12.67ID:gyXBEzmR
bind_colの代わりにdplyr::left_join()で結合してください
2022/02/27(日) 22:52:32.27ID:CQidPupJ
>>426
確認だけど各ファイルの一列目は言わるインデックスで、どのファイルも全く同じ値で全く同じ並びなの?
例えば、1,2,3,...30,000のような。
432デフォルトの名無しさん
垢版 |
2022/03/13(日) 15:26:37.06ID:eNLgiL5g
>>430
コメントいただきありがとうございます。

data2<-dplyr::left_join(data[1],data[2])
UseMethod("left_join") でエラー:
'left_join' をクラス "list" のオブジェクトに適用できるようなメソッドがありません
となってしまいました。

>>431
そのご認識であっています
433デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:14:58.16ID:yMboFGZP
>>432
1列目がすべて同じ値でデータを結合させるキーとして使う必要がなければ、こんな感じ。
最後に1列目をバインドかジョインさせれば、概ね目的が達成できるのではないかと。

require(tidyverse)

# サンプルデータの作成
for (i in 1:10) {
data.frame(
a = seq(from = 1, to = 100),
b = rnorm(100)
) %>%
readr::write_excel_csv(file = paste0("./sample_data/sample_", i, ".csv"))
}

# サンプルデータの結合
list.files("./sample_data", full.names = TRUE) %>%
purrr::map_dfc(.f = function(x){readr::read_csv(x) %>% dplyr::select(2)})

列名でデータが識別出来るようにしたければ、もうひと工夫必要だけど。
434デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:23:27.75ID:yMboFGZP
ファイル名を列の識別に使うとこんな感じ

# サンプルデータの読み込みと結合
list.files("./sample_data", full.names = TRUE) %>%
purrr::map_df(.f = function(x){readr::read_csv(x) %>%
dplyr::mutate(file = basename(x))}) %>%
tidyr::pivot_wider(names_from = file, values_from = b)
435デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:44:17.21ID:eNLgiL5g
>>433
おお!ありがとうございます。
解釈しながら進めてみます。
436デフォルトの名無しさん
垢版 |
2022/03/13(日) 16:44:28.45ID:yMboFGZP
>>434の方は、1列目をキーにleft_joinするのと同じ結果になるので、こちらの方が処理としては汎用性が高いかも。

# サンプルデータの作成
for (i in 0:4) {
data.frame(
a = seq(from = 1, to = 100),
b = rnorm(100)
) %>%
readr::write_excel_csv(file = paste0("./sample_data/sample_", i, ".csv"))
}

# サンプルデータの作成(aの値の範囲を少し変えてある)
for (i in 5:9) {
data.frame(
a = seq(from = 51, to = 150),
b = rnorm(100)
) %>%
readr::write_excel_csv(file = paste0("./sample_data/sample_", i, ".csv"))
}

# サンプルデータの読み込みと結合(aが一致しない場合は欠損値NAとなる)
list.files("./sample_data", full.names = TRUE) %>%
purrr::map_df(.f = function(x){readr::read_csv(x) %>%
dplyr::mutate(file = basename(x))}) %>%
tidyr::pivot_wider(names_from = file, values_from = b)
2022/03/13(日) 18:12:08.92ID:Hs1I9giv
>>427
一列目がすべて同じとのことなのであれば、427の続きで
 data2[ , -seq(3,199,2)]
とすれば必要な列だけ抽出できると思います
あとはマトリクスに変換してください


join系でうまく行ってなかったのはリストの扱いがわからなかったからなのですね
リストにアクセスする場合、
data[1]でなくdata[[1]]としてデータフレームを取り出します
438デフォルトの名無しさん
垢版 |
2022/03/17(木) 15:47:55.89ID:E8UbWdL+
>>437
すみません。本題ではないと思うのですが、
> for (i in 1:10) {
+ data.frame(
+ a = seq(from = 1, to = 100),
+ b = rnorm(100)
+ ) %>%
+ readr::write_excel_csv(file = paste0("./sample_data/sample_", i, ".csv"))

のところで
エラー: Cannot open file for writing:* './sample_data/sample_1.csv'

が出てしまいました・・・
2022/03/17(木) 20:03:45.16ID:gf49ge7R
>>438
先にディレクトリ(フォルダ)作らないとだめよ。
2022/03/17(木) 20:07:17.36ID:gf49ge7R
なお、そのコードはサンプル用のデータファイルを作るだけだから、既にデータファイルがあるなら作らなくても構いません。
2022/03/18(金) 00:14:42.67ID:XJUTI8hL
>>438
繰り返しになりますが、427にあるようにbind_cols(data)でdata2まで作成できたのであれば、あとは437の式で重複するindex列を消せば抽出が完了します
マトリクス形式にするにはas.matrix()を使います


エラーが出たという433のコードについては439さんがもう回答してくれていますが念のため補足説明します
そのコードは作業ディレクトリにsample_dataという名前のフォルダを作ってから試す必要があります
Windowsならエクスプローラからフォルダを作成すれば良いでしょう
Rでコードを実行するとそのフォルダの中にテスト用のcsvが作成されます(フォルダを覗いてみてください)
そのテスト用csvを使った汎用的な方法が色々と紹介されていますので、どういう挙動をするか試してみてください
あとは自分の実データに応用すればOKです
2022/04/24(日) 00:44:11.04ID:XE1mU1xb
cranにR 4.2.0がきてた
Windowsもutf8に
マルチバイトの苦労が減るかな
443デフォルトの名無しさん
垢版 |
2022/07/02(土) 21:56:48.95ID:joP41R1K
VScodeに移行するか悩んでいる
444デフォルトの名無しさん
垢版 |
2022/07/03(日) 10:10:53.08ID:HeQkxcLp
利点欠点は知らないけどとりあえず試しに移ってみては
445デフォルトの名無しさん
垢版 |
2022/08/07(日) 01:03:05.72ID:9gYsg8zx
Vscodeに移行完了。
他の言語と環境同じなのは楽。簡単に複数のプロセスを走らせることができて便利。
環境変数とかの設定は大変。
446デフォルトの名無しさん
垢版 |
2022/08/08(月) 21:50:31.99ID:Da5wHwf0
RStudioもPositだかに名称変更して多言語対応を前面に出すらしいから色々迷うところだね
447デフォルトの名無しさん
垢版 |
2022/08/16(火) 11:20:03.64ID:2x3mrzZQ
秋光
448デフォルトの名無しさん
垢版 |
2022/08/18(木) 23:20:26.19ID:LfSntVST
tidyverseにlubridateが追加されたらしい
これは便利かも
449デフォルトの名無しさん
垢版 |
2022/10/22(土) 22:36:46.32ID:aNbd4mog
書けるかな?
450デフォルトの名無しさん
垢版 |
2022/10/22(土) 23:25:40.91ID:aNbd4mog
ALTREPを勉強したノート:
https://www.klgrth.io/paste/n3aj8
有効期限の選択肢が最長2日で、2日経つと消えちゃう。
一応HTMLということでアップしたが、HTMLとして表示できない。
ダウンロードしてブラウザーで開くと、多分、表示できると思う。
中身はRというより、殆どC++とJSで、偶に日本語が入るという感じになっている。
451デフォルトの名無しさん
垢版 |
2022/10/25(火) 21:49:06.83ID:Q2z+UpND
facet_wrapで強制的に任意の行×列にする方法がわからない
ggh4xのfacet_wrap2はx軸が別の値に変わる致命的なバグがあって駄目だった
cowplotとかで強引にやるしかないかな
452デフォルトの名無しさん
垢版 |
2022/10/29(土) 23:39:26.00ID:rG09h/C5
こういう事?
[r - What's the difference between facet_wrap() and facet_grid() in ggplot2? - Stack Overflow](https://stackoverflow.com/questions/20457905/whats-the-difference-between-facet-wrap-and-facet-grid-in-ggplot2)

```{r}
g <- ggplot2::ggplot (ggplot2::mpg, ggplot2::aes (displ, hwy))
g + ggplot2::facet_grid (cyl ~ class)
g + ggplot2::facet_wrap (cyl ~ class)
```

前回のALTREPから離れて配列型のイテレーターに進んでみた。
https://www.klgrth.io/paste/wcdat
今回のファイル形式はRmdにしてみた。
Rcppが使える環境なら動作するんじゃないかと思う
453デフォルトの名無しさん
垢版 |
2022/10/31(月) 12:33:41.51ID:dQiGvC9o
例えばmpgデータならcylでもclassでも常に3*3のサイズにfacetしたい(不足分はスペース)
454デフォルトの名無しさん
垢版 |
2022/11/02(水) 19:51:09.19ID:p084R0I6
結局patchworkのplot_layout()が良かった
facet_wrap2()よりかなりめんどくさいが仕方ない
455デフォルトの名無しさん
垢版 |
2022/11/06(日) 00:02:51.66ID:lzqAKK7B
RのヒープからC++のコンテナーで使うメモリを確保するようにした:
https://www.klgrth.io/paste/ampar
今回はサードパーティのライブラリを使っているので、そのままでは
コンパイルできないと思う。

* [GitHub - martinus/unordered_dense: A fast & densely stored hashmap and hashset based on robin-hood backward shift deletion](https://github.com/martinus/unordered_dense)

ヘッダーファイル一枚のライブラリなので、Rmdの中にヘッダーファイルを
コピペすればコンパイルできるようになると思う。
456デフォルトの名無しさん
垢版 |
2022/11/07(月) 09:11:56.91ID:dlXH2Z0U
色々とRの深堀りしてるのね
457デフォルトの名無しさん
垢版 |
2022/11/23(水) 17:00:11.90ID:lyqj2jDo
前回のカウンターの続きで最終回
[zwzg9](https://www.klgrth.io/paste/zwzg9)
今回は`ankerl`に加えて`boost`も使っている。`boost`はヘッダー一枚
というわけにはいかないので、面倒かもしれない。使っているのは、
`hash_value`と`hash_combine`という2つの関数だけなので、適当な関数で
差し替えられると思う。`NA`と`NaN`の関係を調べている節は、
intelエンディアンのみの対応で、armエンディアンでは動作しないと思う。
実を言うと、`NaN`がいっぱいあることを知らなかった。1954は何の年だろう?

ALTREPを勉強した時にかなりギットハブを徘徊した。そこが勉強のピークだっと
思う。今回の実装では、殆どRの勉強はせずに、知ってる関数だけを使っている。

1. `TYPEOF / ALTREP`
1. `Rf_xlength`
1. `DATAPTR_OR_NULL / DATAPTR / XXX_ELT`
1. `Rf_allocVector`

違うアプリケーション、例えば、評価系だと違う関数セットになって、
また勉強が必要になるかもね。
458デフォルトの名無しさん
垢版 |
2022/11/25(金) 22:31:31.64ID:hVmxUGt9
ファセットの問題は{facetious}のfacet_wrap_strict()でもできた
こっちは問題なさそう
459デフォルトの名無しさん
垢版 |
2022/11/26(土) 18:24:12.54ID:ZkJ8SBS0
[facet_wrap_strict](https://github.com/coolbutuseless/facetious)と
`facet_wrap`を並べてみる。

``` {r na_1954, dependson = ""}
. = dplyr::mutate (mtcars, cyl = factor (cyl, lev = c (1 : 8, 1000L)))
. = ggplot2::ggplot (., ggplot2::aes (mpg, wt))
. = . + ggplot2::geom_point ()
. + ggplot2::facet_wrap (~ cyl, nrow = 3, ncol = 3)
. + facetious::facet_wrap_strict (~ cyl, nrow = 3, ncol = 3)
. + ggplot2::facet_wrap (~ cyl, nrow = 3, ncol = 3, drop = F)
```

神エクセル繋がりということで
[A Bayesian probability worksheet](https://terrytao.wordpress.com/2022/10/07/a-bayesian-probability-worksheet/)
460デフォルトの名無しさん
垢版 |
2022/11/28(月) 18:09:29.71ID:esP8vKsO
その例で行くなら…
cylはいじらずそのままでfacet_wrap_strictするのが求める図かな
461デフォルトの名無しさん
垢版 |
2023/01/19(木) 11:03:41.55ID:KKbwsgWQ
RのS5クラス使って継承する場合、コンストラクタ中で継承するクラスのコンストラクタを呼ぶことはできないのかな?
つまりクラスAとクラスBを定義して、クラスBがクラスAを継承している場合、クラスBのコンストラクタ中でクラスAのコンストラクタを呼ぶ方法
ちょっとググったらS4クラスは出来そうなんだが、S5クラスのは解決策が見当たらんかった
別途自前でクラスAのコンストラクタ本体を定義して、クラスBのコンストラクタからそれを呼ぶしかないか?!
462デフォルトの名無しさん
垢版 |
2023/01/20(金) 19:06:37.10ID:tvsG8hGF
R6はどうだろう
463デフォルトの名無しさん
垢版 |
2023/02/04(土) 08:53:58.96ID:QWz+y8KS
dplyrを1.1.0にしてみた
.byはまあまあ便利だけどtally()には使えなかった
464デフォルトの名無しさん
垢版 |
2023/02/12(日) 21:15:52.26ID:dcVKzcVl
ナンノコッチャと思って調べたら
[A Heisenbug lurking in async Python | Hacker News](https://news.ycombinator.com/item?id=34754276)
専門用語だったでござる。
[Heisenbug - Wikipedia](https://en.wikipedia.org/wiki/Heisenbug)
465デフォルトの名無しさん
垢版 |
2023/02/14(火) 18:38:12.15ID:dFdG4M+K
ヒヤリハットみたいな駄洒落はどこでもあるのね
466デフォルトの名無しさん
垢版 |
2023/02/16(木) 19:25:35.83ID:76X7tEQ5
こうした言葉を思いつくのは才能なんだろうね。

Rだと簡単にハイゼンバグの例を作れた。

``` {r a_10850, dependson = ""}
uncertainly = with (new.env (), {
plus = \(x) \(y) x + y
x = 1L
plus_1 = plus (x)
x = 1000L
plus_1 (2) |> print ()
});
```
アレレ?ということでデバッグ文を入れてみる。

``` {r a_29042, dependson = ""}
principle = with (new.env (), {
plus_debug = \(x) {
cat ("Schr?dinger says ", x, "\n", sep = "")
\(y) x + y
}
x = 1L
plus_1 = plus_debug (x)
x = 1000L
plus_1 (2) |> print ()
});
```
デバッグ文の有無で挙動が変わる。`uncertainly`の挙動は、バグではなく、
言語仕様だと思った方が良いと思う。
`uncertainly`の挙動を防ぐには関数`force`を使えば良い。

* [How to not fall into R's 'lazy evaluation trap](https://stackoverflow.com/questions/29084193)
467デフォルトの名無しさん
垢版 |
2023/02/16(木) 19:27:35.51ID:76X7tEQ5
タイトルに"遅延評価"が入っているが、遅延評価自体の問題ではなく、
Rの実装に原因がある。Haskellも遅延評価だが、`uncertainly`のような
挙動が起きれば、Haskellはその存在意義を失う。

``` ghci
import Data.Functor.Identity (Identity (..))
:{
uncertainly :: (Monad f) => f Int
uncertainly = do
x <- pure 1
plus_1 <- pure (x +)
x <- pure 1000
pure $ plus_1 2
:}
runIdentity uncertainly
flip ($) () uncertainly
maybe 0 id uncertainly
```
<pre>
3
3
3
</pre>
言語仕様レベルでのトレードオフかもしれない。

* 局所最適化と大域最悪化
* 整合性とコンパイル時間
* 等など
468デフォルトの名無しさん
垢版 |
2023/02/19(日) 11:12:54.40ID:CwNaXfgw
magrittrの例を少し改変

# fns
first <- function(x){
message("first")
invisible(x)
}

second <- function(x){
message("second")
invisible(x)
}

# lazy
NULL %>% first() %>% second()

# eager
NULL %!>% first() %!>% second()
469デフォルトの名無しさん
垢版 |
2023/02/19(日) 23:57:13.24ID:5hVGJ6gZ
ビックリパイプは知らなかった。"抜かりなし"だね。ただし、ビックリパイプは
ハイゼンバグとは関係ないかな。

ハイゼンバグから離れて、宇宙大戦争について書いてみたい。
`lapply`等のループ系の関数は、最終的にC関数`R_forceAndCall`を呼び出す。

* [apply.c](https://github.com/wch/r-source/blob/trunk/src/main/apply.c)

Rは、"フォースと共にあらんことを"などと呑気なことを言っている場合ではなく、
フォースと共にあらねば死んでしまう。
前回のコード`uncertainly`は変数`x`の使い回しが敗因だが、ループ系の関数
では変数を使い回すしかない。そのために、ループ系の関数ではフォースが必須
になっている。98パーセントぐらいの使用例では、フォース抜きでも動作する
(当社調べ)が、残りの2パーセントでコケる。僅か2パーセントでも、
プログラミングをギャンブルにしないためには、穴を塞いでおく必要がある。
470デフォルトの名無しさん
垢版 |
2023/02/23(木) 21:58:25.40ID:OvjjRMrU
do.call()ならどうだろう
471デフォルトの名無しさん
垢版 |
2023/02/26(日) 00:14:58.50ID:Qcp1BikG
上のコード`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`で配列から
変換するのが一般的だと思う。
472デフォルトの名無しさん
垢版 |
2023/02/26(日) 23:03:36.96ID:Qcp1BikG
書けるかな?
473デフォルトの名無しさん
垢版 |
2023/02/26(日) 23:09:42.38ID:Qcp1BikG
自分の知る限り、プロミスの罠にハマるのは次のパターンに限られる。

~~~ {.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`の定義を探しに行くので、プロミスの罠にハマる。
474デフォルトの名無しさん
垢版 |
2023/02/26(日) 23:11:33.81ID:Qcp1BikG
コールバイニードを実現するためには、コンパイラーが内部的に次のように
書き換える必要があると思う。

``` {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を使う。
475デフォルトの名無しさん
垢版 |
2023/02/26(日) 23:12:32.78ID:Qcp1BikG
``` {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))
~~~
476デフォルトの名無しさん
垢版 |
2023/02/26(日) 23:25:12.65ID:Qcp1BikG
この書き換え規則を適用した結果、関数`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)の拡張と言って差し支えないと思う。

おしまい
477デフォルトの名無しさん
垢版 |
2023/03/01(水) 23:45:23.13ID:X+BX12eb
[トランスフォーマー](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)で説明、もしくは、
ホップ代数を使ってアテンション機構の類似物を導出するという話のようだ。
この手の救世主的な話はがっかりすることが多いので、過大な期待は禁物かも。
478デフォルトの名無しさん
垢版 |
2023/03/02(木) 07:01:07.09ID:FFiKbXDz
g = do.call(const, list(x)) ではどうだろう
2023/03/02(木) 07:26:39.75ID:rDVggB7z
RのS5クラス定義(setRefClass)ってsave、loadでシリアライズ、デシリアライズ出来ないのか
デシリアライズされたメンバ関数にアクセスできない
480デフォルトの名無しさん
垢版 |
2023/03/04(土) 20:31:08.80ID:0X36s/jF
## 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つを実装せえ"と言っている。
481デフォルトの名無しさん
垢版 |
2023/03/04(土) 20:34:04.91ID:0X36s/jF
似た内容を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>
482デフォルトの名無しさん
垢版 |
2023/03/04(土) 20:37:50.63ID:0X36s/jF
ワンセットの関数群をインターフェースと書く。

1. Pythonのクラスでは、
* 構造体の定義とインターフェースの定義と実装が同時に行われる。
1. HaskellのクラスやRのS3では、
* 構造体とインターフェースは別々に定義される。
* インターフェースの実装は既存の"構造体"に対して行われる。

HaskellやRの"構造体"には、通常の構造体に加えて、関数も含まれる。
構造体とインターフェースが別々に定義される点で、RのS3はHaskellのクラスに
近いように思う。

おしまい
483デフォルトの名無しさん
垢版 |
2023/03/26(日) 10:03:46.90ID:z5V/p30e
join_by()が便利で感動した
気象データのマージがすごくシンプルになった
484デフォルトの名無しさん
垢版 |
2023/03/26(日) 22:59:22.57ID:Dr7EPpsh
使用イメージがわかない。どのあたりが便利ですか?
485デフォルトの名無しさん
垢版 |
2023/03/27(月) 22:57:14.70ID:huaNY8vp
任意の地点・期間における測定値についての風向風速などの気象の影響をみるため近傍アメダスの気象データをマージする際に、便利になったと実感しました

具体的にはマージの際にbetween(時刻,)の条件が追加できるようになったのが大きいです

処理が重いかコードが長いかだった上のマージ処理が、join_by(地点名, between(time, start_time, end_time))で済むようになりました
486デフォルトの名無しさん
垢版 |
2023/03/30(木) 00:47:43.72ID:7ArmqfaI
[非等価ジョイン](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
#}
487デフォルトの名無しさん
垢版 |
2023/03/30(木) 00:49:00.50ID:7ArmqfaI
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`でかなりカバーしてるんじゃないかと思う。
ジョインの操作自体は明朗会計だが、実行時性能がボッタクリ価格に転嫁される
というプログラミング社会が抱える構造的な問題が反映されている。

おしまい
488デフォルトの名無しさん
垢版 |
2023/03/30(木) 18:24:14.72ID:Yqa5DxWU
一応Rスレだしコード一式を載せるならRにしてほしいな
489デフォルトの名無しさん
垢版 |
2023/03/31(金) 01:01:10.23ID:3FvfgxM7
正直、書き方を思い出すためだけに、話題にかこつけて、わざと異なる
プログラミング言語で書くこともある。しかし、今回は純粋に、処理の道筋を
単刀直入な形で表せるプログラミング言語を選択した。

[線形回帰](https://en.wikipedia.org/wiki/Linear_regression)を例にとる。
Rで線形回帰はとても書きやすい。しかし、線型回帰をRのイディオムとして
覚えるよりも、線形代数として覚えた方が長い目で見た時に利益になると思う。
同じように、等価ジョインは
[プルバック](https://en.wikipedia.org/wiki/Pullback_(category_theory)#Sets)
に対応する。等価ジョインを、Rのイディオムとして覚えるよりも、
単純な`for`ループの形で覚えた方が長い目で見た時に利益になると思う。
リスト内包記法は`for`ループを簡潔に書くための記法になっている。
490デフォルトの名無しさん
垢版 |
2023/04/15(土) 20:49:08.02ID:Mf5VNEJ8
プルバックの話の続きをアップした。

* [JSFiddle](https://jsfiddle.net/ytkhdpcq/show)

プルバックのカリー化の話になっている。プルバックの話はこれでお終い。
洗練された話は次の記事にある。

* [locally cartesian closed category in nLab](https://ncatlab.org/nlab/show/locally+cartesian+closed+category)

表計算の立場で見ると、"何が問題なのかわからない"問題かもしれない。
ある規則を満たす表でサマリーするとプルバックのカリー化になる。
491デフォルトの名無しさん
垢版 |
2023/04/24(月) 19:43:15.59ID:Jj998bTN
4.3.0入れてみた
パイプがまたひとつ便利になっていい感じ
Windowsでパスが長くても通るようになったのも嬉しい
492デフォルトの名無しさん
垢版 |
2023/04/26(水) 12:00:07.89ID:GTOaZ7cP
どなたか教えてくだされ
対照実験の医療統計をしたいと思って
傾向スコアマッチングにしようと思ってます

肺がん手術を実施した人たち200症例のうち10人だけ
手術後に合併症を起こしていました

この場合

「合併症を起こしたグループ」・・・10人
「合併症を起こさなかったグループ」・・・190人になり

患者の背景で傾向スコアマッチングをキャリパー幅0.2でペア分けすると

各群8人ずつの比較になってしまいます。

これで優位差を出す統計するには数が少なすぎるのであまりにも乱暴な統計になりますか?
それとも元々のサンプルが200人から選りすぐりのマッチングさせた8人ずつを選んでいるので8人ずつと少なくても問題ないですか?
493デフォルトの名無しさん
垢版 |
2023/04/26(水) 18:48:06.52ID:ZF8W3LJH
共変量のバイアスがより少ないサンプルが得られますが、サイズが8人の二群比較なのは変わらないんじゃないかと思います
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況