X



トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0656132人目の素数さん
垢版 |
2019/01/13(日) 19:54:34.41ID:c90jMv3t
>>649
知ってるかもだけどいちいちmappingは書かなくてもいい
scale_shapeも値が1:3ならいらない

ggplot(data, aes(shape=Conditions, col=Conditions))+
geom_line(alpha=0.6)+
geom_point(alpha=0.8)
0657132人目の素数さん
垢版 |
2019/01/27(日) 04:45:13.06ID:1PEFhfyS
習ってから思ったけど、Fortranとgnuplotでいいよね
0658132人目の素数さん
垢版 |
2019/01/29(火) 23:19:36.86ID:6ZawiHpQ
普及度、パッケージ数、専門度、文献数の点でそれはない
0659132人目の素数さん
垢版 |
2019/01/30(水) 01:27:02.50ID:6Sa5WD/n
ヒカキンの年収が10億超え!?明石家さんま・坂上忍も驚愕の総資産とは??
https://logtube.jp/variety/28439
【衝撃】ヒカキンの年収・月収を暴露!広告収入が15億円超え!?
https://nicotubers.com/yutuber/hikakin-nensyu-gessyu/
HIKAKIN(ヒカキン)の年収が14億円!?トップYouTuberになるまでの道のりは?
https://youtuberhyouron.com/hikakinnensyu/
ヒカキンの月収は1億円!読唇術でダウンタウンなうの坂上忍を検証!
https://mitarashi-highland.com/blog/fun/hikakin
なぜか観てしまう!!サバイバル系youtuberまとめ
http://tokyohitori.hatenablog.com/entry/2016/10/01/102830
あのPewDiePieがついに、初心YouTuber向けに「視聴回数」「チャンネル登録者数」を増やすコツを公開!
http://naototube.com/2017/08/14/for-new-youtubers/
27歳で年収8億円 女性ユーチューバー「リリー・シン」の生き方
https://headlines.yahoo.co.jp/article?a=20170802-00017174-forbes-bus_all
1年で何十億円も稼ぐ高収入ユーチューバー世界ランキングトップ10
https://gigazine.net/news/20151016-highest-paid-youtuber-2015/
おもちゃのレビューで年間12億円! 今、話題のYouTuberは6歳の男の子
https://www.businessinsider.jp/post-108355
彼女はいかにして750万人のファンがいるYouTubeスターとなったのか?
https://www.businessinsider.jp/post-242
1億円稼ぐ9歳のYouTuberがすごすぎる……アメリカで話題のEvanTubeHD
https://weekly.ascii.jp/elem/000/000/305/305548/
世界で最も稼ぐユーチューバー、2連覇の首位は年収17億円
https://forbesjapan.com/articles/detail/14474
ヒカルの収入が日収80万、月収2400万、年収3億と判明www
https://matomenewsxx.com/hikaru-income-8181.html
はじめしゃちょーの年収は6億?2017年は30億突破か?
https://2xmlabs.com/archives/1873
0660132人目の素数さん
垢版 |
2019/01/30(水) 11:36:05.44ID:ZoxNNwN2
glmer関数にgamma分布を適用したモデルをggplotで回帰曲線を引く方法がわかりません......。summary(model)$dispersionがNULLと返されてしまいます。
0661132人目の素数さん
垢版 |
2019/01/30(水) 22:41:24.83ID:eyCKZk6T
コードの例示がないからよく分からないけど、もともと戻り値が無いんじゃないの
0664132人目の素数さん
垢版 |
2019/02/02(土) 21:51:39.00ID:KjQdurrZ
>>656
可読性を保つために省略しないほうがいい
プログラミングの基本
0665132人目の素数さん
垢版 |
2019/02/02(土) 22:39:28.49ID:43EjN4Kg
逆じゃね。可読性上げるために省略する。
特にmappingなんかは書くまでもない。
0666132人目の素数さん
垢版 |
2019/02/03(日) 00:29:26.31ID:Ifbe1wQ3
継承を無視してコピペしまくるのが基本なわけない
マウント取りもいきすぎると滑稽だわ
0667132人目の素数さん
垢版 |
2019/02/14(木) 03:33:35.52ID:ilawOvx/
>>666
お前のほうが滑稽
マウントってるのお前
イキってるだけで中身もないし
滑稽すぎる
0668132人目の素数さん
垢版 |
2019/02/14(木) 07:38:25.36ID:0JSgR2gZ
データテーブルの1列目のある文字列(例えばstart)を検索してその行含めた上の行を全部削除するスマートな書き方ある?
df[-1:-grep("start",df[,1])]
今こんな感じだけどパイプで繋げない。
slice使えばいいのか、grep以外にいい関数があるのか?
0669132人目の素数さん
垢版 |
2019/02/14(木) 09:16:23.85ID:5Ge1SQSk
>>668
startが必ず一つしかないとか、restartとかがあったときにそれを検出しても良いならそれでもよいが、普通は
df[-(1:which(df[, 1] == "start")[1]), ]
すると思う。
経験的にはgrepはできるだけ避けた方がいい。
0670132人目の素数さん
垢版 |
2019/02/14(木) 11:48:21.71ID:x7agr8k6
お邪魔します。
スレ違いが明らかなんですが、ここで聞かせて下さい。

numpyスレ立てていいですか?
0672132人目の素数さん
垢版 |
2019/02/14(木) 12:28:21.65ID:0JSgR2gZ
>>669
なるほど、ありがとうございます。
そしてカッコでくるんでからマイナス付ける書き方もあるのか。勉強になります。
0674132人目の素数さん
垢版 |
2019/02/14(木) 17:44:07.85ID:0JSgR2gZ
データフレームのある列が全てNAの時、その列を削除するよい方法ある?
現状col<-apply(2,function(x){all(is.na(x))}
で要らない列定義してからdf[,!col]としてるけどほんとはパイプの中に入れて処理したい。
0678132人目の素数さん
垢版 |
2019/02/27(水) 15:36:28.78ID:3fnUBEYQ
RStudioをvi風のキーバインドにすると、
ノーマルモードのときに日本語入力してしまうとバグみたいになるんだが
あれどうにかならんの?
0679132人目の素数さん
垢版 |
2019/02/28(木) 13:53:56.86ID:uGjkNcWR
どなかた↑よろしく
0680132人目の素数さん
垢版 |
2019/03/01(金) 22:53:08.03ID:GbS9kHJG
RStudio と日本語入力ってほんと相性わるい

なんとかしてくれんかなぁ
0681132人目の素数さん
垢版 |
2019/03/02(土) 11:44:51.96ID:xWBxsoOC
windowsのpreview版(1.2.1303)RStudio使ってるけど、
IMEが無効になるバグが直ってる感じがする。
まだ十分使い込んでないからだけかも。
0682132人目の素数さん
垢版 |
2019/03/03(日) 01:15:23.41ID:Hp71k0It
https://wired.jp/2019/01/18/get-wired-kevin-kelly-5-videos/
シロンボヒトモドキゴキブリニホンザルの自由は偽自由と詐欺広告人を殺す自由ヒトモドキゴキブリシロンボアメ公はニホンザルゴキブリと自殺せよ?
0683132人目の素数さん
垢版 |
2019/03/04(月) 09:44:29.47ID:752mbxzc
「いきる」とか最近ネットで使ってるやつ増えてきたがなんなんあれ?
あほな反抗期の中学生がつかってるイメージしかわかんのだが。
0684132人目の素数さん
垢版 |
2019/03/04(月) 12:02:26.52ID:DLycryqB
「生きる」と「熱る」のどっちだ?
いずれにしろ広辞苑に載ってるから調べればいい
0686132人目の素数さん
垢版 |
2019/03/04(月) 19:13:04.98ID:TnBdKqi2
>>684
方言に対して広辞苑を持ち出すのは的外れ。
大阪弁辞典によると「意気る」または「粋る」なので、漢字も外れ
0687132人目の素数さん
垢版 |
2019/03/04(月) 19:19:22.60ID:Z/nuwIrB
>>686
どっちも「熱る」の当て字やん
0688saga
垢版 |
2019/03/05(火) 02:07:35.96ID:myQXAbVL
活きる
0689132人目の素数さん
垢版 |
2019/03/05(火) 08:37:04.71ID:agNxkP9Y
>「生きる」と「熱る」

「熱る」って初めて聞いた
これは普通に使われているの?
方言?
生まれてこのかた、東京なんだけど聞いたこと見たことないんだが
単なる私の不勉強かな?
0690132人目の素数さん
垢版 |
2019/03/05(火) 08:59:52.15ID:rIYlDwl5
https://dictionary.goo.ne.jp/jn/10539/meaning/m0u/
いき・る【熱る】
1 あつくなる。ほてる。むしむしする。
2 激しく怒る。

https://kotobank.jp/word/%E7%86%B1%E3%83%BB%E7%86%85-2005439
いき・る【熱る】
@ あつくなる。ほてる。むしむしする。
A 息づかいを荒くして怒る。相手と争おうとしていきまく。言いたてる。
B 調子に乗って勢いこむ。元気づく。
0692132人目の素数さん
垢版 |
2019/03/07(木) 21:17:38.50ID:VjN8Z7nf
豚肉屋の豚肉自民のキモオタ奴隷豚障害者犯罪者窃盗犯山田太郎と犯罪者キモオタは今すぐ民族レベルで自決自殺しろw
キモ豚山田太郎は自民入党のマイノリティ下僕化しキモオタヒトモドキ障害者の存在価値は0に達したんだよ表現戦士の性犯罪者害虫
このキモオタヒトモドキネトウヨをガス室で抹殺してえよな?w
0693132人目の素数さん
垢版 |
2019/03/07(木) 22:45:56.15ID:VjN8Z7nf
腐れシロンボテロアメ公ヒトモドキは核で根絶やしになれヒトモドキニホンザルゴキブリの親玉障害者欠陥遺伝子白塵ゴキブリ
0694132人目の素数さん
垢版 |
2019/03/10(日) 10:47:48.29ID:FJeOC8+j
QAi2Acx7tz
奇形ネトウヨヒトモドキゴミ藪部落の顔気持ち悪いから自殺しろ糞犬hk
0695132人目の素数さん
垢版 |
2019/03/10(日) 10:49:53.12ID:QtQWWkXv
ww.sankei.com/column/ 180307/clm1803070005-a.html

ヒトモドキ産経便所ゴキブリは下着ドロの常習犯変態暴論ゴミ便所自殺しなさい今すぐ
0696132人目の素数さん
垢版 |
2019/03/20(水) 12:05:11.55ID:sWnpvDa6
欠損値のないデータで解析したモデルをstepAIC()で処理しようとしたところ、TRUE/FALSEが必要なところが欠損値ですとエラーが出たのですが、どう処理すればよいのでしょうか。MuMInのdredge()でも同様になってしまいました。
0697132人目の素数さん
垢版 |
2019/03/28(木) 15:23:23.97ID:ahK9oO7y
https://www3.nhk.or.jp/news/html/20190327/k10011863181000.html

インフルエンザの新しい治療薬「ゾフルーザ」を投与されたA香港型のインフルエンザ患者30人を調べたところ、70%余りに当たる22人から、この薬が効きにくい耐性ウイルスが検出されたことが国立感染症研究所の調査で分かりました。
調査件数は多くないものの、専門家は現在のような使用を続けると、耐性ウイルスが広がるおそれがあるとして使用基準を見直すべきだと指摘しています。

耐性化率が50%以上である確率は
pbeta(0.5,1+22,1+8,lower=F)
[1] 0.9946631でいいかな?
0698132人目の素数さん
垢版 |
2019/03/28(木) 20:29:02.09ID:U0fUTvgM
> (p=1-binom.test(22,30)$p.v)
[1] 0.9838752
> binom.test(22,30,conf=p)

Exact binomial test

data: 22 and 30
number of successes = 22, number of trials = 30, p-value = 0.01612
alternative hypothesis: true probability of success is not equal to 0.5
98.38752 percent confidence interval:
0.5000000 0.8994036
sample estimates:
probability of success
0.7333333
0700132人目の素数さん
垢版 |
2019/04/06(土) 19:22:34.74ID:ZoRErNus
yahoo apiで距離取得するコード掲載したサイトないですかね
google料金高過ぎて鞍替えなんですが
0701132人目の素数さん
垢版 |
2019/04/16(火) 20:17:02.49ID:pCHBksve
>>680
使ってるQtが古いんや。1.2でだいぶましになった感じだけど入力途中の文字が残る妙な挙動が時々でる。
0703132人目の素数さん
垢版 |
2019/04/17(水) 07:23:57.02ID:DjFMZd4L
>>702
書籍は出版される頃には情報が古くなってるから。自分はネットの情報とヘルプだけで十分だな。
0706132人目の素数さん
垢版 |
2019/04/29(月) 14:15:34.67ID:EFJy96Ez
RStudioって32ビット版って存在しないの??

ダウンロードしようとしても32ビット版見当たらないし、Windows7,10用の64ビット版セットアッププログラムを起動しようすると32ビットへの選択とかはなくて、単にエラーになっちゃうし

誰か教えてください
0707132人目の素数さん
垢版 |
2019/04/30(火) 14:31:58.91ID:dkpfnzJo
httpstwitter.com/shotkr16

低脳中卒万引きヒトモドキネトウヨ猿ヒトモドキをさしころせ
0709
垢版 |
2019/04/30(火) 20:32:55.24ID:DrrYw4j1
ここでRをつかった仕事をされてる人いますか?
学生ですか?

仕事あれば教えてほしい
0710132人目の素数さん
垢版 |
2019/05/01(水) 19:38:51.19ID:dNg1mxtc
>>709
Rを仕事にしてはいないけど、仕事の一環でR使ってる
信頼性、入手しやすさ、扱いやすさのバランス的に自分の環境ではR一択なんだよな
0712710
垢版 |
2019/05/02(木) 08:41:31.17ID:fIit4zkT
>>711
AI目当てでこれから使おうと思って勉強中
今の職場で求められるのは主に統計用途や作図なんでRは手放せないかな
0713132人目の素数さん
垢版 |
2019/05/02(木) 13:30:24.26ID:74c/hxJZ
twitter.com/tukuhae

ゴキブリネトウヨヒトモドキ奇形売春婦肉便器なつこババア滅多刺しにして解体しろ
0714132人目の素数さん
垢版 |
2019/05/02(木) 13:37:47.73ID:8Iminfbi
>>712
なるほど。
自分も機械学習やってるけど、R の方がやりやすいよ。ディープラーニングならPythonかもしれないけど
0715132人目の素数さん
垢版 |
2019/05/02(木) 18:56:28.17ID:zw8jEgb5
データ分析とか統計解析とかだとRかPythonかだね
機械学習よりは統計寄りだとRは仕事でもスタンダード、特にマニアックな統計解析だとRにしかパッケージがない
まあ使い慣れてるならRで機械学習やっても全然構わないけど
0717132人目の素数さん
垢版 |
2019/05/03(金) 01:33:11.23ID:z3krlkgk
>>715
少し前はRなんてだんだん廃れるみたいな雰囲気あったけど今はむしろ盛り返してデファクトな何時になってるからこの先10年は行きそうだなあ

機械学習特需でpythonの躍進はすごかったけど
0719132人目の素数さん
垢版 |
2019/05/11(土) 16:40:31.81ID:d+R/7VHb
Rstudio初心者です。
データファイル名を変えてフォルダには変更名で保存されてるのに、読み込むともとの名前のままなんです。どうすれば変更後の名前になるのでしょう?
0721132人目の素数さん
垢版 |
2019/05/17(金) 22:45:05.59ID:BQfw+Y+R
>>719
全く状況がわからん。
主語や目的語、必要な修飾語を省略せずに、分かるように説明しないと誰も助言できない。
0722132人目の素数さん
垢版 |
2019/05/19(日) 05:50:12.72ID:i0Ntz+gH
いつのまにかどうでもいい国の資格試験の選択科目にまでなったしな

なんなんだろう
0724132人目の素数さん
垢版 |
2019/05/20(月) 08:40:12.19ID:ys3TVMX0
資格にしがみついたらいつのまにか技術の進展から取り残された国がありましたとさw
0726132人目の素数さん
垢版 |
2019/07/11(木) 19:34:28.29ID:A4GNZ5B3
Pivot_longer & wider
0727132人目の素数さん
垢版 |
2019/07/20(土) 11:06:35.86ID:bSAoQnjE
0645
ふうL@Fu_L12345654321
学コン1傑いただきました!
とても嬉しいです!

https://pbs.twimg.com/media/D-IuUuqVUAALnAB.jpg
https://twitter.com/Fu_L12345654321/status/1144528199654633477
https://twitter.com/5chan_nel (5ch newer account)
0729132人目の素数さん
垢版 |
2019/08/10(土) 11:28:08.57ID:YonpeJMb
RってMac版とWindows版で優劣ないの?
今から始めるならどっちがオススメ?
0730132人目の素数さん
垢版 |
2019/08/10(土) 13:44:59.32ID:/UVOwF70
R自体に優劣はないが文字コード絡みの問題が多いWindows環境はおすゝめしない。
0734132人目の素数さん
垢版 |
2019/08/12(月) 04:58:06.03ID:TcXjNI8s
>>729
R本体だとグラフィックディバイスに違いはあるけど、実質的に差はない。
でもRは本体だけで使うことは稀で、多種多様なGUIがあるから、
そこでOSの違いによる差が生じる。
0735132人目の素数さん
垢版 |
2019/12/09(月) 08:29:17.97ID:g2fJs3Gj
面白い問題スレにあったのでシミュレーションしてみた。

# サイコロ

# 正6面体のサイコロがある.4面は青色、2面は赤色である.
# このサイコロを合計20回振るとき、最も起こりそうな順番はどれか?
# 1.赤 青 赤 赤 赤
# 2.青 赤 青 赤 赤 赤
# 3.青 赤 赤 赤 赤 赤

sim <- function(){
a=sample(0:1,20, replace=TRUE, prob=c(4,2))
b=as.character(a)
c=paste(b,collapse="")
s1=paste(c(1,0,1,1,1),collapse="")
s2=paste(c(0,1,0,1,1,1),collapse="")
s3=paste(c(0,1,1,1,1,1),collapse="")
res=c(grepl(s1,c),grepl(s2,c), grepl(s3,c))
return(res)
}
k=1e6
re=replicate(k,sim())
mean(re[1,])
mean(re[2,])
mean(re[3,])

結果は、直感とおり、1が再頻

> mean(re[1,])
[1] 0.124672
> mean(re[2,])
[1] 0.080873
> mean(re[3,])
[1] 0.040564
>

grep使わない方法ってあるかな?
0738132人目の素数さん
垢版 |
2019/12/12(木) 16:40:23.20ID:8G7On9nx
>>735
ワイの直感的解法

# 1.赤 青 赤 赤 赤
# 2.青 赤 青 赤 赤 赤
# 3.青 赤 赤 赤 赤 赤

だが、以下でも確率同じ。何となく
# 1.赤 赤 赤 赤 青 ★
# 2.赤 赤 赤 赤 青 青
# 3.赤 赤 赤 赤 青 赤
★は赤でも青でもどっちでもOK

P(# 1) >P(# 2) >P(# 3) ∵青出やすい

R言語等でシミュレーションされ、
自身の確率直感が正しいのを
確認できるとは、素晴らしい。
0739>>738
垢版 |
2019/12/12(木) 18:31:03.53ID:8G7On9nx
上記の件、若干の訂正とする

# 1.赤 青 赤 赤 赤
# 1'.赤 赤 赤 赤 青 とすると、
# 1と# 1'は、直感で同じ確率と
思ってたが間違えのようだ。

当方のシミュレーションで、
# 1は、0.1248
# 1'は、0.1271
となった。微妙だけど、多分だ。

やっぱり確率計算をコンピュータで
モンテカルロシミュレーションのは
素晴らしい。
0740132人目の素数さん
垢版 |
2019/12/12(木) 19:21:51.88ID:8G7On9nx
>>735
【grepは未使用の糞真面目な方法】

# 1.赤 青 赤 赤 赤
についての確率、ほぼ厳密解を得た
# 1は、0.124774… だと思う

計算は、モンテカルロ法でない方法
でプログラム、計算した。
で、grepは使用してない。
ちなみに計算誤差は、ほぼ皆無なハズ

ソースコードイメージ
p01 = (1/3)^4*(2/3)
p02 = p01
p03 = p01 * (1 - p01)
p04 = p01 * (1 - p01 - p02)
p05 = p01 * (1 - p01 - p02 - p03)

p16 = p01 * (1 - p01 - p02 - p03 … - p14)
とし、
p01~p16 の合計を算出したところ、
0.124774…  となった
0741132人目の素数さん
垢版 |
2019/12/13(金) 07:46:08.65ID:lh0xGphL
>>738
レスありがとうございます。

私の直感

# 1.赤 青 赤 赤 赤
# 2.青 赤 青 赤 赤 赤
# 3.青 赤 赤 赤 赤 赤

# 1.を6個に書き換えて #2.と並べると
# 1.★ 赤 青 赤 赤 赤
# 2.青 赤 青 赤 赤 赤
★は赤でも青でもどっちでもOKだから#1.の方が起こりやすい

# 2と# 3を比べると
# 2.青 赤 青 赤 赤 赤
# 3.青 赤 赤 赤 赤 赤
3個めでは青の方がでやすいので
ら#2.の方が起こりやすい

よって、P(# 1) >P(# 2) >P(# 3)
0742132人目の素数さん
垢版 |
2019/12/14(土) 03:40:27.74ID:L1XaepqW
分からない問題スレから、
>>
1回3.6%で激レアが出るガチャを10回回した確率って
36%なのでしょうか?
それとも0.964*0.964*0.964(略 0.964を10回電卓にかけた数なのでしょうか?
教えてください。
<<

百万回シミュレーション

p=3.6/100
N=10
sim <- function() any(rbinom(N,1,p)==1)
mean(replicate(1e6,sim()))


> mean(replicate(1e6,sim()))
[1] 0.306628
0743132人目の素数さん
垢版 |
2019/12/14(土) 03:51:08.05ID:L1XaepqW
シミュレーション その2

gacha=c(rep(1,36),rep(0,1000-36))
sim2 <-function() any(sample(gacha,10,replace=TRUE)==1)
mean(replicate(1e6,sim2()))

> mean(replicate(1e6,sim2()))
[1] 0.306904

何故か0.36にならない、どうしてだろ?
0744132人目の素数さん
垢版 |
2019/12/14(土) 04:10:22.87ID:L1XaepqW
シミュレーションその3 (処理速度の関係で10万回の平均)

gacha=c(rep(1,36),rep(0,1000-36))
sim3 <- function() any(replicate(10,sample(gacha,1))==1)
mean(replicate(1e5,sim3()))

> mean(replicate(1e5,sim3()))
[1] 0.30691

これも0.307弱だな。

何が悪いんだろ? 俺の頭かな??
0745132人目の素数さん
垢版 |
2019/12/14(土) 05:45:07.83ID:qYB5MEbs
3.6%のガチャを10回回して全部外れる確率は
(1 - 0.036) ^ 10 ≒ 0.6930592

したがって、
3.6%のガチャを10回まわして1回以上当たる確率は
1 - 0.6930592 = 0.3069408
0750132人目の素数さん
垢版 |
2019/12/14(土) 19:21:15.54ID:1VaGaO0p
その確率計算の激ナイーブな解法を示す

激レアは、レアだから1個とみなす。
故に、母集団の個数は
1÷0.036 = 27.777… きっと28個だ

手順1) 28枚のカードがある
手順2) 重複しない1~28の番号を振る
手順3) 28枚のカードをシャッフル
手順4) 1~10枚目のどれか1となる確率
と絶対同じハズ、だから、

P(1枚目で当) =27P27 ÷ 28P28 = 1/28
P(2枚目で当) も同様に1/28
P(3枚目で当) も同様に1/28

P(10枚目で当) も同様に1/28

で此等10個の事象は背反事象だから、
P = 10/28 = 0.357
 ∵有効数字3桁と勝手にしちゃう

ところてガチャってゲーム何か
よくわかんないけど、計算しちゃった
0751132人目の素数さん
垢版 |
2019/12/14(土) 20:44:12.02ID:1VaGaO0p
追記というか突然ですが、
そのガチャ3.6%の件、
超幾何分布なのか。二項分布なのか。
確率の小さいとか、母集団が小さい とかだと無視できないと思われる。

確率統計はギャンブル派生数学ぢゃ。
生半可な知識ではカモにされる。

現代の若者たちは、数学特に
確率統計はじめとするギャンブル
の能力が特段に欠けており、
R言語等のプログラミング教育で
ギャンブルゲームを学習すべきだ。

奇麗事の学問だけの今日の数学ぢゃ
カモにされるだけ。
健全な娯楽として賭博系確率統計学
をC R Java Pyson Javascript BASIC
の何れかを学校で学習すべきだ。
0752132人目の素数さん
垢版 |
2019/12/16(月) 09:18:31.40ID:t3hxiPBr
私のガチャのイメージは、
かつて、昭和の駄菓子屋によくある
ガチャガチャすなわちカプセルトイ

そのような健全的なギャンブルが
超幾何分布とか二項分布の理解に
役立つのだ。
限られたお小遣の10円玉数枚で、
如何にレアアイテムをGetするかを
子供らは、思考するからだ。
「残り物には福がある」は
確率統計的には正しいのか
子供同士で文学的に議論したものだ。

さて、今のガチャは恐らくは、
デジタルの媒体のスマホゲームだ。
二項分布でよいだろう。
R言語には、
二項分布の密度関数、それの累積関数
はモチロン、それに従う乱数生成を
提供してるようだ。

ゲームの仕組みが複雑化する今、
R言語等の乱数生成プログラミングで
これからのデジタル化ギャンブル社会
で、お金より大切な激レアをドンドン
無限にゲットできる人材の増加を
期待できる可能性を秘めている
0753132人目の素数さん
垢版 |
2019/12/17(火) 06:37:18.85ID:gnX7/8eN
カプセルトイ(ガチャ)1台に1000個カプセルが入っていて36個がアタリ(レアアイテム)とする。
同じカプセルトイが10台ある。カプセル取り出し後は補充されない。
アタリを1個でも手に入れる確率は
1台から10個取り出す場合(G10)と
1台から1個を10台で取り出す場合(G01)
ではどちらが高いか?

そのシミュレーション

rm(list=ls())
N=1000 ; K=36 ;n=10 # アタリ3.6%
g=rep(c(1,0),c(K,N-K))
G10 <- function() any(sample(g,n,replace=FALSE)>0) # 非復元(超幾何分布)
G01 <- function() any(sample(g,n,replace=TRUE )>0) # 復元(二項分布)
mean(replicate(1e6,G10()))
mean(replicate(1e6,G01()))
0754132人目の素数さん
垢版 |
2019/12/17(火) 08:10:38.97ID:gnX7/8eN
シミュレーションと理論値

> mean(replicate(1e6,G10())) ; 1-choose(N-K,n)/choose(N,n)
[1] 0.307745
[1] 0.3081121
> mean(replicate(1e6,G01())) ; 1-(1-K/N)^n
[1] 0.307295
[1] 0.3069408

1台から10個取り出した方がいいみたい。
0755132人目の素数さん
垢版 |
2019/12/17(火) 14:14:51.68ID:JPqkotiS
>>754 なるほど、
どの台も全部で、1000カプセルで、
どの台も当りが、36カプセルだと
G10(1台で10個)取り出す方が
僅かですが、確率良さそうですね。

シミュレーションも理論値も
同様な結論のようであり、
G10(1台で10個)取り出す方が僅かに
有利が分かり何か楽しかったです。

仮に、もしどの台も
250カプセル中当たり9カプセルなら、さらにG10戦略がG01戦略より有利な
感触を掴めました。
0756132人目の素数さん
垢版 |
2019/12/17(火) 15:44:13.73ID:gnX7/8eN
>>755
1000個だとシミュレーションの差が微妙で再現性が不安だったけど
250個にすると、差が明らかにつきますね。

> N=250 ; K=9 ;n=10 # アタリ3.6%
> g=rep(c(1,0),c(K,N-K))
>
> G10 <- function() any(sample(g,n,replace=FALSE)>0) # 非復元(超幾何分布)
> G01 <- function() any(sample(g,n,replace=TRUE )>0) # 復元(二項分布)
>
> mean(replicate(1e6,G10())) ; 1-choose(N-K,n)/choose(N,n)
[1] 0.31082
[1] 0.3117069
> mean(replicate(1e6,G01())) ; 1-(1-K/N)^n
[1] 0.306782
[1] 0.3069408
0757132人目の素数さん
垢版 |
2019/12/18(水) 14:18:29.16ID:GQllmBub
rhyper で超幾何分布の乱数を発生させることができたんだな。
これと rbinomを使うと sample関数を使わなくても同じことができた。

N=250 ; K=9 ;n=10 # アタリ3.6%

mean(replicate(1e6,rhyper(1,K,N-K,n)>0)) ; 1-choose(N-K,n)/choose(N,n) # 非復元(超幾何分布)
mean(replicate(1e6,any(rbinom(n,1,K/N)>0))) ; 1-(1-K/N)^n # 復元(二項分布)

結果
> mean(replicate(1e6,rhyper(1,K,N-K,n)>0)) ; 1-choose(N-K,n)/choose(N,n)
[1] 0.311581
[1] 0.3117069
> mean(replicate(1e6,any(rbinom(n,1,K/N)>0))) ; 1-(1-K/N)^n
[1] 0.307213
[1] 0.3069408

1台から順次10個取り出すのをイメージすれば残り物には福があるとも言えなくもないな。


>
0758132人目の素数さん
垢版 |
2019/12/18(水) 21:18:37.22ID:GQllmBub
"フランスの数学者パスカル(1623〜1662)が1654年にフェルマーにあてた手紙が、現在の確率
論の始まりだと言われている。当時の有名な賭博師メレがパスカルに以下のような問題を持ち
込み、その問題についてがその手紙のやりとりの中で論じられているそうである。
甲乙二人がおのおの32ピストル(当時のお金の単位)の金を賭けて勝負したとする。
そしてどちらかが先に3点を得たものを勝ちとし、勝った方がかけ金の総額64ピストルをもら
えるとする。ところが甲が2点、乙が1点を得たとき、勝負が中止になってしまった。
このとき、二人のかけ金の総額64ピストルを甲と乙にどのように分配すればよいだろうか。
ただし二人の力は互角で、勝つ確率はそれぞれ1/2ずつだとする。"

# 先にw(=3)点を得たものを勝ち、甲がA(=2)点、乙がB(=1)点を得たとき、勝負が中止
# 甲の確率を求める

gambling <- function(A=2,B=1,w=3,k=1e5){ # k : how many simulate
sim <- function(){
while(A < w & B < w){
g = rbinom(1,1,p=0.5)
if(g==1){
A=A+1
}else{
B=B+1
}
}
A > B
}
mean(replicate(k,sim())) # Pr[A wins]
}

> gambling(2,1,3)*64 #64ピストル配分
[1] 48.13056
> gambling(2,0,4) # 日本シリーズ
[1] 0.80945
0759132人目の素数さん
垢版 |
2019/12/19(木) 09:59:55.45ID:V+OT4hGF
>>758の計算結果は、興味深い結果だ
で、
自己流の直感でラフな計算をしてみた。
甲1点、乙1点 ⇒1:1按分 ∵自明 ★
甲3点、乙1点 ⇒1:0按分 ∵自明 ☆

安直に★と☆の平均を考えると
甲2点、乙1点 ⇒1:0.5按分 ∵安直

で、総額で64ピストルだから、
甲に、64*1/1.5 = 42.67 ピストル
乙に、64*0.5/1.5 = 21.33 ピストル
を配分すれば、思ってしまった。

ラフな計算だと、少々不公平なことが
起こるようだ。

R言語等のシミュレーションは、
超天才のワィの直感より、
さらに厳密な確率計算ができそうだ。
0760132人目の素数さん
垢版 |
2019/12/19(木) 16:21:08.12ID:kVFzAP55
>>758
最後はAが得点して勝負が決定するのを忘れずにAが勝者になるまでのBの点数で場合分け

NS <- function(w,A,B,p){ # 先にw点得点した方が勝者、A,B:現在の点数 ,p:甲の勝率
ans=0
for(k in 0:(w-B-1)){ # k: Aが勝者になるまでのBの点数
ans=ans+choose(w-A-1+k,w-A-1)*(1-p)^k*p^(w-A)
}
return(ans)
}

> NS(3,2,1,0.5)*64 #64ピストルの分配
[1] 48
> NS(4,1,0,0.5) #日本シリーズで先勝したほうが優勝する確率
[1] 0.65625

NSは日本シリーズの頭文字から命名、No Skinではないww
0761132人目の素数さん
垢版 |
2019/12/19(木) 18:00:34.70ID:V+OT4hGF
賭博等の確率計算をイメージすると
ワィの脳内は活性化される だから、
ドンドン、妄想全開となるぅぅぅ。

という訳で、妄想内容を記載する

17世紀の地球に行き、胴元になって
賭博ビジネスでガッポリ儲けるゼェ。
17世紀の地球で、胴元になって、
コイントス賭博事業をするゼェ。

で、システムは、2回コイントスし、
表の回数が0回⇒参加者が32万円GET
表の回数が1回⇒胴元に、32万円PAY
表の回数が2回⇒参加者が32万円GET
参加料は、1万円

まんまと、参加者が沢山 1000人いた
ある参加者は、以下の様に怪説をした

組み合わせは、3通りだ。
1通り目 表の回数が0回
2通り目 表の回数が1回
3通り目 表の回数が2回
だから、参加者の勝つ確率は2/3だ

で、モチロン、胴元ワィの商売は成功
およそ、1000万円儲かっちゃた。
0763132人目の素数さん
垢版 |
2019/12/21(土) 10:49:06.51ID:+RV2yvS7
日本シリーズで賭けをする。

日本シリーズは先に4勝したチームが優勝。
勝率はそれまでの(引き分けを除いた)通算勝率に従うとする。
シリーズ開始前の通算成績はA:2勝、B:4勝であった。
今シリーズでAが先勝(第一試合に勝利)した。
この時点でA,Bのどちらに賭ける方が有利か?
0764132人目の素数さん
垢版 |
2019/12/21(土) 22:03:14.56ID:vLicX+v2
分からない問題スレで3進法の小数とかが話題になっていた

https://rio2016.5ch.net/test/read.cgi/math/1567866548/845
>>
845 名前:132人目の素数さん[] 投稿日:2019/12/21(土) 05:52:50.74 ID:wum1jR1j
...
10進数で表された5/9を3進数になおせという問題があって、答は0.12だったのですが、
...
<<

こんなのを作ってみた。


# 小数点付きの数numをN進法で表示する

rm(list=ls())
dec2basen <- function(num, N, kmin = 5){ # kmin:最小小数点後桁
int=floor(num)
r=int%%N
q=int%/%N
while(q > 0){
r=append(q%%N,r)
q=q%/%N
} # rに整数のN進法表示を格納

x=num-floor(num)
k=max(nchar(x)-2,kmin) # 同長もしくはkminの長さの小数表示
a=numeric(k)
for(i in 1:k){
y=x*N
a[i]=floor(y)
x=y-a[i] # r . a[1] a[2] a[3] ... a[k]
}
if(N<=10){ # Nが10以下は数値として表示
cat(r,paste(".",paste(a,collapse = ''),sep=''),'\n',sep='')
}
else{ # Nが11以上は整数部分と小数部分を数列で表示
print(list(int=r,decimal=a))
}
invisible()

}


> dec2basen(5/9,3)
0.120000000000000

> dec2basen(3.14159265359,7)
3.06636514320
> dec2basen(3.14159265359,8)
3.11037552421
> dec2basen(3.14159265359,9)
3.12418812407
> dec2basen(3.14159265359,14)
$int
[1] 3

$decimal
[1] 1 13 10 7 5 12 13 10 8 1 4
0765132人目の素数さん
垢版 |
2019/12/22(日) 08:18:39.30ID:Ez3wWboE
>>764
バグの原因を追求したら、Rの仕様のせいみたいだな。

> (1.2-1)*5==1
[1] FALSE
> (1.2-1)*5>1
[1] FALSE
> (1.2-1)*5<1
[1] TRUE

これがfloor関数が誤値を返してくる原因だった。
> floor(1)
[1] 1
> floor((1.2-1)*5)
[1] 0
0767132人目の素数さん
垢版 |
2019/12/22(日) 13:06:36.02ID:Ez3wWboE
すると、pythonに移植しても同じ結果ということか。

IPython 6.5.0 -- An enhanced Interactive Python.
C:\bin\Anaconda3\lib\site-packages\ipykernel\parentpoller.py:116: UserWarning: Parent poll failed. If the frontend dies,
the kernel may be left running. Please let us know
about your system (bitness, Python, etc.) at
ipython-dev@scipy.org
ipython-dev@scipy.org""")

(1.2-1)*5==1
Out[1]: False

(1.2-1)*5>1

Out[2]: False

(1.2-1)*5<1

Out[3]: True

(1.2-1)*5
Out[4]: 0.9999999999999998
0768132人目の素数さん
垢版 |
2019/12/22(日) 17:15:43.69ID:Ez3wWboE
round を使って回避することにした
> 0.728*5-3.64
[1] -4.440892e-16
> round(0.728*5-3.64,5)
[1] 0

んで、デバッグ版

# 小数点付きの数numをN進法で表示する(62進法まで対応 0-9,a-z,A-Z)
rm(list=ls())
dec62 <- function(num, N, kmin = 5){ # kmin:最小小数点後桁
int=floor(num)
r=int%%N
q=int%/%N
while(q > 0){
r=append(q%%N,r)
q=q%/%N
} # rに整数のN進法表示数列を格納
k=max(nchar(num)-nchar(floor(num))-1,kmin) # 同長もしくはkminの長さの小数表示
a=numeric(k)
x=round(num-floor(num),k) # e.g. 7.28-floor(7.28)-0.28 != 0に対応
for(i in 1:k){
y=round(x*N,k) # e.g. 0.728*5-3.64 !=0 に対応
a[i]=floor(y)
x=y-a[i] # r . a[1] a[2] a[3] ... a[k]
}
b=list(integer=r,decimal=a,num=sum(c(int,a)*(1/N)^(0:k)))
fig=c(0:9,letters,LETTERS)[1:N]
if(N<=62){ # Nが62以下は数値として表示
cat(paste(fig[b$integer+1],sep='',collapse=''),
'.',paste(fig[b$decimal+1],sep='',collapse=''),sep='')
cat('\n')
}
else{ # Nが63以上は整数部分と小数部分を数列で表示
print(b[1:2])
}
invisible(b) # b$num:検証用
}
0770132人目の素数さん
垢版 |
2019/12/25(水) 07:12:30.44ID:oEKznZ6+
>>766
レスありがとうございました。
アドバイスに従ってちょっと勉強してみました。
他の言語に移植しても無駄とわかって助かりました。
こうなる理由が理解できました。

(1+1/10-1)*10==1
[1] FALSE
> (1-1+1/10)*10==1
[1] TRUE
0771132人目の素数さん
垢版 |
2020/01/06(月) 12:56:45.01ID:e9wyGMBv
からnまでの順列を列挙するスクリプト。
これをwhile使って高速化するにはどうすればいいだろう?
俺の頭では思いつかない。

perm <- function (n) {
v=1:n
sub <- function(n, v) {
if (n == 1)
matrix(v, 1, 1)
else {
x = NULL
for (i in 1:n) x =rbind(x, cbind(v[i], sub(n -1,v[-i])))
x
}
}
sub(n, v)
}


> perm(4)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 1 2 4 3
[3,] 1 3 2 4
[4,] 1 3 4 2
[5,] 1 4 2 3
[6,] 1 4 3 2
[7,] 2 1 3 4
[8,] 2 1 4 3
[9,] 2 3 1 4
[10,] 2 3 4 1
[11,] 2 4 1 3
[12,] 2 4 3 1
[13,] 3 1 2 4
[14,] 3 1 4 2
[15,] 3 2 1 4
[16,] 3 2 4 1
[17,] 3 4 1 2
[18,] 3 4 2 1
[19,] 4 1 2 3
[20,] 4 1 3 2
[21,] 4 2 1 3
[22,] 4 2 3 1
[23,] 4 3 1 2
[24,] 4 3 2 1
>
0772132人目の素数さん
垢版 |
2020/01/06(月) 21:34:47.52ID:yym51Tg7
>>771
自己解決 e1071というパッケージに再帰呼び出しなしのpermutationがありました。

library(e1071)
permu <- function (n) {
z <- matrix(1)
for (i in 2:n) {
x <- cbind(z, i)
a <- c(1:i, 1:(i - 1))
z <- matrix(0, ncol = ncol(x), nrow = i * nrow(x))
z[1:nrow(x), ] <- x
for (j in 2:i - 1) {
z[j * nrow(x) + 1:nrow(x), ] <- x[, a[1:i + j]]
}
}
return(z)
}
0773132人目の素数さん
垢版 |
2020/01/09(木) 14:28:06.78ID:rRnLkyt7
可変引数の扱い
Cで
#include <stdio.h>
int main(int argc, char* argv[])
{
while(argc--)
printf("%s\n", *argv++);
return 0;
}
をRでやるには ... を使って、c(...)もしくはlist(...)で引き出せばいいんだな。
検索してもなかなかわからなかった。

main <- function(...){
argv=c(...)
for(i in 1:length(argv)) cat(argv[i],'\n')
}
0774132人目の素数さん
垢版 |
2020/01/15(水) 18:08:54.32ID:l229ykjv
>>546
library(Rmpfr)

mpfr(factorial(50),5000)

one = mpfr(1, 5000)
factorial(one*50)


> mpfr(factorial(50),5000)
1 'mpfr' number of precision 5000 bits
[1] 30414093201713018969967457666435945132957882063457991132016803840
> one = mpfr(1, 5000)
> factorial(one*50)
1 'mpfr' number of precision 5000 bits
[1] 30414093201713378043612608166064768844377641568960512000000000000

何故か、oneを高精度に設定しておくと、正しい計算をしてくれた。
0775132人目の素数さん
垢版 |
2020/01/26(日) 16:33:21.98ID:G7gVG9Ku
RのroundのIEEE仕様

> round(2.5)
[1] 2
> round(1.5)
[1] 2

は丸め誤差が減るという説明だったので実験してみた。

# 四捨五入 vs IEEE with FUN(=mean) for x(=c(-0.9,-0.8,...,0.8,0.9))
comp <- function(n=10,FUN=mean,x=sample((-9:9)/10,n,rep=T),print=T){
X=FUN(x)
dif = abs(X-FUN(round(x))) - abs(X-FUN(f45(x))) # round後の実行と四捨五入後の実行の差
if(dif!=0 & print) cat(dif<0,' : ',sort(x),'\n') # 差があれば表示 round後が小さければTRUE
return(dif) # 差を返す dif<0:round優位 dif>0:四捨五入優位
}
comp()

k=1e5
# mean
re=replicate(k,comp(print=F))
c(IEEE=mean(re<0),四捨五入=mean(re>0),引き分け=mean(re==0))

# squared sum
comp(FUN=function(x) sum(x^2))
re=replicate(k,comp(FUN=function(x)sqrt(sum(x^2)),print=F))
c(IEEE=mean(re<0),四捨五入=mean(re>0),引き分け=mean(re==0))



> # 平均 mean
> re=replicate(k,comp(print=F))
> c(IEEE=mean(re<0),四捨五入=mean(re>0),引き分け=mean(re==0))
IEEE 四捨五入 引き分け
0.25235 0.16199 0.58566

> # 平方和 squared sum
> re=replicate(k,comp(FUN=function(x)sqrt(sum(x^2)),print=F))
> c(IEEE=mean(re<0),四捨五入=mean(re>0),引き分け=mean(re==0))
IEEE 四捨五入 引き分け
0.40519 0.01413 0.58068

平均だと小差だが、統計計算の内部処理で使う平方和だと大差がついたので、体感できた。
0776132人目の素数さん
垢版 |
2020/02/08(土) 17:42:30.00ID:+JttXwIS
"隔離中のクルーズ船では船内の換気が共通らしいから運悪く13日後に発症した奴がいるとその近くの部屋のやつは
プラスで14日隔離しないといけない。それが今の船内の状況という。

両隣のどちらかが感染したら14日延長、どの部屋も1日で感染する確率pは1%
部屋の配置は長方形でどの部屋にも両隣があるとする。
発症するか、隔離期間が終われば下船できる。
全員定員1の個室として客と乗務員を合わせた人数nは3000人。
クルーズ船から全員下船できる日数の期待値は?"
0777132人目の素数さん
垢版 |
2020/02/08(土) 17:42:46.53ID:+JttXwIS
rm(list=ls())

p=0.001 # 1日の感染確率
n=3000 # 収容者人数
d14=14 # 隔離日数
Q0=rep(d14,n) # 必要隔離日数の配列の初期値
#
ODA <- function(X){ # One Day After 必要隔離日数の配列 x から1日後の配列を返す
Q=X # Xを作業用Qに代入
S=which(Q!=0)  # 未感染者susceptibleのindex
s=length(S) # 未感染者人数
m=rbinom(1,s,p) # その日の感染数
if(m==0){ # 感染者0なら未感染者の
Q[S]=Q[S]-1  # 必要隔離日数を1日減らして返す
invisible(Q)
}else{
I.idx=sample(S,m) # 未感染者Sからm人が感染、感染者のindex (Infected.idx)
id2ext <- function(id){ # 感染者idからの両隣のidを返す
plus =ifelse(id==n,1,id+1) # 最大番号なら1を返す,それ以外は1増やす
minus=ifelse(id==1,n,id-1) # 1なら最大番号を返す,それ以外は1減らす
unique(c(plus,minus)) # 重複を除く
}
E.idx=as.vector(sapply(I.idx,id2ext)) # 感染者の両隣のidを列挙し
E.idx=unique(E.idx) # 重複を除く Extended quarantine.idx
Q[E.idx]=d14 # 両隣は必要隔離日数をd14にリセット
Q[I.idx]=0 # 感染者は必要隔離日数=0 (リセット者に重複していたら0で上書き)
IE.idx=unique(c(I.idx,E.idx)) # 感染もしくは感染者の隣のindex
minus1ifnotzero <- function(x) ifelse(x==0,0,x-1) # ゼロでなければ1を減じて返す
Q[-IE.idx]=minus1ifnotzero(Q[-IE.idx]) # 感染もなく感染者の隣りでもない人の隔離日数を1日減らす
invisible(Q)
}
}
sim <- function(){
AZ=FALSE # All Zero 隔離日数がすべて0か?
i=0 # カウンター
Q=Q0 # 隔離日数配列初期値
while(!AZ){ # 隔離日数がすべて0になるまで
Q=ODA(Q) # One Day After関数を実行
AZ=all(Q==0) # All zero?
i=i+1 # カウンター
}
return(i) # 何日かかったかを返す
}

k=1e4 # k回のシミュレーションの
RE=replicate(k,sim())
mean(RE) # 平均値=期待値
0780132人目の素数さん
垢版 |
2020/02/08(土) 19:51:16.44ID:+JttXwIS
実行したら全員が下船できるまで約1ヶ月になった。
コードにまだバグがあるかも。
0781132人目の素数さん
垢版 |
2020/02/09(日) 21:31:53.47ID:IDQ3+Iu7
Rのcsvの文字化け治らねえ
csvそのものをutf-8にしたら今度は不正なマルチバイトがあるってエラー
どうすればいいか教えて
0783132人目の素数さん
垢版 |
2020/02/09(日) 23:10:12.62ID:KodPd2ez
>>781
エスパーじゃないから、まず確認だけど

・Rを使ってる環境(OS)とRのバージョンは?
・CSVのコード変換に使ってるソフトは?
・CSVを読み込んでる関数と指定している引数は?
0785132人目の素数さん
垢版 |
2020/03/07(土) 09:46:33.43ID:3M7vmA2q
>>784
エラーがでた。R 3.6.3にアップデートしたけど
> library('remotes')
> remotes::install_github("GuangchuangYu/nCov2019", dependencies = TRUE)
Downloading GitHub repo GuangchuangYu/nCov2019@master
Skipping 1 packages not available: BiocStyle
Installing 5 packages: downloader, cowplot, maps, magick, BiocStyle
Error: Failed to install 'nCov2019' from GitHub:
(converted from warning) package ‘BiocStyle’ is not available (for R version 3.6.3)
0788132人目の素数さん
垢版 |
2020/03/07(土) 11:38:15.72ID:3M7vmA2q
We also developed a web app (http://www.bcloud.org/e/) with interactive plots and simple time-series forecasts.

という記述があるんだけど  関数 nls による非線形回帰分析 で作成しているのかなぁ?
0789132人目の素数さん
垢版 |
2020/03/09(月) 20:05:18.91ID:0N1NTePA
面白い問題スレをRでシラミ潰しにカウントしてみた。

"縦n個、横n個のマス目のそれぞれに 1,2,3,...,n の数字を入れていく。
このマス目の横の並びを行といい、縦の並びを列という。
どの行にも、どの列にも、2つの対角線上にも同じ数字が1回しか現れない入れ方は何通りあるか求めよ。(2020京大文系 改)
n=4がオリジナル
"
library(gtools)
n=4
(a=permutations(n,n)) # nの順列
r=nrow(a)
f<-function(x){ # x=c(1,2,3,4) -> rbind(a[1],a[2],a[3],a[4])
ans=NULL
for(i in x){
ans=rbind(ans,a[i,])
}
return(ans)
}

b=permutations(r,n)
head(b) ; tail(b)
B=apply(b,1,f)
diag2 <- function(x){ # 行列xの右上から左下への対角線の配列を返す
n=nrow(x)
ans=numeric(n)
for(i in 1:n) ans[i]=x[i,n+1-i]
return(ans)
}
g <- function(v){ # matri(v,n)で列、対角線の要素がすべて異なればTRUEを返す
n=sqrt(length(v))
(x=matrix(v,n))
if(length(unique(diag (x))) < n) return(FALSE)
if(length(unique(diag2(x))) < n) return(FALSE)
flag=TRUE
for(i in 1:n){
if(length(unique(x[,i])) < n){
flag=FALSE
break
}
}
return(flag)
}
counter=NULL
for(i in 1:ncol(B)){
if(g(B[,i])) counter=append(counter,i)
}
length(counter)
counter
matrix(B[,counter[1]],n)
matrix(B[,counter[2]],n)
matrix(B[,counter[48]],n)
0790132人目の素数さん
垢版 |
2020/03/10(火) 07:11:26.36ID:H1fx2jVB
>>789
n=5 にするとメモリー不足でエラーがでた。
サンプリングでやってみる
# simulation
n=5
sim <- function(n=5){
v=as.vector(t(replicate(n,sample(n)))) # n × n行列要素をベクトル化
if(g(v,dia=TRUE)){ # diagonal latin squareなら
print(matrix(v,n)) # 行列化して表示
return(1)
}
return(0)
}
k=1e6
sum(replicate(k,sim(5)))
0791132人目の素数さん
垢版 |
2020/03/10(火) 12:07:20.32ID:KHQs8ybj
1億回モンテカルロしてようやく、1個みつかった。


[,1] [,2] [,3] [,4] [,5]
[1,] 2 5 4 3 1
[2,] 4 3 1 2 5
[3,] 1 2 5 4 3
[4,] 5 4 3 1 2
[5,] 3 1 2 5 4
0792132人目の素数さん
垢版 |
2020/03/11(水) 11:06:12.00ID:7KW6Eui5
嫌ね最近は総当たりアルゴリズムで枝刈り使えば実用的な時間で解決できるこ知らない人が多くて
0793132人目の素数さん
垢版 |
2020/03/15(日) 08:45:11.95ID:OTl1KJku
versionが3.6,xになって、str2lang とか str2expressionという関数が追加されたんだな。

https://id.fnshr.info/2019/07/20/r3-6-0/
で知った



rep("1:6",5)
paste(rep("1:6",5),collapse=',')
str2lang(paste("expand.grid(",paste(rep("1:6",5),collapse=','),')'))
eval(str2lang(paste("expand.grid(",paste(rep("1:6",5),collapse=','),')')))

(s=rep("1:6",5))
(str=paste(s,collapse=','))
(lang=str2lang(paste("expand.grid(",str,')')))
eval(lang)
0794132人目の素数さん
垢版 |
2020/03/21(土) 17:23:30.68ID:RyI2Q/uv
The Clinical and Chest CT Features Associated with Severe and Critical COVID-19 Pneumonia

https://journals.lww.com/investigativeradiology/Abstract/publishahead/The_Clinical_and_Chest_CT_Features_Associated_with.98832.aspx

の付表にこんなデータがあった

# Parameter Total (n=83) Severe/critica l Group (n=25) Ordinary Group (n=58) P Value
# Number of lobes Median (interquartile range, IQR)
# 5 (4-5) 5 (5-5) 5 (3-5) 0.003

重症群25例 中等症群58例でCTで肺炎像が確認できた肺葉数(1〜5)が
全体で中央値が5 第一四分位数(少ない方から数えて25%の値)が4、第三四分位数(少ない方から数えて75%の値)が5
重症群では中央値5、第一四分位数5、第三四分位数5
中等症群では中央値5、第一四分位数3、第三四分位数5で
p値が0.003であるという。
0.0025〜0.0035までとして、

この条件に見合う83例をリストアップすると
> re[100,][1:25]
[1] 1 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
> re[100,][26:83]
[1] 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
[48] 5 5 5 5 5 5 5 5 5 5 5
という類の組み合わせで
19504通りと計算された。

重症群の肺葉数の平均は4.76
中等症群の平均は4.04
と計算された。

タイ値がこれだけ多いデータにWilcox検定を使う意味がわからんな。
0795132人目の素数さん
垢版 |
2020/03/22(日) 08:57:06.28ID:liILqu/N
# 感度0.7 特異度0.9のPCR検査で1000人中10人が陽性だったときの有病率の信頼区間をシミュレーションして計算するスクリプト

# アルゴリズムには自信がないw

sim <- function(n=1000,r=10,sen=0.7,spc=0.9,k=1e6,print=TRUE){
# n:検査件数 r:検査陽性数 sen=感度 spc=特異度 k:発生乱数の数,print:グラフ描画
prev=rbeta(k,1+r,1+n-r) # 有病率の事前分布を一様分布と仮定

PPV=prev*sen/( prev*sen + (1-prev)*(1-spc) ) # 検査特性を加味してPPV計算
prev.post = PPV*(1-spc)/(sen - PPV*(sen+spc-1)) # そのPPVから有病率を計算
# NPVでも同じ結果
# NPV=(1-prev)*spc/( (1-prev)*spc + prev*(1-sen)) # 検査特性を加味してNPV計算
 # prev.post = (1-NPV)*spc/(spc - NPV*(sen+spc-1)) # そのNPVから有病率を計算
mean=mean(prev.post) # 期待値
median=median(prev.post) # 中央値
mode=density(prev.post)$x[which.max(density(prev.post)$y)] # 最頻値
LU=unlist(HDInterval::hdi(prev.post))[1:2] # 95%信頼区間
re=c(mean=mean,median=median,mode=mode,LU) # 事後有病率の代表値
if(print){ # ヒストグラム描画
par(mfrow=c(2,2))
hist(prev,freq=F,xlim=c(0,1)) ; lines(density(prev),lwd=2)
hist(PPV,freq=F,xlim=c(0,1)) ; lines(density(PPV),lwd=2)
hist(prev.post,freq=F,xlim=c(0,1)) ; lines(density(prev.post),lwd=2)
BEST::plotPost(prev.post)
par(mfrow=c(1,1))
}
print(round(re,4)) # 概算値表示
invisible(list(re,prev.post)) # 代表値と事後有病率を非表示で返す
}
sim(100,1)
sim(1000,10)
sim(10000,100)
sim(100000,1000)
0797132人目の素数さん
垢版 |
2020/03/23(月) 14:55:08.54ID:iIfIhG5+
MCMCで解決してみた。

【富山県最強伝説】新型コロナウイルスPCR検査件数 54人 陽性0人

ある集団から54人を無作為に選んでPCR検査したら陽性0であった。
PCR検査の感度0.7 特異度0.9としてこの集団の有病率の期待値と95%信頼区間を推測せよ。


#----------------------------------------------------------------------------
# 感度SEN, 特異度SPCの検査でN人中X人が陽性であったときの推定有病率prevalence
# 弱情報事前分布はprevalence ~ dunif(0,UL) , UL:上限
#----------------------------------------------------------------------------

PCRj <- function(N,X,UL=1,SEN=0.7,SPC=0.9,verbose=TRUE){ # UL:upper limit of dunif(0,UL)
library(rjags)
modelstring=paste0('
model
{
x ~ dbin(p,n)
p <- prev*sen + (1-prev)*(1-spc)
prev ~ dunif(0,',UL,')
}
')
if(verbose & UL!=1) cat(modelstring)
writeLines(modelstring,'TEMPmodel.txt')
dataList=list(n=N,x=X,sen=SEN,spc=SPC)
jagsModel = jags.model( file="TEMPmodel.txt" ,data=dataList,quiet=TRUE)
update(jagsModel)
codaSamples = coda.samples( jagsModel ,
variable=c("prev","p"), n.iter=1e6, thin=10)
js=as.matrix(codaSamples)
BEST::plotPost(js[,'prev'],xlab='prevalence',showMode = TRUE) ; lines(density(js[,'prev']),col='skyblue')
round(c(mean=mean(js[,'prev']),HDInterval::hdi(js[,'prev'])[1:2]),10)
}

PCRj(100,1)
PCRj(1000,10)
PCRj(10000,100)
PCRj(100000,1000)

PCRj(54,0)
PCRj(54,0,UL=0.1)
0798132人目の素数さん
垢版 |
2020/04/03(金) 19:48:06.63ID:MNrUuJMd
a b c d e f g h i j
1 -0.0377710 0.02994835 0.1779426 0.29057472 0.13252796 0.3279709 -0.3534731 -0.54812874 -0.3869768 -0.1233967
2 0.2707033 0.09238235 -0.1042958 -0.08485129 -0.02590955 0.2159095 -0.3338677 0.00865952 -0.1575856 0.0953795
0799132人目の素数さん
垢版 |
2020/04/03(金) 19:50:07.75ID:MNrUuJMd
上のDFを

library(psych)
ICC(DF)

で級内相間求めようとすると変な値でるんだけどなんででしょう?
0800132人目の素数さん
垢版 |
2020/04/03(金) 22:01:48.08ID:1EdxzcOL
> DF
V1 V2
a -0.03777100 0.27070330
b 0.02994835 0.09238235
c 0.17794260 -0.10429580
d 0.29057472 -0.08485129
e 0.13252796 -0.02590955
f 0.32797090 0.21590950
g -0.35347310 -0.33386770
h -0.54812874 0.00865952
i -0.38697680 -0.15758560
j -0.12339670 0.09537950
> library(psych)
> ICC(x=DF,lmer=FALSE)
Call: ICC(x = DF, lmer = FALSE)

Intraclass correlation coefficients
type ICC F df1 df2 p lower bound upper bound
Single_raters_absolute ICC1 0.36 2.1 9 10 0.13 -0.18 0.74
Single_random_raters ICC2 0.34 2.0 9 9 0.17 -0.26 0.74
Single_fixed_raters ICC3 0.32 2.0 9 9 0.17 -0.24 0.72
Average_raters_absolute ICC1k 0.53 2.1 9 10 0.13 -0.43 0.85
Average_random_raters ICC2k 0.51 2.0 9 9 0.17 -0.69 0.85
Average_fixed_raters ICC3k 0.49 2.0 9 9 0.17 -0.63 0.84

Number of subjects = 10 Number of Judges = 2
0801132人目の素数さん
垢版 |
2020/04/03(金) 23:40:27.04ID:MNrUuJMd
>>800
すいません
書き方が良くなかったです。
subject が1,2
judge a,b,c,dをきちんとfirst,second,third,fourth
と書くべきでした。
subjectとjudgeはあってると思うのです。
0802132人目の素数さん
垢版 |
2020/04/03(金) 23:42:39.27ID:MNrUuJMd
例えば
first second third fourth
0 0.05 0.1 0.15
0 0 0.05 0.05
0.15 0.1 0.05 0.1
0 0.05 0.2 0.05
0.1 0.15 0.1 0.05
0.15 0.05 0.1 0.05

というデータで

Call: ICC(x = over_sight)

Intraclass correlation coefficients
type ICC F df1 df2 p lower bound upper bound
Single_raters_absolute ICC1 0.0068 1 5 18 0.43 -0.19 0.48
Single_random_raters ICC2 0.0068 1 5 15 0.44 -0.19 0.48
Single_fixed_raters ICC3 0.0068 1 5 15 0.44 -0.19 0.48
Average_raters_absolute ICC1k 0.0268 1 5 18 0.43 -1.70 0.79
Average_random_raters ICC2k 0.0268 1 5 15 0.44 -1.82 0.79
Average_fixed_raters ICC3k 0.0268 1 5 15 0.44 -1.82 0.79

Number of subjects = 6 Number of Judges = 4
0803132人目の素数さん
垢版 |
2020/04/03(金) 23:44:30.81ID:MNrUuJMd
となるのですが、ICC1が0.0068ってこんなに低くなるのでしょうか?
結果のとり得る値が1〜0なので最大15%ぐらいの変動幅で、
制度としてはかなりいい検査方法だとおもったのですが・・・
0804132人目の素数さん
垢版 |
2020/04/04(土) 00:07:42.72ID:npCU99bV
少し理解できました。
範囲制約性の問題があるのですね。
今回のサンプルがみんな低い得点で分散が低いからICCが低く算出されていました。
ダミーデータ
1,1,1,1
を追加したらICC=0.99となりました。
得点の高いサンプルを追加しないとICCで信頼性は測れないのですね。
0805132人目の素数さん
垢版 |
2020/04/04(土) 00:09:17.81ID:npCU99bV
いま有病者と健常者の両方を計測する検査法で健常者のみのデータでICCを算出しようとしているのが間違いということですね。

上記のような場合で、健常者のみでも信頼性を算出する方法っていうのはないのでしょうか?
0806132人目の素数さん
垢版 |
2020/04/04(土) 21:44:33.98ID:ZFu90Xbq
>>804
DF=rbind(
c(0,0.05,0.1,0.15),
c(0,0,0.05,0.05),
c(0.15,0.1,0.05,0.1),
c(0,0.05,0.2,0.05),
c(0.1,0.15,0.1,0.05),
c(0.15,0.05,0.1,0.05),
c(0.0001,0.0001,0.0001,0.0001))

とダミーに0.0001を加えても
> DF2ICC1(DF)
ICC(1,1) ICC(1,k)
0.2462707 0.5665262

> psych::ICC(DF)
type ICC F df1 df2 p lower bound
Single_raters_absolute ICC1 0.25 2.3 6 21 0.072 -0.027
Single_random_raters ICC2 0.25 2.3 6 18 0.079 -0.028
Single_fixed_raters ICC3 0.25 2.3 6 18 0.079 -0.034
Average_raters_absolute ICC1k 0.57 2.3 6 21 0.072 -0.115
Average_random_raters ICC2k 0.57 2.3 6 18 0.079 -0.122
Average_fixed_raters ICC3k 0.57 2.3 6 18 0.079 -0.154

となるから、高値データでなくてもいいみたい。
0810132人目の素数さん
垢版 |
2020/04/25(土) 07:29:33.43ID:R/UD6QQG
>>809
これやってからでないとパッケージのコンパイルができない。

After installation is complete, you need to perform one more step to be able to compile R packages:
you need to put the location of the Rtools make utilities (bash, make, etc) on the PATH.
The easiest way to do so is create a text file .Renviron in your Documents folder which contains the following line:

PATH="${RTOOLS40_HOME}\usr\bin;${PATH}"

You can do this with a text editor, or you can even do it from R like so:

writeLines('PATH="${RTOOLS40_HOME}\\usr\\bin;${PATH}"', con = "~/.Renviron")
0811132人目の素数さん
垢版 |
2020/04/25(土) 08:56:31.54ID:R/UD6QQG
>>809
libraryのフォルダで dir /B とやって既にinstall済のリストを作って
install.packages("rstan","ggplot2",....)とやった方がいいな。
5000ほどパッケージがあるらしいけど、全部インストールしたらどれくらいの容量が必要なんだろう?
0814132人目の素数さん
垢版 |
2020/04/26(日) 22:22:15.60ID:tZeixXMR
高血圧で不安だという老人の経過観察入院1件。発熱してなくてほっとした。
ステーキハウスがテイクアウトを始めたからインセンティブはその足しにしようっと。
0815132人目の素数さん
垢版 |
2020/05/03(日) 15:15:43.67ID:ICXX0aJG
>>812
コンパイルなしでやってみた。

サイズ:19.6 GB (21,082,530,395 バイト)

ディスク上のサイズ:20.3 GB (21,805,858,816 バイト)

ファイル数: 527,982、フォルダー数: 118,521
0816132人目の素数さん
垢版 |
2020/05/03(日) 15:37:44.00ID:f6MQMkc5
Ubuntu 20.04でRcmdrがビルドできないんですけど、これはソフトウェアが20.04に対応するまで待つしかないですか?
0819132人目の素数さん
垢版 |
2020/05/07(木) 01:08:38.98ID:VnQvkZ57
4.0になってから
col=番号指定での色が目に優しくなったみたい。

hist(runif(100),col=2)
hist(runif(100),col=rgb(1,0,0,1))
hist(runif(100),col='red')
0823132人目の素数さん
垢版 |
2020/05/07(木) 23:39:55.93ID:8IDmAqjy
リリースノートより

The palette() function has a new default set of colours (which are less saturated and have better accessibility properties).
There are also some new built-in palettes, which are listed by the new palette.pals() function.
These include the old default palette under the name "R3". Finally, the new palette.colors() function allows a subset of colours to be selected from any of the built-in palettes.
0825132人目の素数さん
垢版 |
2020/05/08(金) 00:23:14.39ID:CfFk/Uw1
binomにある信頼区間をグラフ表示させてみた。

binom.ci <- function(x,n,cl=0.95){
PEci=binom::binom.confint(x,n,conf.level=cl)
y=nrow(PEci):1
oldpar <- par(no.readonly = TRUE)
on.exit(par(oldpar))
par(mar=c(3,3,2,2))
par(oma=c(0,4,0,0))
plot(PEci$upper,y,xlim=c(min(PEci$lower),max(PEci$upper)),type="n",
yaxt="n",ylab="",xlab="Confidence Interval",
main=paste("C.I. for", x,"out of",n))
points(PEci$upper,y,pch="|") ; points(PEci$lower,y,pch="|")
segments(PEci$lower,y,PEci$upper,y,lwd=3,
col=sample(colours(),1))
abline(v=PEci$mean[1],lty=3)
axis(2, at=y, labels=PEci$method,as.vector,las=2,cex=0.75)
PEci
}
binom.ci(3,312)
0826132人目の素数さん
垢版 |
2020/05/08(金) 00:48:23.14ID:CfFk/Uw1
>>824
情報、ありがとうございます。

?paletteのヘルプにあるスクリプトを実行すると体感できました。

## Demonstrate the colors 1:8 in different palettes using a custom matplot()
sinplot <- function(main=NULL) {
x <- outer(
seq(-pi, pi, length.out = 50),
seq(0, pi, length.out = 8),
function(x, y) sin(x - y)
)
matplot(x, type = "l", lwd = 4, lty = 1, col = 1:8, ylab = "", main=main)
}
sinplot("default palette")

palette("R3"); sinplot("R3")
palette("Okabe-Ito"); sinplot("Okabe-Ito")
palette("Tableau") ; sinplot("Tableau")
palette("default") # reset
0827132人目の素数さん
垢版 |
2020/05/09(土) 20:51:55.34ID:oDT7bFgO
rjagsのコードに

theta[i,j] <- min(1, exp(-alpha[i]*t[j]) + beta[i])といいれて、確率を1以下にして二項分布させてようとすると

Node inconsistent with parents というエラーがでた。 stackoverflow.comも明確な答が見いだせず、あれこれいじって

どうも確率1や0で二項分布する可能性があるとエラーがでるみたい、というのを発見。

1を0.99999とするとエラーが回避できた。

1を 1 - 1e-16としてもエラー回避できた。
0828132人目の素数さん
垢版 |
2020/05/18(月) 08:52:51.27ID:s/hrJxRo
mathematicaは内部どうなってんだか知らないが第何種ベッセル関数とか入ってくるめちゃくちゃ重い積分を計算してくれた
0829132人目の素数さん
垢版 |
2020/05/25(月) 12:44:17.51ID:3k8+9x6G
"
ある人物Dが新型コロナ肺炎に罹患したとする。
行動調査によって発症前にキャバクラに行っており
接客したキャバ嬢Cが人物D発症の2日後に発症していたことがわかった。
キャバ嬢Cは人物Dから移されたと主張して1億円の賠償を求めている。
潜伏期間には幅がありキャバ嬢Cから移された可能性もあると主張して
その確率を計算して賠償金を値切りたい。
いくら値切れるか計算せよ。
"
潜伏期間が従う分布はこれ
#--- incubation period ---
# from Li et al NEJM 2020
# lognormal mean = 5.2
ln_par1 = 1.434065
ln_par2 = 0.6612

Gt <- function(delay){
C=rlnorm(1e6,ln_par1,ln_par2)
D=rlnorm(1e6,ln_par1,ln_par2)
mean(C-D > delay)
}
Gt(2)
0830132人目の素数さん
垢版 |
2020/05/25(月) 12:48:45.94ID:3k8+9x6G
怖い本で紹介されていたパッケージ polspline は秀逸。
発生させた乱数から確率密度関数を作ってくれる。
複雑な分布だと収束できず作れないこともあるけど

対数正規分布の差の分布を乱数発生させてpdfが作れた。

library(polspline)
delay=2
ln_par1 = 1.434065
ln_par2 = 0.6612
c=rlnorm(1e5,ln_par1,ln_par2)
d=rlnorm(1e5,ln_par1,ln_par2)
hist(c-d, freq=F,col='white',breaks=100,ylim=c(0,0.11),
xlim=c(-30,30),ann=F,axes=F) ; axis(1)
fit=logspline(c-d)
curve(dlogspline(x,fit),-30,30,ann=F,bty='n',add=T)
segments(delay,0,delay,dlogspline(delay,fit),pch=19,col=4)
curve(dlogspline(x,fit),delay,30,add=T,type='h',col=4)
curve(plogspline(x,fit),-30,30,lty=3,bty='n')
1-plogspline(delay,fit)
fn <- function(delay) 1- plogspline(delay,fit)
curve(fn(x),0,14, bty='n' ,xlab='Delay', ylab='Probability')
0832132人目の素数さん
垢版 |
2020/07/25(土) 08:42:04.47ID:1FL39oBq
Rのグラフの出力をGIF動画にしたかったので検索したら、このページが役立った。

http://cse.naro.affrc.go.jp/takezawa/r-tips/r/36.html

mytest <- function() {
ANS <- readline("1+2? ")
if (ANS == "3") cat("Correct!\n")
else cat("Wrong...\n")
}
mytest()


mymessage <- function() {
Sys.sleep(3)
cat("Hello.\n")
}
mymessage()

尚、GIF作製には 
https://www.screentogif.com/
がお手軽だった。
0833132人目の素数さん
垢版 |
2020/07/26(日) 10:34:51.02ID:FqjSGBlb
他人のコードを読んでいたら、

'%&%' <- function(x,y) paste0(x,y)

という関数が定義されていた。

これは便利と思った。

> '√2 =' %&% sqrt(2) %&% ', π = ' %&% pi
[1] "√2 =1.4142135623731, π = 3.14159265358979"
0837132人目の素数さん
垢版 |
2020/07/29(水) 12:22:51.45ID:3HY+hEHZ
面白いけど使いどころが難しそう
%>%パイプとの親和性が無いのが痛い
0840132人目の素数さん
垢版 |
2020/07/30(木) 18:02:20.97ID:8iPZt0Nw
>>833
それって意味があるの?
> paste0('√2 =', sqrt(2), ', π = ', pi)
[1] "√2 =1.4142135623731, π = 3.14159265358979"
普通にpaste0のまま使った方がタイプ量が圧倒的に少ないが。
0841132人目の素数さん
垢版 |
2020/07/30(木) 20:10:10.19ID:417El1m4
>>840
括弧の対応で混乱しそうなときにちょっと役にたつかも。

こんな感じ

eval(str2lang("expand.grid(" %&% paste0(rep("1:2",6),collapse=',') %&% ")"))
0842132人目の素数さん
垢版 |
2020/07/31(金) 07:51:08.50ID:0a0zx1wG
>>841
うーん、その例だとイマイチに思える

rerun(6, 1:2) %>% expand.grid
で済むものをわざわざ複雑にしているだけに感じる
0843132人目の素数さん
垢版 |
2020/07/31(金) 13:51:36.15ID:ImynyFWQ
>>842
無理やり、例示した感は否めないな。
標準装備でなら、
expand.grid(replicate(6,1:2,simplify = FALSE))
ですむし。
0844132人目の素数さん
垢版 |
2020/07/31(金) 23:36:09.03ID:0a0zx1wG
paste()やstr_c()以外を使うなら、sprintf()かglue::glue()が候補か
特にカンマが文字列に含まれるときにはpaste()より見やすくなるはず
sprintf("√2 = %s, π = %s", sqrt(2), pi)
glue("√2 = {sqrt(2)}, π = {pi}")
0845132人目の素数さん
垢版 |
2020/08/01(土) 18:51:48.81ID:2TFdzAyg
>>844
確かに便利ですね。
カンマを ','で入力するのは混乱のもとでしたから。
有用な情報、ありがとうございます。'

> glue::glue("√2 = {sqrt(2)}, sin(π/3) = {sin(pi/3)}")
√2 = 1.4142135623731, sin(π/3) = 0.866025403784439
0846132人目の素数さん
垢版 |
2020/08/06(木) 00:01:24.75ID:rivMs4GJ
初心者質問で申し訳ありません。
ある関数を作りたいのですが、その関数に入れる数値の数はランダムな場合はどのように書けばいいのでしょうか。
例えば、入れた要素をすべて掛け合わせる関数が作りたい場合、そこに入れる要素が(2,3,4)でも、(2,3,4,5,6)でも反応するような関数の書き方を教えてくださると助かります。
0848132人目の素数さん
垢版 |
2020/08/06(木) 01:18:04.99ID:rivMs4GJ
874さん。
847さん、回答ありがとうございます。
確かにベクトルで何かするのはわかるのですが、その部分がわからないのです。
出来れば下に問題を書くので、コードを書いていただけると非常に助かります。

問、正の整数であるベクトルを入力すると、そのベクトルの要素をすべて掛け合わせた値を結果として返す関数を作りなさい。
0849132人目の素数さん
垢版 |
2020/08/06(木) 02:03:47.23ID:V+bu3PeG
>>848
問題文これだけ?他に条件はないの?
標準の関数にあるけどいいのかな?

関数fを作るとして、一番いいのは標準の関数に余計な変更を加えないことだから、これが答えだけど…
f <- prod
0850132人目の素数さん
垢版 |
2020/08/06(木) 02:11:09.57ID:rivMs4GJ
849さん、返信ありがとうございます。

実は問2がありまして、たぶんそれは既存の関数にはないと思うので、そちらも教えていただけると非常に助かります。

問2、要素がすべて整数であるベクトルを入力すると、そのベクトルの要素の絶対値をすべて掛け合わせた値を結果として返す関数を作成せよ。
0854132人目の素数さん
垢版 |
2020/08/06(木) 05:32:55.68ID:meNNWVIo
>>850
f <- function(...){
v=c(...)
ans=1
for(i in v) ans=ans*i
ans=ifelse(ans>0,ans,-ans)
ans
}

> f(-1,2,3)
[1] 6
> f(1 -2,-3,-4,-5)
[1] 60
0855132人目の素数さん
垢版 |
2020/08/06(木) 05:34:50.08ID:meNNWVIo
>>850
入力はベクトルだったから、

> f <- function(v){
+ ans=1
+ for(i in v) ans=ans*i
+ ans=ifelse(ans>0,ans,-ans)
+ ans
+ }
> f(c(-1,2,3))
[1] 6
> f(c(1 -2,-3,-4,-5))
[1] 60
0856132人目の素数さん
垢版 |
2020/08/06(木) 06:04:14.18ID:meNNWVIo
再帰だとこんな感じかな?

f <- function(...){
v=c(...)
n=length(v)
sub<-function(n){
if(n==0) return(1)
else v[n]*Recall(n-1)
}
sub(n)
}
> f(2,3,4)
[1] 24
> f(2,3,4,5,6)
[1] 720
0859132人目の素数さん
垢版 |
2020/08/06(木) 08:49:09.44ID:E/ufUouA
再帰版はこんな感じかな。
rec.prod <- function(x) {
# 再帰により x の要素の絶対値の積を求める。
# 実際には prod(abs(x)) が良い。
l <- length(x) # ベクトルの要素数
if (l == 0) # 空のベクトルなら
return(1) # 積は1
x1.a <- abs(x[1])
if (l == 1)
x1.a
else
x1.a * rec.prod(x[-1])
}
0860132人目の素数さん
垢版 |
2020/08/06(木) 11:42:21.63ID:rivMs4GJ
質問者本人です。
皆様のお力添えのおかげで無事問題を解くことができました。
初心者質問にやさしく回答して頂いて感謝しかありません。

本当にありがとうございました。
0861132人目の素数さん
垢版 |
2020/08/06(木) 19:28:54.17ID:meNNWVIo
>>859
この方が>856みたいに関数の中で関数を定義とかなくてカッコいいと思ったのでsystem.timeで時間を比較しようと思って実験を始めたら、
何故か、rec.prodの方がoverflowしやすいなぁ。
頭からかけても尻からかけても同じじゃないかと思うんだが。

> prod(1:100)
[1] 9.332622e+157

> rec.prod <- function(x) {
+ # 再帰により x の要素の絶対値の積を求める。
+ # 実際には prod(abs(x)) が良い。
+ l <- length(x) # ベクトルの要素数
+ if (l == 0) # 空のベクトルなら
+ return(1) # 積は1
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rec.prod(x[-1])
+ }
> rec.prod(1:100)
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow

> f <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*Recall(n-1)
+ }
+ sub(n)
+ }
> f(1:100)
[1] 9.332622e+157
0862132人目の素数さん
垢版 |
2020/08/06(木) 20:06:06.68ID:meNNWVIo
比較のために、関数名の長さを同じにして、時間のかかるRecallを関数名にしてsystem.timeで比較してみた。

> rm(list=ls())
> rp <- function(x) {
+ # 再帰により x の要素の絶対値の積を求める。
+ # 実際には prod(abs(x)) が良い。
+ l <- length(x) # ベクトルの要素数
+ if (l == 0) # 空のベクトルなら
+ return(1) # 積は1
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rp(x[-1])
+ }
> f1 <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*Recall(n-1)
+ }
+ sub(n)
+ }
> f2 <- function(...){
+ v=c(...)
+ n=length(v)
+ sub<-function(n){
+ if(n==0) return(1)
+ else v[n]*sub(n-1)
+ }
+ sub(n)
+ }


> system.time(replicate(1e5,prod(1:10)))
user system elapsed
0.11 0.00 0.11
> system.time(replicate(1e5,rp(1:10)))
user system elapsed
2.64 0.00 2.64
> system.time(replicate(1e5,f1(1:10)))
user system elapsed
2.44 0.01 2.47
> system.time(replicate(1e5,f2(1:10)))
user system elapsed
1.86 0.00 1.87
0863132人目の素数さん
垢版 |
2020/08/06(木) 20:31:17.99ID:E/ufUouA
それはね、856は厳密な意味での再帰ではないから速いしリ、ソースを食わないんだよ。ループを再帰風に書いただけだから。それよりもループのほうが速いに決まっている。
この問題を再帰で解くのはムダ以外の何ものでもない。
0864132人目の素数さん
垢版 |
2020/08/06(木) 20:33:25.51ID:w8yiRRv5
>>863
喩えれば、
親分が子分を再帰で酷使しているだけだから親分は消耗しない
という理解でいい?
0865132人目の素数さん
垢版 |
2020/08/06(木) 20:47:18.11ID:E/ufUouA
全然違う。
再帰は、複雑な問題をより小さい問題に分割することがキモだ。
856は元のベクトルはそのまま変わらずに存在していて、ある特定の要素を一つずつ処理しているからループとやってることは変わりない。
859は、一つ短いベクトルを自分自身に処理させているから真の再帰なのだ。
0866132人目の素数さん
垢版 |
2020/08/06(木) 22:25:29.65ID:meNNWVIo
>>865
f自身は再帰関数じゃないけど、呼び出しているsubは再帰関数では?

こういうのと同じ。
f <- function(x){ # 数列の和の階乗を返す
m=sum(x)
sub <- function(n){
if(n==1) return(1)
else{
return(n*Recall(n-1))
}
}
fact(m)
}

> f(c(1,2,3))
[1] 720
0867132人目の素数さん
垢版 |
2020/08/06(木) 22:50:49.72ID:XP8VEZbb
>>865
(ご入力訂正)
f自身は再帰関数じゃないけど、呼び出しているsubは再帰関数では?

こういうのと同じ。
f <- function(x){ # 数列の和の階乗を返す
m=sum(x)
sub <- function(n){
if(n==1) return(1)
else{
return(n*Recall(n-1))
}
}
sub(m)
}

> f(c(1,2,3))
[1] 720
0868132人目の素数さん
垢版 |
2020/08/07(金) 21:08:59.64ID:S7qsZ31k
856はsub()の引数がvでなくnなことと、nの入力に対して関数外のv[n]が帰ってくるのが、少し気になるかも
856が再帰っぽくないってのは、859はxを分割・再帰していってるのに対して、856はnを減じていってその都度vのn番目の値を参照してるところかな

それから、859がrec.prod(1:13)であっさりオーバーフローしてしまうのは、integer型だから
あと実行速度が少し遅いのは、xl.aへの代入操作と、if(l ==1){}の余分な条件分岐のせいだね

その辺を修正してやれば、こんな感じかな
# 再帰で問2
f <- function(x){
if(length(x) == 0) return(1)
abs(x[1]) * f(x[-1])
}
0869132人目の素数さん
垢版 |
2020/08/08(土) 05:40:19.06ID:2ggSSq05
>>868
勉強になりました。

ついでにwhile版を書いてみました。
f <- function(x){
ans=1
while(length(x)){
ans=ans*abs(x[1])
x=x[-1]
}
ans
}
0870132人目の素数さん
垢版 |
2020/08/08(土) 09:18:18.60ID:FvlAeRBY
>>868
859が遅い根本の原因は、x[-1] が生成されること。
他の指摘は、細かい高速化の工夫だから初心者に薦めるのはどうかと。
現に869で全く実用的に意味のないコードを書いているし。
題意を素直に表したほうがよいのでは?
絶対値の積は、積の絶対値と等しいから、absを呼ぶのは1回で済むが、何も説明無しにそうするのは私的にはアウトだ。メンテナンスの時に自分や他人が苦しむから。
0871132人目の素数さん
垢版 |
2020/08/08(土) 11:01:30.91ID:559rm1Tc
>>870
意味不明なこと言いだしてるが大丈夫か、落ち着け
859は、無駄な条件分岐あるし、すぐオーバーフローするし、コードが冗長だしで、それこそ初心者以外にもNGだぞ

絶対値の積うんぬんに関しては、859と同じでabsを毎回呼んでる、余計な代入操作が無いだけだ
落ち着いてコードを見ろ

速度うんぬんの話はこれまで話題に出てきたように、856と比べての話だ、話についてこれないなら無理に入ってこなくていい
別に高速化を目的としてるわけじゃなく、859から冗長な部分やオーバーフローの原因を取り除いた結果高速化されたってだけだ

だが、速度が遅い原因がxl.aへの代入でなく、x[-1]作成が原因てのはそのとおりだ
文章を書いてる途中で、オーバーフローの原因(代入操作はこっちだ)と勘違いしてしまったようだ
これは訂正に感謝だ
0872132人目の素数さん
垢版 |
2020/08/08(土) 11:24:32.96ID:FvlAeRBY
>>871
おまえこそもちつけ。
再帰は、再帰の停止条件と、自分自身が行う作業に分離できる。
この場合の停止条件は、要素が1つになったときと考えるのが自然だろう。
数学的には要素が0でもよいし、Rの場合はそれでうまくいくから問題はない。だが、そういった詳細を何も説明せずにこれでよい、と示すのはどうかな?
あと、絶対値を取ったのを代入しているのは、この作業が複雑になった場合の修正の確実さを優先するためで、優秀なバイトコンパイラであれば速度の差はなくなる。
0873132人目の素数さん
垢版 |
2020/08/08(土) 23:06:27.95ID:UlZ+DmHh
一人だけエラー吐いて、まともに動かない関数書いた無能が、
それでも、恥ずかしげもなく、一生懸命マウント取ろうとあがく姿は、
滑稽で哀れになってくるわ
0874132人目の素数さん
垢版 |
2020/08/13(木) 17:34:36.29ID:5b54QocS
>859がrec.prod(1:13)であっさりオーバーフローしてしまうのは、integer型だから
の意味が理解できなくて、実験してみた。

> rec.prod <- function(x) {
+ l <- length(x)
+ if (l == 0)
+ return(1)
+ x1.a <- abs(x[1])
+ if (l == 1)
+ x1.a
+ else
+ x1.a * rec.prod(x[-1])
+ }
>
>
> rec.prod(1:13)
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow
> rec.prod(as.numeric(1:13))
[1] 6227020800
> rec.prod(c(1,2,3,4,5,6,7,8,9,10,11,12,13))
[1] 6227020800
> rec.prod(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L))
[1] NA
Warning message:
In x1.a * rec.prod(x[-1]) : NAs produced by integer overflow

integer型のデータだとオーバーフローしちゃうけど、as.numericでdouble型にするとエラーがでない。

一方、

> f <- function(x){
+ if(length(x) == 0) return(1)
+ abs(x[1]) * f(x[-1])
+ }
> f(1:13)
[1] 6227020800
> f(as.numeric(1:13))
[1] 6227020800
> f(c(1,2,3,4,5,6,7,8,9,10,11,12,13))
[1] 6227020800
> f(c(1L,2L,3L,4L,5L,6L,7L,8L,9L,10L,11L,12L,13L))
[1] 6227020800
>

とエラーがでないなぁ。

何故だろう?
0875132人目の素数さん
垢版 |
2020/08/20(木) 13:26:56.75ID:mPUCNi08
Package ‘XXX’ was installed before R 4.0.0: please re-install it
とメッセージがでてXXXをインストールすると次は

Package ‘YYY’ was installed before R 4.0.0: please re-install it
とでてきてうんざりしていた。

stackoverflow.comで以下の答をみつけて解決した。

.libPaths()
update.packages(ask=FALSE, checkBuilt=TRUE)
0876132人目の素数さん
垢版 |
2020/09/09(水) 22:54:07.12ID:IR7822fG
ありがとうございます
0877132人目の素数さん
垢版 |
2020/10/19(月) 07:15:12.45ID:21zikI9w
PならばQ をパイプで P %=>% Q として論理演算で遊んでみた。

"
問題 : 「シリツ医 ならば (馬鹿 ならば 裏口 である)」という命題と同値な命題はどれか?

1 : シリツ医 ならば (裏口 ならば 馬鹿 である)
2 : 馬鹿 ならば (シリツ医 ならば 裏口 である)
3 : 馬鹿 ならば (裏口 ならば シリツ医 である)
4 : 裏口 ならば (シリツ医 ならば 馬鹿 である)
5 : 裏口 ならば (馬鹿 ならば シリツ医 である)
"

# PならばQ ≡ (P かつ (Qでない))ではない
'%=>%' = function(P,Q) !(P & !Q)
# premise
A = function(S,B,U) S %=>% (B %=>% U)

# choice
B1 = function(S,B,U) S %=>% (U %=>% B)
B2 = function(S,B,U) B %=>% (S %=>% U)
B3 = function(S,B,U) B %=>% (U %=>% S)
B4 = function(S,B,U) U %=>% (S %=>% B)
B5 = function(S,B,U) U %=>% (B %=>% S)

# premise => choice
C1 = function(S,B,U) A(S,B,U) %=>% B1(S,B,U)
C2 = function(S,B,U) A(S,B,U) %=>% B2(S,B,U)
C3 = function(S,B,U) A(S,B,U) %=>% B3(S,B,U)
C4 = function(S,B,U) A(S,B,U) %=>% B4 (S,B,U)
C5 = function(S,B,U) A(S,B,U) %=>% B5 (S,B,U)

# combination grid of TRUE & FALSE
gr=expand.grid(c(T,F),c(T,F),c(T,F))

# test for premise => choice
all(mapply(C1,gr[,1],gr[,2],gr[,3]))
all(mapply(C2,gr[,1],gr[,2],gr[,3]))
all(mapply(C3,gr[,1],gr[,2],gr[,3]))
all(mapply(C4,gr[,1],gr[,2],gr[,3]))
all(mapply(C5,gr[,1],gr[,2],gr[,3]))
0878132人目の素数さん
垢版 |
2020/10/19(月) 07:15:28.30ID:21zikI9w
# choice -> premise
D1 = function(S,B,U) B1(S,B,U) %=>% A(S,B,U)
D2 = function(S,B,U) B2(S,B,U) %=>% A(S,B,U)
D3 = function(S,B,U) B3(S,B,U) %=>% A(S,B,U)
D4 = function(S,B,U) B4(S,B,U) %=>% A(S,B,U)
D5 = function(S,B,U) B5(S,B,U) %=>% A(S,B,U)

# test for choice -> premise
all(mapply(D1,gr[,1],gr[,2],gr[,3]))
all(mapply(D2,gr[,1],gr[,2],gr[,3]))
all(mapply(D3,gr[,1],gr[,2],gr[,3]))
all(mapply(D4,gr[,1],gr[,2],gr[,3]))
all(mapply(D5,gr[,1],gr[,2],gr[,3]))
0879132人目の素数さん
垢版 |
2020/11/17(火) 19:55:57.27ID:UJMPy762
,で文字列を分けようとしたらうまくいかなかったがHELPをみたら解説してあった。

> #.で文字列を分ける
> unlist(strsplit('3.14','.'))
[1] "" "" "" ""
> unlist(strsplit('3.14','\.')
Error: '\.' is an unrecognized escape in character string starting "'\."
>

> unlist(strsplit('3.14','[.]'))
[1] "3" "14"
> unlist(strsplit('3.14','.',fixed=TRUE))
[1] "3" "14"
0880132人目の素数さん
垢版 |
2020/11/17(火) 20:18:32.66ID:/TSutyYc
unlist(strsplit("3.14", "¥¥."))
人に見てもらいたかったら読みやすく書けよ。アンタのプログラムはいつも読みにくい。
0882132人目の素数さん
垢版 |
2020/12/10(木) 02:17:40.15ID:Whv7aYu3
数値積分をさせていたら
初めてみるこんなエラーが返ってきた。
roundoff error is detected in the extrapolation table

困ったときのstackoverflow.comで
https://stackoverflow.com/questions/56384330/integrate-function-returning-roundoff-error-after-working-previously

As for the integration problem, package cubature generally does a better job when integrate
と解決法が記載されていた

integrate(fn, lower, upper)$value
でエラーが返ってきたが、
cubintegrate(fn, lower,upper, method='pcubature')$integral
とするとエラーなしに計算してくれた。

(備忘録)
0883132人目の素数さん
垢版 |
2020/12/12(土) 23:25:15.53ID:DvLXeu4z
それエラーが出るべきなのに出ない誤りなんじゃ、って可能性はないの?
0884132人目の素数さん
垢版 |
2020/12/13(日) 08:12:33.91ID:xmsEH+j9
>>883
別スレの問題を「プログラムで面積を数値計算させていたらエラー発生

体験したければ読みにいコードの下記をどうぞ。

r= 0.66017210648907 ; s=2.89088405538017

# 面積計算にintegrate で エラー
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE= integrate(blue,b0,c+s)$value*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=integrate(green,-r,b0)$value*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)


# 面積計算にcubintegrate でエラーなし
library(cubature)
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE= cubintegrate(blue,b0,c+s,method="pcubature")$integral*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=cubintegrate(green,-r,b0,method='pcubature')$integral*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)
0885132人目の素数さん
垢版 |
2020/12/13(日) 08:15:08.06ID:xmsEH+j9
入力の省力化にこんな関数を道具箱に詰めた

# 定積分
integral <- function(fn,lwr,upr,...){
cubature::cubintegrate(fn,lwr,upr,method='pcubature',...)$integral
}
0886132人目の素数さん
垢版 |
2020/12/13(日) 09:32:37.11ID:xmsEH+j9
>>884
library(MASS)にareaという面積計算の関数があるのを思い出したのでやってみた。

library(MASS)
r= 0.66017210648907 ; s=2.89088405538017
# 面積計算にMASS::area
sub <- function(c,Area1=1){ # c 円Cの中心のx座標
b0=(c^2+r^2-s^2)/(2*c) # B(b0,b1) # 円Cと円Oの交点Bの座標
b1=sqrt(r^2-(c^2+r^2-s^2)^2/(4*c^2))

blue = function(x) sqrt(s^2-(x-c)^2) # 円Cの方程式
BLUE=area(blue,b0,c+s)*2 # 青の面積
green = function(x) sqrt(r^2-x^2) # 円Oの方程式
GREEN=area(green,-r,b0)*2 # 緑の面積

GREEN+BLUE-Area1 # GREEN+BLUE=1
}
sub=Vectorize(sub)
x=seq(-r-s,r-s,length=100) ; plot(x,sub(x),pch=19) ; abline(h=0,lty=3)

こっちはエラーがでない。
0887132人目の素数さん
垢版 |
2020/12/21(月) 20:43:26.34ID:gcvC1Sv7
func <- function (...) {
return(anova(...))
}
func(fit1, fit2, fit3)
オブジェクトの引数をうけとって、関数内の関数anovaに渡して
ちゃんと動かすにはどうしたらいいですか?
0889132人目の素数さん
垢版 |
2020/12/23(水) 11:45:33.99ID:DPeLDm1M
>>887
> mydata <- data.frame(x = runif(10), y = runif(10), z = runif(10))
> xy <- lm(y ~ x, data = mydata)
> zy <- lm(y ~ z, data = mydata)
> func <- function (...) {
return(anova(...))
}
> func(xy, zy)
Analysis of Variance Table

Model 1: y ~ x
Model 2: y ~ z
Res.Df RSS Df Sum of Sq F Pr(>F)
1 8 0.40535
2 8 0.39312 0 0.012234

ちゃんと動くけど。
何がどう問題なのかを明確にして質問しないと助言を得られないよ。
0890132人目の素数さん
垢版 |
2021/01/03(日) 22:00:14.73ID:8tLYm46h
やっぱり、パッケージになっている関数は高速だな。
1万までの素数を求める

> rm(list=ls())
> primes <- function(n) (1:n)[-outer(2:n,2:n)][-1]
> system.time(primes(10000))
user system elapsed
0.60 1.92 2.88

> rm(list=ls())
> library(numbers)
> system.time(Primes(10000))
user system elapsed
0.00 0.00 0.03
0891132人目の素数さん
垢版 |
2021/01/21(木) 00:00:54.88ID:KZXQ/VTY
時刻と、その時に従業員がいた場所(住所)がデータとして一覧化されていて、
いつ、どこによくいるかをクラスタリングしたいのですがRは出来るのでしょうか?
0893132人目の素数さん
垢版 |
2021/02/14(日) 11:56:55.00ID:g9kE6hlo
IPB size
1 I 82571
2 B 4909
3 B 230
4 B 231

こんな感じのデータフレームを複数ファイルを読み込んで
ファイル別に横につなげる場合どのようにfor文を書けばいいですか?
0896132人目の素数さん
垢版 |
2021/03/16(火) 13:05:28.85ID:cJpJJpsg
# 振幅1の正弦波の一周期の長さを求めよ
の計算に、一般化して計算できるように関数を書いてみたのだが、
文字列での入力が必要でどうも美しくない。

# 関数y=f(x)の曲線でx=from からx=toまでの長さを求める

CurveLength <- function(f='sin(x)',from=-pi,to=pi){
str=paste("deriv(~ ",f,",","'x',func=TRUE)")
Df <- eval(str2lang(str))
f1 <- function(x) as.numeric(attributes(Df(x)))
f1=Vectorize(f1)
integrate(function(x) sqrt(1+f1(x)^2), from, to, rel.tol = 1e-12)
}

計算としてはあっていると思う。
> CurveLength()
7.640396 with absolute error < 2.6e-13

> CurveLength('log(1+cos(x))',0,pi/2)
1.762747 with absolute error < 2e-14

もっとエレガントなコードがあればご教示をお願いします。
0899132人目の素数さん
垢版 |
2021/06/05(土) 21:13:05.02ID:5b0TiKZo
R version 4.1.0 (2021-05-18) -- "Camp Pontanezen" になってパイプに標準で対応したのは嬉しい。
function(x) が \(x)と略記可能になった。

ちょっと練習

f <- \(x) sample(100,x,rep=TRUE)
f(50) |> sort() |> unique() |> length()

> f <- \(x) sample(100,x,rep=TRUE)
> f(50) |> sort() |> unique() |> length()
[1] 40

詳細は
https://cran.r-project.org/bin/windows/base/NEWS.R-4.1.0.html
0900132人目の素数さん
垢版 |
2021/06/06(日) 12:41:44.43ID:X+DUyz8T
Vectorize()もパイプで受けてくれた。

(\(n) sample(10,n, replace = TRUE) |> unique() |> sort()) |> Vectorize() -> f.new
f.new(1:5)

f.old <- Vectorize(function(n){
sort(unique(sample(10,n,replace = TRUE)))})
f.old(1:5)
0901132人目の素数さん
垢版 |
2021/06/06(日) 12:54:15.47ID:X+DUyz8T
|> curve()は描画されなかった。

(\(x) sqrt(1-x^2)) |> Vectorize() |> curve()

> (\(x) sqrt(1-x^2)) |> Vectorize()) |> curve()
Error: unexpected ')' in "(\(x) sqrt(1-x^2)) |> Vectorize())"


(\(x) sqrt(1-x^2)) |> Vectorize() -> fn
curve(fn)
1/4円を描画
0902132人目の素数さん
垢版 |
2021/06/06(日) 22:14:15.22ID:X+DUyz8T
パイプで速度が落ちるかと思ったけど変わらないね。

> (\(x) sample(1000,x,replace=TRUE) |> sort() |> unique() |> length()) -> f.new
> system.time(replicate(1e5,f.new(5000)))
user system elapsed
28.66 0.01 28.70

> f.old <- function(x) length(unique(sort(sample(1000,x,replace=TRUE))))
> system.time(replicate(1e5,f.old(5000)))
user system elapsed
28.65 0.00 28.67
0903132人目の素数さん
垢版 |
2021/06/06(日) 22:37:59.70ID:jjPG368x
そのパイプを使ったコードをquote関数に噛ませば分かるけど実際はパーサーが下のコードに変換してるだけらしい。
なので実態としては演算子や関数ではないのでオーバーヘッドが生じないとのこと。
0904132人目の素数さん
垢版 |
2021/06/08(火) 05:41:54.05ID:uSV089kB
>>903
レスありがとうございます。早速、やってみました。

> quote((\(n) sample(10,n, replace = TRUE) |> unique() |> sort()) |> Vectorize())
Vectorize((function(n) sort(unique(sample(10, n, replace = TRUE)))))
0905132人目の素数さん
垢版 |
2021/06/08(火) 06:02:44.83ID:uSV089kB
dplyrのパイプ%>%だと他に引数がないときは関数の()は省略できるけど
今回、搭載された|>は()がないとエラーになるな。

> library(dplyr)
> sample(10,10,replace=TRUE) %>% sort
[1] 1 2 4 5 6 7 7 7 7 8
> sample(10,10,replace=TRUE) %>% sort(decreasing = TRUE)
[1] 9 9 7 6 5 5 3 1 1 1

> sample(10,10,replace=TRUE) |> sort
Error: The pipe operator requires a function call as RHS
> sample(10,10,replace=TRUE) |> sort()
[1] 3 4 5 5 6 6 8 8 8 10
> sample(10,10,replace=TRUE) |> sort(decreasing = TRUE)
[1] 10 10 9 8 7 7 6 6 5 2
0906132人目の素数さん
垢版 |
2021/06/08(火) 06:10:22.55ID:uSV089kB
パイプで送る関数に引数が1個なら自分でパイプを定義するのと変わらないなぁ。
オンラインで実行できるサイトだと必ずしも最新版のRに対応していないし、外部ライブラリ非対応のところもあるので
自分でパイプを定義の方がいいかも

'%|%' <- function(x,FUN) FUN(x)

> sample(10,10,replace=TRUE) %|% sort %|% unique
[1] 1 3 5 6 7
0907132人目の素数さん
垢版 |
2021/08/29(日) 23:23:03.95ID:OFN46wh5
# 備忘録

hogehoge <- function(x){
cat(deparse(substitute(x)),'=',x,'\n')
}
ch='Swiss'
hogehoge(ch)

> hogehoge(ch)
ch = Swiss
0908132人目の素数さん
垢版 |
2021/11/05(金) 22:47:20.72ID:lTyg7nhh
これ↓、思ったように動かないけど、普通?
iris[any(iris[,3]==c(6.1,5.1)) ,]

いまいちR言語の仕様がわからん。
0909132人目の素数さん
垢版 |
2021/11/05(金) 23:38:14.16ID:I43ryX9p
何をしたいのか説明できない理系脳かな?
適当に推測するに、
iris[iris[, 3] %in% c(6.1, 5.1), ]
0911132人目の素数さん
垢版 |
2021/11/06(土) 21:45:56.76ID:8hjJFETA
SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?

Rの有利な点は表を容易に分割→編集→結合できる点で、Accessの有利な点はクエリを何段にも重ねることで表を視覚的に扱えることだと思うんだけど、どうかな?

要約すると、細かいとこに手が届くのと、そうではないけど直感的なところ。
0912132人目の素数さん
垢版 |
2021/11/06(土) 21:53:39.63ID:8hjJFETA
SQLがAccessの例に限定されちゃってるね。
でも同じように文字で書くなら、Rの方が便利に思えるな。

Officeが使える環境でR使ってるから、Rだけの環境に移行すればどんな不便が発生するか検討中なんだけど、どう思う?
0913132人目の素数さん
垢版 |
2021/11/08(月) 19:14:28.35ID:xqrS4yV9
>>911
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
0914132人目の素数さん
垢版 |
2021/11/08(月) 19:14:46.14ID:xqrS4yV9
>>911
> SQL(例えばAccess)とRの、データ分析に関する違いって何だと思う?
何を言っているのか分からないが、用意されいている分析手法の豊富さが全く違うだろ。
例えば、多重検定の検定法とかSQLにあるの?ノンパラメトリックの多重検定とかちゃんとできるの?
0915132人目の素数さん
垢版 |
2021/11/09(火) 20:40:06.49ID:hGmtIAbe
そうだよね。
組み合わせて使うもんだよね。SQLとRは。
ただ、境界線をどこで引くべきか微妙なところで悩む。RだとRStudioのレポートとして残せるから、分析手順を残していくことを考えると極力R使った方がいいのかな。
0916132人目の素数さん
垢版 |
2021/12/04(土) 13:16:48.05ID:3GLpEIlX
いや、SQLとRは全くの別物だろ
SQLはデータベースのマネジメントシステムで、
Rはデータ分析のツールじゃん
0923132人目の素数さん
垢版 |
2022/03/02(水) 03:27:08.75ID:RV9q7yNr
今更レスだけどなんでaccessと比べるのか、excelじゃねーの

excelは商用だけあって機能的には検定回帰成分分析因子分析何でもできてRに劣るところは無いし、統計以外なら最適化が強い

Rより遅いしVBAは醜いし、365なんていきなり環境ぶっ壊されかねないからRに安住するけど
0924132人目の素数さん
垢版 |
2022/03/02(水) 03:30:48.43ID:RV9q7yNr
インタラクティブに使う分にはCSE使えるexcelの方が便利だな
ぜひともRに取り入れたい機能の一つ
0925132人目の素数さん
垢版 |
2022/03/02(水) 03:42:31.09ID:RV9q7yNr
excelで巨大データ扱うにはaccessインテグレーション機能で補完し合うといいとは聞くけど、俺のアカデミック割のofficeではaccessはハブられてた悲しみ
0928132人目の素数さん
垢版 |
2022/03/18(金) 15:05:36.24ID:Z+B2NJF6
contourのzlimはどう設定すればよいのでしょうか?

https://navaclass.com/mahalanobis/
ユークリッド距離のzlimは
contour(x,y,z.E,zlim=c(0,3),nlevels = 5,add=T)
のようにzlim=c(0,3)に設定されているのですが、
マハラノビス距離のzlimは
contour(x,y,z.D,zlim=c(0,1),nlevels = 5,labels="", add=T)
のようにzlim=c(0,1)に設定されています。

確かに、ユークリッド距離のほうは(1, 1)の点が1.0の等高線上にありますし、
マハラノビス距離のほうもAは0.75、Bは2.2という距離に相応しいところに点があります。

ただ、zlim=c(0,3)の意味はきっと0から3までの範囲に限るという意味なんでしょうが、
z.Eとの値も見ても3で区切られているようには見えません。
実験してみましたが、z.Eのほうのzlimは3.5、z.Dのほうのzlimは1.4で等高線が変化するようです。

これでは新たな相関係数を使ったときにどう設定すればよいのか分かりません。
どうか教えて下さい。
0929132人目の素数さん
垢版 |
2022/03/18(金) 15:25:12.51ID:3f0eXSLb
>>928
xlim, ylimは指定した値でスパッと切るわけではないので(前後に余裕を持たせるようになっている)、
zlimも同じ仕様だと想像するよ。
xlimやylimで指定した特定の値でスパッと切るオプションがあったと思うので、
zlimにも有効でないかどうか、そこから調べて見れば?
0930132人目の素数さん
垢版 |
2022/03/18(金) 17:48:09.58ID:Z+B2NJF6
>>929
ありがとうございます。
今、いろいろ計算した結果、等高線の位置自体は正しいことが判りました。
ただ、問題は等高線の刻みがzlimと相関係数の組み合わせによって変わることです。
具体的には、等高線が0.5刻みになったり1.0刻みになったり0.25刻みになったりします。
にもかかわらずnlevelsは5本のままなので、全体が膨らんだり縮んだり、見た目が全然違ってくるんですよね。
その度に手でzlimの値を1とか3とか5に変えてあげないといけません…これらの数字はまったく理解できません。

なので質問を変えさせていただいて、
相関係数が0以外の時でも等高線上に0.5, 1.0, 1.5, ...などのラベルを強制的に表示する方法は無いでしょうか?
相関係数が0(つまりユークリッド距離)の時は等高線上にそれらの数値が表示されます。
それが相関係数が0.1にでもなった途端に表示されなくなります
(数値表示用に輪が途切れた形でブランクは空いているようなのですが)。
等高線上に0.5, 1.0, 1.5, ...などのラベルが表示されるようになれば、上記の問題も許容できると思います。

余談ですが、
>スパッと切るオプション

調べてみると、xaxs="i"のことのようですね。
"r"だとグラフの端に4%の余白があったのが"i"だと無くなりました。
0931132人目の素数さん
垢版 |
2022/03/18(金) 18:10:24.04ID:Z+B2NJF6
すみません、labels=“”になっているというオチでした。
とりあえず、これで問題ないか確認します。
0932132人目の素数さん
垢版 |
2022/03/21(月) 13:18:24.75ID:k7XqFrKG
ご助力をいただきたく、質問いたします。

対象データ
データフレームA内のB列, <chr>型 中身は例として 文字列で"2022/02/24"が入っている。

やりたいこと
この文字列をRのDate型に変換したい

やってみたこと。
tidyverseを用いて
A %>% select(B) %>% as.Date()
これだとエラーが出ました。
エラー文は「'.'からクラス"Date"へ変換はできません」

どうやったらこのB列をRのDate型に変換できますでしょうか。
0933132人目の素数さん
垢版 |
2022/03/21(月) 15:20:29.09ID:SKGsv+wa
>>932
パイプ処理したいならlubridateパッケージが便利です。チートシート(英語)が公開されているので、使い方は確認してみてください。

パッケージ名のスペル間違ってたらごめん。
0934132人目の素数さん
垢版 |
2022/03/21(月) 17:46:23.39ID:qn67+d1x
>>932
変換できない理由は、dplyr::select()関数の返り値がdata.frame型で
as.Date()関数の引数がベクトル型でなければならないからです。
なので、

as.Date(A$B)

とすれば、Date型でベクトルな返り値を得ることができます。tidyverseを
使いたい(というかパイプで処理したい)なら

A %>%
.$B %>% # ベクトルとして取り出す
as.Date()

となります。
返り値をdata.frame型で得たい場合は、dplyr::mutate()関数を使って

A %>%
dplyr::select(B) %>%
dplyr::mutate(B = as.Date(B))

とします。

tidyverseは、基本的にデータフレームを入力としデータフレームを出力と
しますので、列をベクトルとして処理したい場合はmutate()関数を使う必要が
あります。
0935132人目の素数さん
垢版 |
2022/03/21(月) 20:28:10.47ID:k7XqFrKG
>933様
>934様
ご教示ありがとうございます。
参考にまずは試してみます。
0936132人目の素数さん
垢版 |
2022/03/22(火) 07:49:54.09ID:kcYWMWlK
>>932
selectじゃなくてpullにすれば動くよ
0937132人目の素数さん
垢版 |
2022/03/22(火) 12:12:27.45ID:CNKDZNvw
pull()は知らなかったけど引数を二つ指定するとnamed vectorも作れるんだな。
0938132人目の素数さん
垢版 |
2022/03/25(金) 19:24:11.66ID:YaAd0nW/
借金を返す手段は大増か
踏み倒し(=ハイパーインフレ)の2者選択。
今、日本はお金をどんどん刷って紙幣価値を下げ、
後者の道をまっしぐら。

「税金で借金を返せる難易度ランキング」

1位 日本     257%
2位 スーダン   210%
3位 ギリシャ   207%
4位 エリトリア  175%
5位 カーボベルデ 161%
6位 イタリア   155%
7位 スリナム   141%
://twitter.com/fujimaki_takesi/status/1505469787174227973?s=20&t=3LeCpoO4fcZVopj2x8b9Dw

         日本から始まる世界的株式市場の大暴落

それが最終的な暴落であることがはっきりするや否や、
マ仆レーヤは出現するでしょう。
マ仆レーヤが公に世界に現れるにつれて、
UFOがとてつもない数で姿を表すでしょう
https://twitter.com/5chan_nel (5ch newer account)
0939132人目の素数さん
垢版 |
2022/03/27(日) 21:47:05.79ID:nv2FRWMk
質問いたします。よろしくお願いいたします。

ベクトル
a <- c(1, 2, 3, 3, 5, 5, 7) #1:7と連番にしたいが、一部値が重複している想定です
に対して、重複を修復するために

df <- data.frame(b=a, c=lag(a, default=a[1]-1))
apply(df, 1, function(x){ifelse(x[1]==x[2], x[1]+1, x[1])})

としましたが、applyを使っているのでかなり遅いです。
質問1:applyを使わない高速化できる手段はないでしょうか。
質問2:ifelseがベクトルに作用すると聞いたので(お恥ずかしいw)
    ifelse(df$b == df$a,
としようとしたのですがエラーが出ました。
  ifelseは異なる2つのベクトル(行数同じとしても)には作用できないのですね?
0940132人目の素数さん
垢版 |
2022/03/27(日) 21:55:41.37ID:C7ecChkw
>>939
何をどうしたいのか、具体的に書いてくれ。
何がしたいのか、さっぱりわからん。
c(1, 2, 3, 3, 5, 5, 7) を 1:7 にしたいだけなら、seq(along=a) でよいが、前と同じ値の場合は、前の値に1を足すというのであれば、rle を使えばなんとかなりそう。
0941132人目の素数さん
垢版 |
2022/03/27(日) 22:01:16.21ID:BmY4vlnd
質問が下手だと答えてもらえないぞ。
0942132人目の素数さん
垢版 |
2022/03/27(日) 22:03:58.44ID:nv2FRWMk
>>940
すいませんでした。詳しく書くと、
cベクトルにはcsvから読み込んだ、時間データの秒数が整数値で入っています。
(・csvデータには他に、時間データの年、月、日、時、分、秒、と
 全て整数値がそれぞれ別の列で入っています。
・このcsvデータは1秒サンプリングです。

ただそのデータは秒がたまに重複しているのです。
重複している時のルールとして、直前の、1秒前の時間の秒が秒列に入っています。
例で挙げたように
1, 2, 3, 3, 5, 5, 7, 8, 9, 9

この重複を訂正したいのです。
そこで考えたのが 939で挙げたスクリプトだったのですが、
あまりにも遅く(1日分のデータ24*60*60行を訂正するのに)
質問いたしました。
0943132人目の素数さん
垢版 |
2022/03/27(日) 22:13:43.93ID:UiNoGcwm
おれもさっぱり質問の意図が理解できないが、重複除去なら集合演算の
b <- unique(a)
でbは
> b
[1] 1 2 3 5 7
になるよ。
0944939
垢版 |
2022/03/27(日) 22:17:25.42ID:nv2FRWMk
>>943
回答ありがとうございます。わかりづらくてすいません。
重複除去ではなく、重複のです。
942に書いたように、
秒データが
1,2,3,4,5,6,7,8
とあるべきところが
1,2,3,3,5,5,7,8
のように4秒のところが直前の3秒に、6秒のところが直前の5秒になっています。
これを修正したいのです。
0945132人目の素数さん
垢版 |
2022/03/27(日) 22:24:40.36ID:BmY4vlnd
そういうことか。
なら
a <- 1:8
で置換しちゃえばいいんじやないの?
てかまず国語を勉強しよう。
0946939
垢版 |
2022/03/27(日) 22:30:24.14ID:nv2FRWMk
>>945
ありがとうございます。
確かに国語力ないですね、今から考えると、、、
必要な前提を書ききれていません。

さらに必要な前提は、データが24*60*60秒分全部なく、1、2秒分抜けているのです。
0947132人目の素数さん
垢版 |
2022/03/27(日) 22:34:34.62ID:C7ecChkw
例が悪いね。
本当に1秒ごとに確実にデータが来ているなら、seq でも使って新たに値を作ればいいのだが、
きっと、途中でデータが来ない場合もあるのだろう。
例としては、c(1, 2, 2, 2, 9, 9, 11) のようなほうがよいのでは?
この場合、c(1, 2, 3, 4, 9, 10, 11) という答えになればよいのだろう。

r <- rle(a)
res <- lapply(seq(along=r$length), function(i) seq(r$values[i], len=r$length[i]))
do.call(c, res)

これでできると思うが、これで遅いなら、重複のところだけを修正するようにすればよい。
0950939
垢版 |
2022/03/27(日) 22:38:26.76ID:nv2FRWMk
>>947
ありがとうございます。
参考に考えてみます。

>>948
返す返す申し訳ないです、、
0951939
垢版 |
2022/03/27(日) 22:41:51.48ID:nv2FRWMk
>>949

データの特徴は、
1。重複は2つ。
2。データの抜けは想定できない。
  1日に5分ほどのこともあれば(付け加えて言うと、1日のデータをファイルに保存している)
1日に1から3秒ほどの時もあります。(この時は、1日のデータをファイルに保存していない時)
0952132人目の素数さん
垢版 |
2022/03/27(日) 22:42:10.78ID:UiNoGcwm
ヘタに抽象化せずに
隠さずに具体例を挙げて
FromとToを書けば無駄なやり取りをせずにすむ。
0954132人目の素数さん
垢版 |
2022/03/27(日) 22:47:45.39ID:colv4Rae
まあ、落ち着け。時間データをクレンジングしたいんだとは思うけどもう少し元データについて整理しなされ。
0955939
垢版 |
2022/03/27(日) 22:57:08.96ID:nv2FRWMk
>>953
>>954
ありがとうございます。

データが多いので、下手に抽象化してしまいましたが、
今手元のデータ例では、19:15:26のデータから秒列だけ上げると
下記のように19:15:36から秒列が重複することを始めます。
これが終了するのはデータによりけりで不明です。
26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45
0957132人目の素数さん
垢版 |
2022/03/28(月) 00:36:05.49ID:wfEbVN/P
これなら、修正箇所が少なくても多くてもパフォーマンスは変わらないはず。

comp.before <- function(x) {
# x の NA を直前の値で補完する.
valid <- !is.na(x) # NA でない(有効な)場所
v <- x[valid] # 有効な値
n <- diff(c(which(valid), length(x)+1)) # それを繰り返す回数
rep(v, n)
}

a <- c(1, 2, 2, 2, 9, 9, 11)

s <- seq(along=a) # 1から始まる等差数列
d <- ifelse(c(FALSE, diff(a) == 0), NA, s - a) # s から a の正しい部分を復元するための差
res <- s - comp.before(d) # 重複部分を修正するには、正しい部分の d を引き継げばよい
0958132人目の素数さん
垢版 |
2022/03/28(月) 01:12:01.08ID:srY6abow
>>955
寝る前だったので、秒の部分だけでサンプルデータコードにしているので、そこは、
適宜、実際のデータに合わせて修正して。

library(tidyverse)

data.frame(
time = c(26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45)
) %>%
dplyr::mutate(diff = time - dplyr::lag(time, default = 0)) %>%
dplyr::mutate(new = dplyr::if_else(diff == 0, time + 1, time))

データ重複が2連続だけというのが前提です。3連続以上の場合は、最後の行の
処理を参考に追加してみてください。
0959939
垢版 |
2022/03/28(月) 11:11:48.47ID:H+9Gp8uW
>>958
ありがとうございます。
なるほど、if_elseをそのように使うのですね。
条件の中で二つのベクトルを使ってダメだったので、諦めてました。
勉強になりました!!
0960132人目の素数さん
垢版 |
2022/03/28(月) 11:56:48.44ID:srY6abow
>>959
lag()関数のdefault引数の指定があまりよくないので、
こちらの方が良いでしょう。処理手順を分かりやすく
するために処理を分割しています。
ただし、元データに欠損値(NA)がある場合は、意図した
結果を得られない場合がある点には注意してください。

data.frame(
time = c(26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 35, 37, 37, 39, 39, 41, 41, 43, 43, 45)
) %>%
dplyr::mutate(lag = dplyr::lag(time)) %>%
dplyr::mutate(diff = time - lag) %>%
dplyr::mutate(new = dplyr::case_when(diff == 0 ~ time + 1,
diff != 0 ~ time,
is.na(diff) ~ time))
0961939
垢版 |
2022/03/28(月) 12:17:31.10ID:H+9Gp8uW
>>960
なるほど、さらにありがとうございます。
case_whenやis.na関数を使って、例外処理をなさっているのですね。
非常に勉強になりました。
確かに私があげていたlag関数でのdefault設定だと例外だというのが後で見てわかりづらいですね。
ありがとうございました!!
0963939
垢版 |
2022/03/28(月) 14:04:18.16ID:6B8xjzPg
>>962
すいません、前提をいろいろ省略していて、、、
そこは条件文の重ね書きか、modをつかって解決しようとかんがえてました
0964132人目の素数さん
垢版 |
2022/03/28(月) 17:02:57.35ID:srY6abow
日付も含んだ日時情報として記録されている、もしくは、正しい日付を補完できる
のであれば、POSIXタイムで処理すれば分またぎも日またぎも対応できるかと。

2022/2/28 23:59:58
2022/2/28 23:59:59
2022/2/28 23:59:59
2022/3/1 00:00:01
2022/3/1 00:00:02

こんな感じのデータでも3行目を「3/1 00:00:00」に修正できるかと。

データが飛んでたりするなら>>957さんの処理を応用すれば良いかと。
0965939
垢版 |
2022/03/28(月) 19:37:40.90ID:H+9Gp8uW
>>964
そこは正直迷いました、タイムデータを作るのが先か、秒を修正するのが先か。
まずは、秒修正を先にしたのが、Rでのタイムデータの操作と数値データ操作が
どっちが早いかわからなかったので、まずはとっつきやすい数値データを修正して時間データにすることにしたのです。

>>957
礼を述べるのが遅れてすいません。
データが飛んでるところを修正するのに使用いたします。ありがとうございます!!
0966132人目の素数さん
垢版 |
2022/03/31(木) 14:09:36.00ID:MFVXsplM
こちらでrstanarm のパッケージを使っている方はいらっしゃいますでしょうか?

rstanarm のstan_glm関数を使って簡単な回帰式の練習をしています。
シグマの事前分布として
prior_aux = exponential(0.0008) を設定したいのですが、
Error: '8e-04' is not a supported link for family 'exponential'.(以下略)
というエラーメッセージが出て止まってしまいます。

引数を(autoscale = TRUE) と変えてみても、
Error in exponential(autoscale = TRUE) :
unused argument (autoscale = TRUE)
が出て止まってしまいますので、どうも()内を認識してくれないようです。

もし対処の方法をご存じの方がおられましたら、ご教示いただければ
ありがたく存じます。
0967132人目の素数さん
垢版 |
2022/03/31(木) 23:46:22.65ID:YJpZ/tmn
>>966
exponentialがrstanarmからじゃなくて他のパッケージから呼び出されてるとか?
試しにrstanarm::exponential(0.0008)で試してみては?
0968132人目の素数さん
垢版 |
2022/04/01(金) 00:14:55.42ID:zUpPvDgR
ホントは一両日日跨ぎデータはスピノール的な情報として扱わないと
西から出たおひさまが東に沈む
地球の回転に逆らって高速飛行した時の不具合が出てくる。
0969132人目の素数さん
垢版 |
2022/04/01(金) 00:16:31.25ID:zUpPvDgR
地球一周航海して暦が一日ズレるマゼラン以降の話でもある。

多分ガウスは勘付いてたっぽい。
0970132人目の素数さん
垢版 |
2022/04/01(金) 05:42:17.81ID:kP8tAwPH
>>967

966です。早速ご教示いただきまして、どうもありがとうございました。
ご指摘の通りでした。おかげさまで大変勉強になりました。
重ねて厚く御礼申し上げます。
0971132人目の素数さん
垢版 |
2022/04/06(水) 00:13:06.16ID:0iZ26VyL
POSIXctを使った文字列からの日時時刻表現への変換について教えてください。
あるcsvでうまくいったスクリプトが、別のスクリプトではうまくいってないのです。
いま、下記のようなtest1.csvがあり、
time
2022/4/4 19:19:10
2022/4/4 19:19:11
下記のスクリプトを通して読み込み、整形しました。

files<-dir(pattern="test1", "./")
tmp <- do.all(bind, lapply(files, function(x) read.csv(x, header=TRUE, stringsAsFactors=FALSE)))

newDate <-as.POSIXct(tmp[,1])

この時、
typeof[,1]は"character"となり、
newDate[1]は、"2022-04-04 19:19:10 JST"となります。

ところが、本番で別の(複数の)csvを読み込ませると、
typeof[,1]は"character"となるのですが、
newDate[1]は、"2022-04-04 JST"となり時刻が消えます。
最初にうまくいったtest1.csvの時刻データが
上記の別のcsvの時刻データをコピーして作ったにもかかわらずです。

何か考えられる原因、解決策はないでしょうか。
a <- c("2022-04-04 23:42:10")
0973132人目の素数さん
垢版 |
2022/04/06(水) 00:37:00.36ID:b2LBb0Tv
あくまでも print の仕様であって、中身は問題ないはず。as.numeric してみると1秒ごとに1増えるのがわかるはず。
0974971
垢版 |
2022/04/07(木) 14:27:54.56ID:IW6MEgzS
ご回答ありがとうございます。
それが、as.numericしても値がかわってないのです。なので困惑してます。
0977971
垢版 |
2022/04/07(木) 22:25:10.05ID:pOGo0jeY
>>976
それでした!!

newDate <-as.POSIXct(tmp[,1])

library(lubridate)
newDate<-ymd_hms(tmp[,1],tz="Japan")
で変換したところ、ほぼ全てのデータが時刻まで表示されるようになったのですが、
ごく数個、parse errorとなり、NAに変換されてました。
かくにんすると、元データが、"00:00:00"の時だけ、日付になってました。

助かりました。ありがとうございました。
0978132人目の素数さん
垢版 |
2022/04/17(日) 16:45:16.53ID:2Fhpn5bu
(質問)
データフレーム内で、数値データに文字列'error'が混入しているとき、
どうやって値を、直前の値に変換したらよろしいでしょうか。


(例)
test <- c(1,2,1,4,'error',8,9,8,'error','error','error',1)
df <- data.frame(c)

となっているデータを、'error'を、その直前の値にしたいのです。
この場合、df$testを(1,2,1,4,4,8,9,8,8,8,8,1)に変換したい。

(**上記データは計測器がはくcsvファイルが元ですが、計測ミスでerrorがまぎれこむのです。)
0979132人目の素数さん
垢版 |
2022/04/17(日) 17:54:41.52ID:EAjV4LS9
csvを読み込むときに、na.strings="error"を指定して、957のcomp.boforeで処理すればよい。
comp.beforeは適切な名前ではなく、自分はcomplete.by.prev.valueとしている。
0981132人目の素数さん
垢版 |
2022/04/17(日) 21:14:48.98ID:PPC4aEZX
completeで思い出したけどtidyrパッケージを使うとこんな感じでできる。ネ申エクセルの
縦結合されたセルを処理するときなんかに便利。

NAしか処理してくれないので`error`がNAに置換されている前提のが前提です。

data.frame(
test = c(1,2,1,4,NA,8,9,8,NA,NA,NA,1)
) %>%
tidyr::fill(test)

fill()のリファレンス
https://tidyr.tidyverse.org/reference/fill.html
0982978
垢版 |
2022/04/19(火) 22:25:34.21ID:z85CnNf5
みなさん、ご回答ありがとうございました。
>>980 >>981 さんが教えてくださったfill関数を使ってみたいと思いましたが、
すいません!、データフレーム内のerrorをNAに変換する方法も教えていただけないでしょうか!
0984978
垢版 |
2022/04/19(火) 22:55:17.54ID:z85CnNf5
>>983 さん
ありがとうございました!
なるほど、簡単な手法でさくっとできるのですね、まだまだRになれないと、と痛感しました。みなさん、ありがとうございました!
0986132人目の素数さん
垢版 |
2022/05/01(日) 17:44:32.12ID:Hvezzfn/
質問させてください

csvを読み込ませたいです。
ただし、このcsv、かき特徴があります。

1行目から62行目 いろいろな条件を記載。csvではなく、テキスト。
63行目から ヘッダー含めてcsvファイル形式。
末尾4行 また色々なことを記載。csvではなくテキスト。

最初の62行目までの読み込みをskipさせるのは
read.csv("test.csv", skip=62)
で対処できましたが、末尾4行をスキップさせるのはどうしたら良いでしょうか??
0987132人目の素数さん
垢版 |
2022/05/01(日) 20:51:32.75ID:0HGOHjFC
読み込ませた後に最後の4行を削除させるのではダメ?あくまでも読み込み時にその4行をスキップしたい?
0988132人目の素数さん
垢版 |
2022/05/01(日) 21:02:36.52ID:Hvezzfn/
ありがとうございます。
はい、読み込む時にやりたいです。
後々、フォルダにある数がわからないcsvファイルを一気に読み込んででーたふれーむを作りたいと考えてますので
0990132人目の素数さん
垢版 |
2022/05/01(日) 21:16:51.50ID:Hvezzfn/
ありがとうございます!!!
最高です!これ!ほんとに助かりました!!!
0991132人目の素数さん
垢版 |
2022/05/02(月) 21:52:52.81ID:657pfLds
read.table()のnrowオプションって初めて知った。
前からあったっけ?
0993132人目の素数さん
垢版 |
2022/06/02(木) 19:30:28.80ID:nW18Ocyl
超巨大なデータフレーム(2x10^6行 x 1x10^4列)を扱おうとしてるんだけど、gatherとかしようとするとめちゃくちゃ遅い。高速化のコツとか知ってる人いますか?
0996132人目の素数さん
垢版 |
2022/07/16(土) 23:32:17.16ID:a0oJxJr1
Rで文字列の置換を行いたいのですが、
g = gray, y = yellowとしたいのにg→grayellowとなってしまいます。
正しく置換を行うのはどうすればよいのでしょうか?
0997132人目の素数さん
垢版 |
2022/07/17(日) 11:30:52.27ID:Bwyb6l2P
どういう変換しているか分からないけど、結果を見る限り、gをgra"y"に変換した後にyをyellowに変換してるんじゃ?
0998132人目の素数さん
垢版 |
2022/07/17(日) 12:25:56.34ID:XCTRc04D
>>996
>>997の指摘通りで下のようなことをやっているなら、
> x <- factor(sample(c("g", "y"), 20, TRUE))
> x <- gsub("g", "grey", x)
> gsub("y", "yellow", x)
[1] "greyellow" "greyellow" "greyellow" "yellow" "greyellow" "greyellow"
[7] "greyellow" "yellow" "yellow" "greyellow" "yellow" "yellow"
[13] "greyellow" "greyellow" "greyellow" "greyellow" "yellow" "greyellow"
[19] "greyellow" "yellow"
こうするのではなくて、
> gsub("^y", "yellow", x)
[1] "grey" "grey" "grey" "yellow" "grey" "grey" "grey" "yellow"
[9] "yellow" "grey" "yellow" "yellow" "grey" "grey" "grey" "grey"
[17] "yellow" "grey" "grey" "yellow"
こんな風に正規表現で工夫すればよいのでは。
なお、最も簡単な解決策は、green,yerrowの置換順序をyellow,green逆とにすればよい。
1000132人目の素数さん
垢版 |
2022/07/17(日) 15:05:31.68ID:gDs5lpUJ
>>997
>>998
出来ました、ありがとうございます!
10011001
垢版 |
Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1808日 19時間 42分 19秒
10021002
垢版 |
Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

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