X



トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0109132人目の素数さん垢版2017/09/05(火) 06:09:36.65ID:PCfG056b
耳栓をしたら世界が変わってワロタ
0110132人目の素数さん垢版2017/09/19(火) 11:14:27.03ID:MBqwivnT
Reduce何て便利な関数が標準装備されていたんだな。

?Reduce
Reduce("+", c(1,2,3,4))
Reduce("+", c(1,2,3,4), accumulate = TRUE)
cumsum(c(1,2,3,4))
factorial(4)
Reduce('*',c(1,2,3,4))
Reduce("*", c(1,2,3,4), accumulate = TRUE)
cumprod(c(1,2,3,4))

Reduce("*", c(1,2,3,4), accumulate = TRUE,right=TRUE)
rev(Reduce("*", c(1,2,3,4), accumulate = TRUE,right=TRUE))
cumprod(rev(c(1,2,3,4)))
0111132人目の素数さん垢版2017/09/21(木) 19:43:24.15ID:KStrV4aS
96歳の女性をお看取り。肺も心臓も腎臓も機能低下していたが、年齢を考慮して死因は老衰にした。ふと96歳の平均余命はどれくらいかが気になって平成27年簡易生命表(女)を調べてみた。
http://www.mhlw.go.jp/toukei/saikin/hw/life/life15/dl/life15-07.pdfこういう表をみると自分で計算してみたくなる。諸関数の定義が厚労省の参考資料で解説されているのでRが使えれば計算は容易(ド底辺特殊シリツ医大卒には無理)

## 10万人あたりの死亡数から平均余命を算出
f=c(178,31,20,12,8,8,8,8,7,7,7,7,7,7,8,10,12,13,15,16,17,18,20,21,23,24,25,27,29,
30,31,32,34,37,39,41,43,46,50,56,62,68,73,79,86,94,103,113,123,134,145,159,174,
188,202,215,226,237,251,269,292,319,346,372,401,435,472,510,553,602,661,727,799,
870,952,1053,1180,1331,1503,1698,1914,2153,2419,2708,3011,3320,3628,3926,4227,
4513,4743,4896,4937,4867,4678,4385,4004,3557,3069,2567,2077,1623,1220,880,608,
960)
m=c(201,32,23,15,11,10,10,10,9,8,7,7,8,11,14,17,22,27,33,39,44,47,50,52,53,54,54,
54,54,56,58,59,62,65,70,73,76,79,85,93,103,113,122,131,145,159,176,195,215,237,
259,285,311,341,374,412,451,490,528,572,625,692,767,842,919,1002,1084,1166,1254,
1349,1452,1562,1668,1764,1875,2015,2182,2375,2586,2806,3038,3280,3506,3709,3887,
4024,4089,4088,4037,3944,3803,3555,3243,2887,2507,2122,1749,1403,1095,829,609,
434,298,198,127,180)

LE <-function(ndx,Y,N0=10^5){
n=length(ndx)
lx=numeric(n)
lx[1]=N0
for(i in 1:(n-1))
lx[i+1] <- lx[i] - ndx[i]
nqx=ndx/lx
nLx=numeric(n)
for(i in 1:n)
nLx[i] <- mean(c(lx[i],lx[i+1]))
nLx[n]=0
Tx=rev(cumsum(rev(nLx)))
le=Tx/lx
return(round(le[Y+1],1))
}
0112132人目の素数さん垢版2017/09/21(木) 19:43:57.06ID:KStrV4aS
>>356
実行すると
> LE(f,96)
[1] 3.4
96歳女性の平均余命は3年以上あるらしい。
死因は多臓器不全にする方が正しかったのだろうか?

> LE(m,100)
[1] 2.1

参考資料1 生命表諸関数の定義
http://www.mhlw.go.jp/toukei/saikin/hw/life/life15/dl/life15-08.pdf
に寿命中位数というのが定義されている。
半減期にあたる寿命中位数も計算してみた。グラフであたりをつけて内挿してもとめた。
手計算は面倒なのでRで線形回帰
x=c(89,90)
y=c(nLx[89+1],nLx[90+1]) # y = a + b*x
coef=lm(y~x)$coef
round((50000-coef[1])/coef[2],1) # 寿命中位数

> round((50000-coef[1])/coef[2],1) # 寿命中位数
89.3

参考資料中の解説

 我が国は、「平均寿命<寿命中位数」となっている。


が確認できた。

待機時間の多い職場だと、ふとした疑問をネットで調べて自分で勉強できて( ・∀・)イイ!!
ド底辺特殊シリツ医大卒のネット検索後の学習結果は>119を参照。
0113132人目の素数さん垢版2017/09/21(木) 20:07:38.28ID:g2Q4cSI1
どうでもいいけど、平成27年は完全生命表の年なのに、
なぜわざわざ簡易生命表を使うの?
0114132人目の素数さん垢版2017/09/23(土) 10:32:52.85ID:w2Jlt/XH
>>111
5〜6年ほど前にやってたな。

生命表と幾何ブラウン運動に基づく株価のモンテカルロシミュレーションで、今の貯蓄で死ぬまでにお金を使い切る確率を計算するの。
0117132人目の素数さん垢版2017/09/23(土) 21:24:44.71ID:Kb5kBoaF
なお、最新版の平成28年の簡易生命表はこちら
ttp://www.mhlw.go.jp/toukei/saikin/hw/life/life16/index.html
0119132人目の素数さん垢版2017/09/24(日) 11:13:15.02ID:o6BLfmLi
>>116
## 第22回生命表(完全生命表)
#http://www.mhlw.go.jp/toukei/saikin/hw/life/22th/index.html

F=c(178,32,20,12,8,8,8,8,7,7,7,7,7,7,8,10,12,13,15,16,17,19,20,22,23,24,25,27,28,30,31,32,34,36,39,41,42,45,50,56,
62,68,73,79,85,94,104,114,124,134,145,159,174,189,202,215,226,237,250,268,291,318,346,372,399,433,471,511,554,603,662,729,802,874,954,1053,1180,1332,1505,1699,1909,2143,2409,2701,3004,3310,3622,3938,4253,4531,4757,4918,5025,
5024,4876,4598,4132,3594,3025,2464,1941,1477,1085,769,525,345,217,132,76,42,22,11,5,2,1,0)

M=c(202,34,24,16,11,10,10,10,9,8,7,7,8,11,13,17,21,26,32,39,45,49,51,53,55,55,54,54,54,56,57,59,61,65,69,73,75,78,
84,93,103,113,122,131,144,159,176,195,215,236,257,283,310,340,373,411,450,488,525,568,620,688,764,839,910,994,
1081,1166,1256,1349,1450,1561,1675,1776,1885,2021,2185,2377,2594,2819,3046,3279,3504,3714,3900,4043,4116,4127,
4080,3973,3810,3580,3302,2967,2567,2123,1718,1352,1034,768,554,387,262,171,108,66,39,22,12,6,3,2,1)

LE <-function(ndx,Y,N0=10^5){
n=length(ndx)
lx=numeric(n)
lx[1]=N0
for(i in 1:(n-1))
lx[i+1] <- lx[i] - ndx[i]
nqx=ndx/lx
nLx=numeric(n)
for(i in 1:n)
nLx[i] <- mean(c(lx[i],lx[i+1]))
nLx[n]=0
Tx=rev(cumsum(rev(nLx)))
le=Tx/lx
return(round(le[Y+1],2))
}
0120132人目の素数さん垢版2017/09/24(日) 11:15:06.76ID:o6BLfmLi
>>117
最新版の平成28年の簡易生命表はこちら
f=c(198,29,19,12,9,7,7,6,5,6,6,7,7,7,8,9,11,12,13,14,16,19,22,24,25,25,25,25,25,26,28,29,31,34,37,41,45,48,50,54,59,66,72,78,84,92,101,112,123,136,149,162,175,186,196,207,220,237,256,275,294,313,334,360,
389,423,463,504,547,595,649,707,776,855,940,1043,1164,1308,1479,1667,1874,2102,2363,2651,2955,3265,3567,3874,4186,4484,4731,4908,5039,5067,4936,4635,4209,3697,3139,2574,2037,1554,1141,805,545,846)
m=c(194,31,21,14,10,9,9,8,7,7,7,7,8,10,13,17,21,26,31,38,44,48,50,51,51,51,53,53,54,56,57,58,60,63,66,70,74,79,83,89,97,106,116,127,140,155,171,190,211,233,255,278,302,328,359,395,434,478,525,572,622,
678,741,813,890,973,1062,1148,1233,1323,1419,1522,1633,1752,1874,2014,2176,2357,2553,2762,2985,3221,3459,3680,3875,4031,4123,4156,4123,4023,3874,3643,3349,3006,2629,2235,1843,1470,1131,837,593,401,258,157,89,90)
LE <-function(ndx,Y,N0=10^5){
n=length(ndx)
lx=numeric(n)
lx[1]=N0
for(i in 1:(n-1))
lx[i+1] <- lx[i] - ndx[i]
nqx=ndx/lx
nLx=numeric(n)
for(i in 1:n)
nLx[i] <- mean(c(lx[i],lx[i+1]))
nLx[n]=0
Tx=rev(cumsum(rev(nLx)))
le=Tx/lx
return(round(le[Y+1],1))
}
LE(f,96)
LE(m,100)

> LE(f,96) # 96歳女性の平均余命
[1] 3.3

> LE(m,100) #100歳男性の平均余命
[1] 1.9

微妙に結果が違うな。
0121132人目の素数さん垢版2017/09/27(水) 06:38:20.99ID:DzhNz5Oe
ド底辺特殊シリツ医大に
http://egg.2ch.net/test/read.cgi/hosp/1506113587/142
のようなスカトロ嗜好の医者がいるかを
1学年100人として無作為の順序で調査していき該当者が1人発見されたら調査終了とするという方法で調査する。
1例目が該当者であった。
この学年のスカトロ嗜好数の期待値を求めよ。
0122132人目の素数さん垢版2017/09/27(水) 06:39:04.84ID:DzhNz5Oe
lottery <- function(.N,.r,k=10^4){
f <-function(S,N=.N){
y=c(rep(1,S),rep(0,N-S))
Y=sample(y)
return(Y)
}
g <- function(y){
n=length(y)
for(i in 1:n){
if(!y[i]) i=i+1
else break
}
return(i)
}

xx=0:.N
SS=NULL
for(i in 1:k){
M=t(sapply(xx,f))
for(j in 1:.N){
if(g(M[j,])==.r) SS=c(SS,j-1)
}
}
print(quantile(SS,c(.025,.05,.50,.95,.975)))
c(mean=mean(SS))
}
lottery(100,1)
0124132人目の素数さん垢版2017/10/02(月) 22:03:04.10ID:jTVePLTX
lottery <- function(.N,.r,k=10^3){
f <-function(S,N=.N){
y=c(rep(1,S),rep(0,N-S))
Y=sample(y)
return(Y)
}
g <- function(y){
n=length(y)
for(i in 1:n){
if(!y[i]) i=i+1
else break
}
return(i)
}

xx=0:.N
SS=NULL
for(i in 1:k){
M=t(sapply(xx,f))
for(j in 1:(.N+1)){
if(g(M[j,])==.r) SS=c(SS,j-1)
}
}
print(quantile(SS,c(.025,.05,.50,.95,.975)))
c(mean=mean(SS))
}
lottery(100,1)
0125132人目の素数さん垢版2017/10/06(金) 08:15:11.45ID:zRAj2AHB
Linux版のRでもWindows版みたいに「入力:青字、出力:赤字」みたいなインターフェースにする設定ってある?
0126132人目の素数さん垢版2017/10/06(金) 19:21:19.13ID:nz6qypJh
>>125
coloroutパッケージ入れて、色を割り当てるとできるかも。
アーカイブに入っちゃっているけど、使える。
setOutputColors256()のヘルプを参照。
0128132人目の素数さん垢版2017/10/07(土) 09:49:05.80ID:dws8gMbB
順番を表示させる、*1st,*2nd *3rd
> n=21
> paste(n,ifelse(0<n%%10 && n%%10<4,c('st','nd','rd')[which(n%%10==1:3)],'th'),sep='')
[1] "21st"
0129132人目の素数さん垢版2017/10/07(土) 17:31:13.11ID:O5mMfwME
>>128
それだと、11が11stになっておかしいだろ

> library(toOrdinal)
> toOrdinal(21)
[1] "21st"
> sapply(1:20, toOrdinal)
[1] "1st" "2nd" "3rd" "4th" "5th" "6th" "7th" "8th" "9th" "10th"
[11] "11th" "12th" "13th" "14th" "15th" "16th" "17th" "18th" "19th" "20th"
0131132人目の素数さん垢版2017/10/07(土) 22:26:53.02ID:W9vNhGzr
>>128
なんでそこで && を使うかなあ。&& の意味わかってる?
ifelse には & を使うことになるのが普通だし、そうでなければ if 〜 else のほうがよい。
0134132人目の素数さん垢版2017/10/08(日) 10:55:49.38ID:LDCLz3bM
>>130
toOrdinal のコードをみたら 11,12,13は別扱いしてあった。

if (tmp %in% c("11", "12", "13"))
tmp.suffix <- "th"
0135132人目の素数さん垢版2017/10/08(日) 11:36:14.74ID:LDCLz3bM
legendの中で使うべくone-linerにしたかったのだけど、ここでの指摘に従ってデバッグしたら

paste(n,ifelse(as.character(n%%100)%in%c('11','12','13'),'th',ifelse(0<n%%10 & n%%10<4,c('st','nd','rd')[which(n%%10==1:3)],'th')),sep='')

こんなに長くなってしまった。

> f<-function(n)paste(n,ifelse(as.character(n%%100)%in%c('11','12','13'),'th',
+ ifelse(0<n%%10 & n%%10<4,c('st','nd','rd')[which(n%%10==1:3)],'th')),sep='')
> prod(sapply(0:10000,f) == sapply(0:10000,toOrdinal::toOrdinal))
[1] 1

一応、パッケージtoOrdinalと0〜1万で合致を確認。

いろいろとご助言ありがとうございました。 <(_ _)>ペコリ
0136132人目の素数さん垢版2017/10/08(日) 11:55:19.96ID:68bFYZIH
パチンコのスレにこういう記載があった。

>バカは何故かパチンコで勝てると思い込んでいる
>バカは本来なら勝てるのに遠隔や不正で負けていると思い込んでいる
>バカは10分の1で10円が当たるクジより1万分の1で8000円が当たるクジの方が儲かると思ってる
>算数すらできないバカが必死に守って支えてきたのがパチンコ業界

これを読んでこんな問題を考えてみた。

宝くじAは1000本中100本が当たりで当たりは 100万円の賞金、

宝くじBは1000本中 10本が当たりで当たりは1000万円の賞金、

どちらも売り出し価格は同じなので計100本買うことにする。

Aを何本買うときに賞金の期待値が最大になるか、シミュレーションしてみよ。
0138132人目の素数さん垢版2017/10/08(日) 20:42:24.71ID:LDCLz3bM
シミュレーションすると

Na=1000 ; Nb=1000 # くじの本数
pa=0.1 ; pb=0.01 # 当たる確率
Wa=100 ; Wb=1000 # 賞金
n=100 # 買う総本数
aa=0:n # 宝くじAを買う候補
A0=c(rep(1,Na*pa),rep(0,Na-Na*pa)) # 宝くじA 1:当たり 0:はずれ
B0=c(rep(1,Nb*pb),rep(0,Nb-Nb*pb)) # 宝くじB

Get <- function(a){ #Aをa本買ったときのAの当たりとBのあたりでの賞金合計
sum(sample(A0,a))*Wa + sum(sample(B0,n-a))*Wb
}
k=10^3 #繰り返し回数
MAX=replicate(k,which.max(sapply(aa,Get))-1) # 賞金合計が最大になるAの購入数の配列
hist(MAX)

期待値がA,BでかわらないからMAXの分布は一様分布になると思ったのだが、

こんな分布になってしまって自分でも混乱している。

http://i.imgur.com/Yo55mvc.png

お知恵を拝借したい。
0141132人目の素数さん垢版2017/10/08(日) 23:23:18.27ID:7IiqlruN
自分なら、こんな感じ
> a <- function(i){sum(rbinom(i, 1, 0.1) * 100) + sum(rbinom(100-i, 1, 0.01) * 1000)}
> b <- function(){which.max(sapply(1:100, a))}
1000回のシミュレーションだと
> res <- replicate(1000, b())
> hist(res)
同じ結果だよ
0142132人目の素数さん垢版2017/10/08(日) 23:29:05.07ID:7IiqlruN
A, Bを少なくとも1本含む100本じゃなかったので、
> b <- function(){which.max(sapply(1:100, a))}

> b <- function(){which.max(sapply(0:100, a))}
だな。すまん
> a <- function(i){sum(rbinom(i, 1, 0.1) * 100) + sum(rbinom(100-i, 1, 0.01) * 1000)}
> b <- function(){which.max(sapply(0:100, a))}
> res <- replicate(1000, b())
> hist(res,breaks = 20)
結果は同じ
0143132人目の素数さん垢版2017/10/09(月) 00:19:33.56ID:1+Fkporl
>139-142

簡潔なコードありがとうございます。

AもBも賞金の期待値がどちらも10万なので
Aを何本買おうが合計の期待値は同じかなと思いつつ、sample関数を使ってシミュレーションしたのだけれど
一様分布にはならないのでシミュレーションの間違い、
もしくは自分が理解していないsample関数の特性を検出しただけなのか、と思っておりました。
rbinomでのシミュレーション結果とヒストグラムが一致して、一様分布になるという思い込みが間違いだと確信できました。

勉強になりました。ありがとうございました。
0144132人目の素数さん垢版2017/10/09(月) 00:27:22.71ID:1+Fkporl
>>142
大したことではないけど

0から始まるので本数とindexを補正して

b <- function(){which.max(sapply(0:100, a))-1}

の方が正確だと思います。
0146132人目の素数さん垢版2017/10/09(月) 01:05:40.45ID:1+Fkporl
宝くじをA,B併せて100本買ったときの賞金の期待値は

Award <- function(i){ #i:Aを買った本数
sum(dbinom(0:i,i,0.1)*(0:i)*100)+sum(dbinom(0:(100-i),100-i,0.01)*(0:(100-i))*1000)
}
sapply(0:100,Award)

> sapply(0:100,Award)
[1] 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000
....
[86] 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000

と買い方に無関係にも思えるんだなぁ。
0147132人目の素数さん垢版2017/10/09(月) 02:00:05.31ID:1+Fkporl
>>145
>合計の期待値の標準偏差はAの本数が増えると減る
ことを検証してみた。

a <- function(i) sum(rbinom(i, 1, 0.1) * 100) + sum(rbinom(100-i, 1, 0.01) * 1000)
plot(0:100,sapply(0:100,function(x) sd(replicate(10^3,a(x)))))

http://i.imgur.com/oPFtMXe.png
0148132人目の素数さん垢版2017/10/09(月) 06:15:43.03ID:1+Fkporl
別の話題提供。

 ゴルゴ13は100発100中

 ゴルゴ14は10発10中

 ゴルゴ15は1発1中

とする。

各々10000発撃ったとき各ゴルゴの命中数の期待値はいくらか?
0149132人目の素数さん垢版2017/10/09(月) 15:22:52.36ID:di3eoSv3
どうでもいいんだが、
which.max()は、同値の最大が複数あったとき、最初のインデックスを戻すので、
2番目以降の最大が無視されていることについて、その取り扱いを考慮した方が良いと思うぞ。
> which.max(c(0,1,0,0,0,0,0,0,1))
[1] 2
0150132人目の素数さん垢版2017/10/09(月) 17:42:12.61ID:1+Fkporl
>>149
ご指摘ありがとうございます。

最大値を与えるAの購入数が複数ある場合を考えてスクリプトを改変してみました。

a <- function(i){sum(rbinom(i, 1, 0.1) * 100) + sum(rbinom(100-i, 1, 0.01) * 1000)}
which.max2 <- function(x){which(x==max(x))-1}
b <- function(){
b1=NULL
b1=c(b1,which.max2(sapply(0:100, a)))
return(b1)
}
b2=NULL
for(j in 1:1000){
b2=c(b2,b())
}
hist(b2,breaks=20)
0151132人目の素数さん垢版2017/10/09(月) 19:43:31.10ID:1+Fkporl
length(b2)

とすると1000を超えているから同値の最大が複数あったことがわかりました。

ありがとうございました。

このスレは勉強になるなぁ。
0152132人目の素数さん垢版2017/10/09(月) 22:05:49.50ID:1+Fkporl
どうでもいいことだけど、

hist(b2,breaks=20,col=sample(colors(),2))

とすると毎回配色の変わるツートンカラーのヒストグラムがでて面白い。
0153132人目の素数さん垢版2017/10/10(火) 18:01:18.51ID:S7i/7cX1
>>126
125です。レス遅くなったけど、やりたいことができました。ありがとう。
0154132人目の素数さん垢版2017/10/11(水) 20:55:10.55ID:DiiGwH6/
array(1:48, dim=c(6, 4, 2))
を,3行2列おきに平均して
,,1
[,1] [,2]
[1,] 5 17
[2,] 8 20
,,2
[,1] [,2]
[1,] 29 41
[2,] 32 44
としたいんですが,効率的な方法はないでしょうか。
実際のデータは,10000x10000x400なんです。
0157132人目の素数さん垢版2017/10/11(水) 22:59:20.81ID:HJHHXjdz
>>154
効率的かどうかはわからんが、やってみた

(d=array(1:48, dim=c(6, 4, 2)))

a=3
b=2
l=6
m=4
n=2

re=NULL
for(k in 1:n){
for(j in 1:(m/b)){
for(i in 1:(l/a)){
re=append(re,mean(d[1:3+3*(i-1),1:2+2*(j-1),k]))
}
}
}
array(re,dim=c(m/b,l/a,n))
0158132人目の素数さん垢版2017/10/11(水) 23:00:23.97ID:UQm0Ph1Q
>>155
>>154です。
説明が悪くてすみません。
>>156の通りです。
0159132人目の素数さん垢版2017/10/11(水) 23:02:02.80ID:UQm0Ph1Q
>>157
ありがとうございます。
手元にデータがないので明日試してみます。
0160132人目の素数さん垢版2017/10/11(水) 23:02:32.81ID:bFq2a2U4
なるほど、じゃあその5,8,17,20はこういうことか。
> a <- array(1:48, dim=c(6, 4, 2))
> b <- expand.grid(1:(dim(a)[1] %/% 3), 1:(dim(a)[2] %/% 2))
> f <- function(i, j, k=1){mean(a[(3*i-2):(3*i),(2*j-1):(2*j),k])}
> mapply(f, b[,1], b[,2])
[1] 5 8 17 20
0162132人目の素数さん垢版2017/10/11(水) 23:06:59.19ID:HJHHXjdz
> d=array(1:48, dim=c(6, 4, 2))

> a=3
> b=2
> l=6
> m=4
> n=2
> re=NULL
> for(k in 1:n){
+ for(j in 1:(m/b)){
+ for(i in 1:(l/a)){
+ re=append(re,mean(d[1:a+a*(i-1),1:b+b*(j-1),k]))
+ }
+ }
+ }
> array(re,dim=c(m/b,l/a,n))
, , 1

[,1] [,2]
[1,] 5 17
[2,] 8 20

, , 2

[,1] [,2]
[1,] 29 41
[2,] 32 44

データは10000x10000x400なら
l=10000
m=10000
n=400
でよくね?
0163132人目の素数さん垢版2017/10/12(木) 07:10:38.11ID:2sFs7Gsb
最初の1行で

> d=array(1:(10000*10000*400))
Error: cannot allocate vector of size 298.0 Gb

エラーがでたw
0164132人目の素数さん垢版2017/10/12(木) 07:12:09.84ID:2sFs7Gsb
正しいエラーwはこっち

> d=array(1:(10000*10000*400),dim=c(6, 4, 2))
Error: cannot allocate vector of size 298.0 Gb
0165132人目の素数さん垢版2017/10/12(木) 07:21:02.01ID:2sFs7Gsb
そもそも、10000x10000x400だと10000行は3行にならないな。最終行を無視して9999行にするのかな?
0166132人目の素数さん垢版2017/10/12(木) 14:48:46.91ID:sG1WSodN
>160を参考に>157のforだらけのスパゲティー・ソースを(ちょっと一般化して)改変しました。
(変数名の重複を避けるため>160の変数名は変更してあります。)

> a=3
> b=2
> c=1
>
> l=6
> m=4
> n=2
>
> A <- array(1:48, dim=c(l,m,n))
> B <- expand.grid(1:(l %/% a), 1:(m %/% b),1:(n %/% c))
> f <- function(i, j, k){mean(A[(a*(i-1)+1):(a*i),(b*(j-1)+1):(b*j),(c*(k-1)+1):(c*k)])}
> re=mapply(f, B[,1], B[,2],B[,3])
> array(re,dim=c(m%/%b,l%/%a,n%/%c))
, , 1

[,1] [,2]
[1,] 5 17
[2,] 8 20

, , 2

[,1] [,2]
[1,] 29 41
[2,] 32 44

>

上級者のコードを読むのは勉強になります。(深謝)
0167132人目の素数さん垢版2017/10/12(木) 16:33:51.03ID:f/ETd6de
先輩方,>>154です。
巨細にわたってご教示・ご議論いただきありがとうございました。
>>166のコードを参考にして,無事処理することができました。
実行速度も申し分なく,効率的に作業が進められそうです。
今回は私には目から鱗な解法で,勉強になりました。
質問して良かったと思っています。。本当にありがとうございました。

10,000行の扱いですが,3行ごとに処理して1行無視してもよいし,
4から7行程度で処理してもよく,フレキシブルです。
今回は4行にして余りなしにしました。
0168132人目の素数さん垢版2017/10/12(木) 18:43:54.51ID:2sFs7Gsb
処理速度を比べてみた。

fs<-function(){ #スパゲッティ・ソース
d=array(1:(l*m*n),dim=c(l,m,n))
re=NULL
for(k in 1:(n/c)){
for(j in 1:(m/b)){
for(i in 1:(l/a)){
re=append(re,mean(d[1:a+a*(i-1),1:b+b*(j-1),1:c+c*(k-1)]))
}}}
array(re,dim=c(m/b,l/a,n))
}

fe <- function(){ # Expertソース
A <- array(1:(l*m*n), dim=c(l,m,n))
B <- expand.grid(1:(l %/% a), 1:(m %/% b),1:(n %/% c))
f <- function(i, j, k){mean(A[(a*(i-1)+1):(a*i),(b*(j-1)+1):(b*j),(c*(k-1)+1):(c*k)])}
re=mapply(f, B[,1], B[,2],B[,3])
array(re,dim=c(m%/%b,l%/%a,n%/%c))
}

a=4
b=2
c=1
l=400
m=200
n=2

> system.time(fs())
user system elapsed
2.17 0.00 2.18
> system.time(fe())
user system elapsed
1.14 0.00 1.14

>160氏のスキルに改めて感服。
0169132人目の素数さん垢版2017/10/14(土) 23:02:55.66ID:WIgy7a2M
# 既約剰余類群 (Z/nZ)*
kjrg <- function(n){
nn=0:(n-1)
f=function(x,y) (x*y)%%n
names(nn)=paste0('n',nn)
z=outer(nn,nn,f)
idx=which(gmp::gcd(1:(n-1),n)==1)+1
return(z[idx,idx])
}
kjrg(10)
kjrg(15)
kjrg(24)
> kjrg(24)
n1 n5 n7 n11 n13 n17 n19 n23
n1 1 5 7 11 13 17 19 23
n5 5 1 11 7 17 13 23 19
n7 7 11 1 5 19 23 13 17
n11 11 7 5 1 23 19 17 13
n13 13 17 19 23 1 5 7 11
n17 17 13 23 19 5 1 11 7
n19 19 23 13 17 7 11 1 5
n23 23 19 17 13 11 7 5 1
0170132人目の素数さん垢版2017/10/15(日) 13:21:32.63ID:GlVyhxtn
# 既約剰余類群での加減乗除
n=24
n_star=which(gmp::gcd(1:(n-1),n)==1) ; n_star
tasu <- function(x,y) (x+y)%%n
hiku <- function(x,y) (x-y)%%n # row - col
kake <- function(x,y) (x*y)%%n
g=function(x) n_star[which(x==1)]
.M=outer(n_star,n_star,kake)
G=apply(.M,2,g)
gyaku <- function(x) n_star[which(G==(x%%n))]
waru <- function(x,y) (x*gyaku(y))%%n # row ÷ col

xx=yy=c(0,n_star)
names(xx)=paste0('x',c(0,n_star))
names(yy)=paste0('y',c(0,n_star))
outer(xx,yy,tasu) # x + y
outer(xx,yy,hiku) # x - y
outer(xx,yy,kake) # x * y
X=Y=n_star #outer(X,Y,waru) # WRONG!!
a=expand.grid(X,Y)
b=matrix(mapply(waru,a[,1],a[,2]),length(X))
rownames(b)=paste0('x',n_star)
colnames(b)=paste0('y',n_star)
b # x / y
0171132人目の素数さん垢版2017/10/15(日) 14:03:02.02ID:GlVyhxtn
名前も一致してidenticalなんだな。
> x=1:10
> y=1:10
> identical(x,y)
[1] TRUE
> names(x)=LETTERS[1:10]
> identical(x,y)
[1] FALSE
> names(y)=LETTERS[1:10]
> identical(x,y)
[1] TRUE
> names(y)=letters[1:10]
> identical(x,y)
[1] FALSE

allの方は内容の全体が一致していれば順番は入れ替わってもTRUEなんだな。
> x=1:10
> y=1:10
> all(x,y)
[1] TRUE
> names(x)=LETTERS[1:10]
> all(x,y)
[1] TRUE
> names(y)=letters[1:10]
> all(x,y)
[1] TRUE
> all(x,sample(y))
[1] TRUE
0172132人目の素数さん垢版2017/10/16(月) 01:11:00.56ID:NsB0m+v3
beki <- function(x,n,p){ # x^n%%p
if(n==0) return(1)
if(n==1) return(x%%p)
re=numeric(n)
re[1]=x
for(i in 1:(n-1)) re[i+1] = (x*re[i])%%p
return(re[n])
}

p=1009 # フェルマーの小定理
xx=0:(p-1)
n=p-1
y=sapply(xx,function(x)beki(x,n,p))
summary(y)
0173132人目の素数さん垢版2017/10/16(月) 07:46:39.05ID:NsB0m+v3
90歳女性のお看取り

>120のコードから女性の平均余命をグラフにしてみた
Age=85:105
(Life_Expectancy=sapply(Age,function(x) LE(f,x)))
plot(Age,Life_Expectancy,pch=19,col=sample(colors()))
abline(h=5,col='gray',lty=2)

http://i.imgur.com/38x50fw.png

平均余命が5年を切るのは92歳なので、老衰にせずに
主治医指定の病名で診断書を作成。
カルテ記載のしっかりした患者の診療は負担なくこなせて(・∀・)イイ!!
0174132人目の素数さん垢版2017/10/16(月) 22:16:44.56ID:ACageh59
outerって使えない場面があるよね?
剰余系での加減乗除での実際
> n=5 # prime number
> nn=1:(n-1)
> tasu <- function(x,y) (x+y)%%n
> hiku <- function(x,y) (x-y)%%n # row - col
> kake <- function(x,y) (x*y)%%n
> g=function(x) nn[which(x==1)]
> .M=outer(nn,nn,kake)
> G=apply(.M,2,g)
> gyaku <- function(x) nn[which(G==(x%%n))]
> waru <- function(x,y) (x*gyaku(y))%%n # row / col
> waru(3,2)
[1] 4
> xx=yy=c(0,nn)
> names(xx)=paste0('x',c(0,nn))
> names(yy)=paste0('y',c(0,nn))
> outer(xx,yy,tasu) # x + y
y0 y1 y2 y3 y4
x0 0 1 2 3 4
x1 1 2 3 4 0
x2 2 3 4 0 1
x3 3 4 0 1 2
x4 4 0 1 2 3
> outer(xx,yy,hiku) # x - y
y0 y1 y2 y3 y4
x0 0 4 3 2 1
x1 1 0 4 3 2
x2 2 1 0 4 3
x3 3 2 1 0 4
x4 4 3 2 1 0
> outer(xx,yy,kake) # x * y
y0 y1 y2 y3 y4
x0 0 0 0 0 0
x1 0 1 2 3 4
x2 0 2 4 1 3
x3 0 3 1 4 2
x4 0 4 3 2 1
> X=Y=nn
> outer(X,Y,waru) # WRONG!!
[,1] [,2] [,3] [,4]
[1,] 1 1 1 1
[2,] NA NA NA NA
[3,] NA NA NA NA
[4,] NA NA NA NA
> a=expand.grid(X,Y)
> b=matrix(mapply(waru,a[,1],a[,2]),length(X))
> rownames(b)=paste0('x',nn)
> colnames(b)=paste0('y',nn)
> b # x / y
y1 y2 y3 y4
x1 1 3 2 4
x2 2 1 4 3
x3 3 4 1 2
x4 4 2 3 1
0175132人目の素数さん垢版2017/10/16(月) 23:28:56.68ID:FS7yMelZ
>>174
そりゃあ、outer に渡す関数がまずいんだろ。
outer に渡す関数は、完全にベクトル対応になっていなければならないんじゃないの?
でなければ、わざわざ outer 使うこともなかろう。
0176132人目の素数さん垢版2017/10/17(火) 06:58:05.54ID:ps5i5Wv8
>>175
レスありがとうございます。
自作関数から自作関数を呼び出しているのが原因かと思っていましたが、
ベクトル対応していないとはこういうことでしょうか?

加減乗は引数のどちらをベクトルにしても動作
> kake(1:4,1)
[1] 1 2 3 4
> kake(1,1:4)
[1] 1 2 3 4
> tasu(1:4,1)
[1] 2 3 4 0
> tasu(1,1:4)
[1] 2 3 4 0
> hiku(1:4,1)
[1] 0 1 2 3
> hiku(1,1:4)
[1] 0 4 3 2

除算は第2引数をベクトルにすると誤動作

> waru(1:4,1)
[1] 1 2 3 4
> waru(4,1:4)
[1] 4 1
0177132人目の素数さん垢版2017/10/17(火) 22:43:30.39ID:yEir4ohi
>>176
outer から呼び出されたときの引数を見てみればわかるよ。たぶん1度しか呼ばれず、できあがりの行列の要素すべてを計算するための引数がベクトルで渡されているはずだから。
0178名無しさん@そうだ選挙に行こう! Go to vote!垢版2017/10/22(日) 07:51:52.36ID:/ES4CbkI
>>177
ありがとうございます。

outerのソースをみたら、こんな記述があったので、X,Yを同時にベクトルで与えても動作する関数でないとダメみたいでした。

FUN <- match.fun(FUN)
Y <- rep(Y, rep.int(length(X), length(Y)))
if (length(X))
X <- rep(X, times = ceiling(length(Y)/length(X)))
FUN(X, Y, ...)
0179名無しさん@そうだ選挙に行こう! Go to vote!垢版2017/10/22(日) 08:28:19.35ID:/ES4CbkI
# greatest common divisor
gcd <- function(x,y) ifelse(x|y,ifelse(x*y,max(intersect((1:abs(x))[abs(x)%%(1:abs(x))==0],(1:abs(y))[abs(y)%%(1:abs(y))==0])),max(abs(x),abs(y))),NA)

非正整数対応すると長くなるなぁ

> gcd(24,15)
[1] 3
> gcd(16,15)
[1] 1
> gcd(5,0)
[1] 5
> gcd(-24,15)
[1] 3
> gcd(-24,-15)
[1] 3
> gcd(0,0)
[1] NA
0180名無しさん@そうだ選挙に行こう! Go to vote!垢版2017/10/22(日) 09:17:13.05ID:/ES4CbkI
ユークリッドの互除法をつかうとこんな感じ

> GCD <- function(x,y){
+ if(round(x)!=x | round(y)!=y) stop('Not integer')
+ if(!x&!y) return(NA)
+ a=max(c(abs(x),abs(y)))
+ b=min(c(abs(x),abs(y)))
+ if(!a*b) return(a)
+ r=integer()
+ r[1]=a
+ r[2]=b
+ i=1
+ r[i+2]=r[i]%%r[i+1]
+ while(r[i+2]!=0 & r[i+2]!=1){
+ i=i+1
+ r[i+2]=r[i]%%r[i+1]
+ }
+ return(ifelse(r[i+2]==0,r[i+1],1))
+ }
> GCD(0,0)
[1] NA
> GCD(24,15)
[1] 3
> GCD(16,15)
[1] 1
> GCD(5,0)
[1] 5
> GCD(24,-15)
[1] 3
> GCD(-24,-15)
[1] 3
> GCD(2.3,4)
Error in GCD(2.3, 4) : Not integer
0181名無しさん@そうだ選挙に行こう! Go to vote!垢版2017/10/22(日) 10:07:52.18ID:tFigTWxc
文系研究者のワイ、困惑
ディープな世界やでほんま
0182132人目の素数さん垢版2017/10/25(水) 20:38:52.07ID:A26rYIkF
#.n発r中の狙撃手が.N発狙撃するときの命中数を返す
Go13 <- function(.N, .n, r, k=10^3){ # k:シミュレーション回数
f <-function(S,N=.N,n=.n){
y=c(rep(1,S),rep(0,N-S))
sum(sample(y,n))
}
xx=r:.N
SS=NULL
for(i in 1:k){
x=sapply(xx,f)
SS=c(SS,which(x==r)-1+r)
}
print(summary(SS))
invisible(SS)
}
0193132人目の素数さん垢版2017/10/26(木) 18:17:25.90ID:tHqsRRzo
こういう問題を考えるのは楽しいね。

ゴルゴ13は100発100中
ゴルゴ14は10発10中
ゴルゴ15は1発1中
とする。
各々10000発撃ったとき各ゴルゴの命中数の期待値はいくらか?

ドツボ13は100発0中
ドツボ14は10発0中
ドツボ15は1発0中
とする。
各々10000発撃ったときドツボの命中数の期待値はいくらか?
0194132人目の素数さん垢版2017/11/01(水) 12:40:01.83ID:UKV+bz4p
ベクトルは再利用されるんだな


> c(1,2,1,2)==c(1,2)
[1] TRUE TRUE TRUE TRUE
> all(c(1,2,1,2)==c(1,2))
[1] TRUE
> equal <- function(x,y) sum((x-y)^2)==0 & length(x)==length(y)
> equal(c(1,2,1,2),c(1,2))
[1] FALSE
0195132人目の素数さん垢版2017/11/03(金) 08:27:39.47ID:7YwYHhPi
> x= list(length=5)
> x
$length
[1] 5

> y=list()
> length(y)=4
> y
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

> z=list(5)
> z
[[1]]
[1] 5

> w = vector(mode="list" , length= 5)
> w
[[1]]
NULL

[[2]]
NULL

[[3]]
NULL

[[4]]
NULL

[[5]]
NULL
0196132人目の素数さん垢版2017/11/09(木) 08:41:04.22ID:SxG1YX2j
Brunner-Munzel検定って比較する両群に重なりがないとp値がNAになるんだが、
これってバグなのか?



> x=1:5
> y=6:10
> lawstat::brunner.munzel.test(x,y)

Brunner-Munzel Test

data: x and y
Brunner-Munzel Test Statistic = Inf, df = NaN, p-value = NA
95 percent confidence interval:
NaN NaN
sample estimates:
P(X<Y)+.5*P(X=Y)
1

> x=1:6
> y=6:11
> lawstat::brunner.munzel.test(x,y)

Brunner-Munzel Test

data: x and y
Brunner-Munzel Test Statistic = 24.749, df = 10, p-value =
2.651e-10
95 percent confidence interval:
0.9423463 1.0298759
sample estimates:
P(X<Y)+.5*P(X=Y)
0.9861111
0197132人目の素数さん垢版2017/11/14(火) 22:02:36.50ID:Jlt4ZA5T
突然ですが質問があります。最近Rソフトを利用し始めた者のです。単刀直入に、
ボロノイ図を制作した場合に分割された面積の平均を出力するには、どうすればよいのでしょうか?
0198132人目の素数さん垢版2017/11/14(火) 22:06:32.42ID:Jlt4ZA5T
現状としては住所をグーグルマップの緯度経度に変換し、分割まではできています。
宜しければどなたかお力添えをいただけないでしょうか?
0209132人目の素数さん垢版2017/11/15(水) 17:11:14.46ID:eZCzfwkb
>>198
SpatialPolygonsクラスまでできるといると仮定して、
各ポリゴンの中にareaスロットがあるから、
それを抽出して、その平均を取れば良い。
ボロノイ図がSpatialPolygonsクラスになっていないなら、
まずは変換。
0220132人目の素数さん垢版2017/11/15(水) 21:12:29.48ID:9zgzmHZc
ボロノイ図の各領域の面積の平均値って、単に
描画領域の総面積÷点数 じゃないの?
何か暗黙の前提があるの?
0231132人目の素数さん垢版2017/11/17(金) 20:18:17.65ID:5lHMDqma
Stan って 離散量をparameter 扱いできないので

m ? categorical(θ) としても m の分布を出せない。

JAGSだと

m 〜 dcat(θ)

とすると mの分布がだせる。

この理解でいいかな?
0242132人目の素数さん垢版2017/11/20(月) 17:47:00.70ID:ptVXRSQM
以前、ボロノイ図について質問させていただいた初心者です。
質問後色々と試行錯誤したのですがdir.areaを出せず悩んでおります。
library(deldir)
> library(ggmap)
> df <- read.csv("C:/Users/***/Desktop/***/***.csv",header=T)
> loc <- c(min(df$lon),min(df$lat),max(df$lon),max(df$lat))
> GM <-ggmap(get_map(location=loc,zoom=11,source="google"))
> GP <- geom_point(data=df,aes(x=lon,y=lat,colour=factor(type)),size=3)
> dd <- deldir(df$lon,df$lat)
>GS <-geom_segment(data=dd$dirsgs,aes(x=x1,y=y1,xend=x2,yend=y2),size=0.5,linetype=1)
> GM+GP+GS
と入力しボロノイ図は出せているのですが、
0243132人目の素数さん垢版2017/11/20(月) 17:52:19.12ID:ptVXRSQM
summaryと入力しても
function (object, ...)
UseMethod("summary")
<bytecode: 0x06b5eef0>
<environment: namespace:base>
と表示されます。どの様に入力または再入力すればdir.areaが表示させられるでしょうか?
私自身初めてで、全く分からない状態でRを使用しているので、宜しければ分かり易く教えて頂けると幸いです。
0254132人目の素数さん垢版2017/11/22(水) 10:59:21.45ID:1eSvd7ei
>>242
検証用のデータがないと誰も追試しないと思う。
>154は模擬データがあったのでやる気になった。
0265132人目の素数さん垢版2017/11/24(金) 16:46:01.01ID:S4G8MO/P
関数のオプションの取り得る値を全て表示する方法って知らない?
例えばcor関数のmethodオプションの取り得る値は"pearson", "kendall", "spearman"みたいに。
そういうのは無いのかな?
初めて使う関数のオプションいちいちググるの面倒くさい。
0278132人目の素数さん垢版2017/11/24(金) 22:49:54.91ID:8tVkv6KQ
>>276
前にヘルプで見ようと思ったら書いてなかった覚えが…。マニアックな関数だったんで、そんなもんかな〜と諦めてた。やっぱ基本はヘルプか。
>>277
argsは見れる関数と見れない関数があるのであんまり役に立たない印象。
0289132人目の素数さん垢版2017/11/25(土) 01:57:31.82ID:sNF3t9bW
>>278
>argsは見れる関数と見れない関数があるのであんまり役に立たない
だったら、例が悪いよ。見られない関数の例をあげないと

> ヘルプで見ようと思ったら書いてなかった
こっちだってわざわざ下請け関数のオプションまでは書かないよ。
ヘルプを見て未解決ならソースを見てくれ。
0301132人目の素数さん垢版2017/11/28(火) 13:00:14.06ID:kbsEO2Dt
先週長々と質問させていただいたものです。その後、試行錯誤して行った結果十解決しました。

以前は「summary」としか入れていなかったのですが、「dd$summary」と入力したところ
全体のデータが出力されました。それ以後「dd$summary$dir.area」等で出せるようになりました。
大変初期的な場面で躓いておりましたが、現在何とか進んでおります。
色々とお答えくださった方々、とても参考になりました。本当にありがとうございました。
0302132人目の素数さん垢版2017/12/10(日) 13:11:49.22ID:cG4z9akW
N(=100)回コインをなげてn(=5回)以上続けて表がでる確率。

seqn<-function(n=5,N=100,p=0.5){
rn=rbinom(N,1,p)
count=0
for(i in 1:N){
if(rn[i] & count<n){
count=count+1
}
else{
if(count==n) {return(TRUE)}
else{
count=0
}
}
}
return(count==n)
}
mean(replicate(10^5,seqn()))

> mean(replicate(10^5,seqn()))
[1] 0.81085

案外、高い確率になった。
0304132人目の素数さん垢版2017/12/11(月) 07:47:07.43ID:EURogHTh
pooledVariance <- function(...) {
args = list(...)
n.args=length(args)
ss2=0
df=0
for(i in 1:n.args){
ss2 = ss2 + var(args[[i]])*(length(args[[i]])-1)
df = df + (length(args[[i]])-1)
}
ss2/df
}

effectsize <- function(y1,y2){
diff=mean(y1)-mean(y2)
var=(var(x1)*(length(x1)-1)+ var(x2)*(length(x2)-1))/(length(c(y1,y2))-2)
sd=sqrt(var)
diff/sd
}

library(effsize)
cohen.d()
0305132人目の素数さん垢版2017/12/11(月) 07:50:22.91ID:EURogHTh
>>303
単なる二項分布。
コインが5回続けて表がでたら、0.5^5 <0.05なのでイカサマコインといわれちゃいそうなんだが、
100回やってみると案外、5回表が続くので確率を計算しようと思ったが、解析的にできる頭がないので
シミュレーションしてみた。
0306132人目の素数さん垢版2017/12/11(月) 07:55:42.42ID:EURogHTh
>302は

> rbinom(100,1,0.5)
[1] 0 1 0 0 1 0 0 0 1 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 1 0 1 1 1 1 0
[33] 0 1 0 0 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 1 1 0
[65] 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1 1 0 0 1 1 0 0
[97] 0 0 1 1

で5回以上1が連続するときTRUEを返す関数なのだが
もっと簡単にやれないかなぁとは思っている。

rep(1,5) %in% rbinom(100,1,0.5)は 1個ずつ評価されてTRUEが5個返ってくるだけ。

文字列にしてgrepを使うとなんとかなりそうな気がしないでもないのだけど....
0307132人目の素数さん垢版2017/12/22(金) 17:21:16.51ID:U1Bq8bdb
すまん、教えてほしいだけど
分析するために初めてRをインストールしようと思って、このスレのあるように公式サイト行ったら、esetが「JS/Redirector.NAV トロイの木馬」を検知したんだが…;
どうしたらいいだ…
0312132人目の素数さん垢版2017/12/23(土) 09:28:44.66ID:n0SBd+bp
>>310
してねぇよww
totalvirusで調べると一件引っかかるし、Redirector検知だから、しょうがないね
0313132人目の素数さん垢版2017/12/24(日) 20:42:51.55ID:CT/NKMd7
col=rgb(runif(1),runif(1),runif(1),runif(1))で色指定すると

走らせるたびに色がちがっておもしろい。

hist(rnorm(100),col=rgb(runif(1),runif(1),runif(1),runif(1)))
0314132人目の素数さん垢版2017/12/31(日) 17:23:19.35ID:14tdpK/Y
stanやJAGSのコードでgamma関数を使おうとして
y = gamma(x)
と、書いたらエラーになった。

stanだと y=tgamma(x)、JAGSだとy=exp(loggam(x))で動作した。
0315132人目の素数さん垢版2018/01/02(火) 08:46:50.95ID:qdmBZ37O
ある大学の入学者男女の比率は1であるという帰無仮説を検定する課題が花子と太郎に課された。

花子は50人を調査できたら終了として入学者を50人をみつけて18人が女子であるという結果を得た。
帰無仮説のもとで
50人中18人が女子である確率は 0.01603475
これ以下になるのは50人中0〜18人と32〜50人が女子の場合なので
両側検定して
> sum(dbinom(c(0:18,32:50),50,0.5))
[1] 0.06490865
> binom.test(18,50,0.5)$p.value
[1] 0.06490865
で帰無仮説は棄却できないと結論した。
http://i.imgur.com/XDIp9rM.png

一方、本番と十八番が好きな太郎は一人ずつ調べて18人めの女子がみつかったところで調査を終えることにした。
18人めがみつかったのは花子と同じく50人めであった。
帰無仮説のもとで
18人がみつかるのが50人めである確率は0.005772512
これ以下になるのは23人以下50人以上番めで女子18人めがみつかった場合なので
両側検定して
pnb=dnbinom(0:999,18,0.5)
> 1 - sum(pnb[-which(pnb<=dnbinom(50-18,18,0.5))]) # < 0.05
[1] 0.02750309
http://i.imgur.com/K3T7utr.png
で帰無仮説は棄却される。

どちらの検定が正しいか、どちらも正しくないか?
検定する意図によってp値が変わるのは頻度主義統計の欠陥といえるか?

花子の横軸は裏口入学者数、太郎の横軸はサンプル数なので
サンプルでの裏口入学率を横軸にして95%信頼区間を示す。
花子の検定での信頼区間は0.36〜0.72で18/50を含む、p=0.06491
http://i.imgur.com/SeTLk8K.jpg
太郎の検定での信頼区間は0.375〜0.72で18/50を含まない、p= 0.0275
http://i.imgur.com/tNzlfxe.jpg
主観である、検定の中止の基準の差でp値や信頼区間が変化するのは変だという批判である。
0316132人目の素数さん垢版2018/01/03(水) 10:35:48.54ID:YJfyxrv+
(訂正)
ある大学の入学者男女の比率は1であるという帰無仮説を検定する課題が花子と太郎に課された。

花子は50人を調査できたら終了として入学者を50人をみつけて18人が女子であるという結果を得た。
帰無仮説のもとで
50人中18人が女子である確率は 0.01603475
これ以下になるのは50人中0〜18人と32〜50人が女子の場合なので
両側検定して
> sum(dbinom(c(0:18,32:50),50,0.5))
[1] 0.06490865
> binom.test(18,50,0.5)$p.value
[1] 0.06490865
で帰無仮説は棄却できないと結論した。
http://i.imgur.com/XDIp9rM.png

一方、十八という数字が好きな太郎は一人ずつ調べて18人めの女子がみつかったところで調査を終えることにした。
18人めがみつかったのは花子と同じく50人めであった。
帰無仮説のもとで
18人がみつかるのが50人めである確率は0.005772512
これ以下になるのは23人以下50人以上番めで女子18人めがみつかった場合なので
両側検定して
pnb=dnbinom(0:999,18,0.5)
> 1 - sum(pnb[-which(pnb<=dnbinom(50-18,18,0.5))]) # < 0.05
[1] 0.02750309
http://i.imgur.com/K3T7utr.png
で帰無仮説は棄却される。

どちらの検定が正しいか、どちらも正しくないか?
検定する意図によってp値が変わるのは頻度主義統計の欠陥といえるか?

花子の横軸は女子数、太郎の横軸はサンプル数なので
サンプルでの女子の割合を横軸にして95%信頼区間を示す。
花子の検定での信頼区間は0.36〜0.72で18/50を含む、p=0.06491
http://i.imgur.com/SeTLk8K.jpg
太郎の検定での信頼区間は0.375〜0.72で18/50を含まない、p= 0.0275
http://i.imgur.com/tNzlfxe.jpg
主観である、検定の中止の基準の差でp値や信頼区間が変化するのは変だという批判である。
0317132人目の素数さん垢版2018/01/15(月) 16:30:41.76ID:wJofbCL/
kainokousiki<-function(a,b,c){return (-b+sqrt(b^2-4*a*c))/(2*a)} #解の公式
kainokousiki(1,-5,6)

でrunすると3じゃなくて6を返すんだけど、どこが間違ってる?
0318132人目の素数さん垢版2018/01/15(月) 16:35:00.20ID:wJofbCL/
自己解決
かっこが足りなかった
0331132人目の素数さん垢版2018/02/06(火) 18:35:39.90ID:tAZA/Fp/
『Rを使った〜』だとPythonじゃないのかよって思うよね
0332132人目の素数さん垢版2018/02/06(火) 21:37:32.10ID:tUqX17n9
ずっとRだけでPython触ったこと無いけど、覚え直す価値ある?
環境構築からもう面倒なイメージ
0333132人目の素数さん垢版2018/02/06(火) 22:43:23.82ID:qQMNyZjW
Python自体は:と直後のインデントさえ気を付ければかなり簡単
3系は数が全て小数扱いなので楽

Anacondaというパッケージでインストールすれば、今流行りのJupyter Notebookという開発環境で対話的にコーディングできる(Rも使える)
0334132人目の素数さん垢版2018/02/07(水) 20:40:49.48ID:mgaw9oVw
アナコンダてのがRぽくできるのね、ありがとう
dplyrやggplot2みたいに素人でも簡単便利だといいんだけど
Pythonはオブジェクト志向ぽいしすぐ諦めそう
0335132人目の素数さん垢版2018/02/12(月) 16:19:11.21ID:NSJ4iUa4
ブラウザ環境なくなっちゃったの?
0337132人目の素数さん垢版2018/02/13(火) 18:21:54.45ID:1hic99Cx
ブラウザでプログラミングする環境
0340132人目の素数さん垢版2018/02/25(日) 18:12:28.68ID:aD34K55o
統計学とウェブ解析を交えて実践的な勉強と練習を
したいのですが、おすすめな書籍やサイトはありますか。
実際に解析ツールや分析ツールを用いて
自分で分析解析してから
解答を見て適切な手順や方法、考察を
解説してくれるものが良いです。


統計学は統計検定2級の知識はありますが
ウェブ解析はテキスト読んだだけです。
0342132人目の素数さん垢版2018/02/27(火) 00:54:41.17ID:hS0OJ3qQ
R studioは日本語コメント書く度にIMEが無効になったりカーソルがずれたり黒文字の予測変換が黒背景と重なって見えなくなったりと散々だわ
0347132人目の素数さん垢版2018/02/27(火) 14:05:09.17ID:O+8uJ5V+
板名読める?
0349132人目の素数さん垢版2018/03/04(日) 21:28:34.58ID:R7ZPBSuG
ストアアプリも同じ症状でるからRStudio固有の問題でなくWindows環境の不治の病だと思ってる
0352132人目の素数さん垢版2018/04/04(水) 07:52:09.98ID:PZp+DZN4
Fisher test検定時に
p<2.2e-16
と表示されるんですが、これより小さい値の指数桁数を正確に表記する方法教えて下さい。
例えば5.8e-35となるようにです。
0354132人目の素数さん垢版2018/04/04(水) 10:02:52.31ID:CRvlhZKw
fisher.test関数の返り値はlist型で、その中にp.valueという名前でp値が格納されているから$演算子を使って直接参照するか、broom::tidy関数に返り値を渡してdata.frame形式で出力してやれば見れる
0356132人目の素数さん垢版2018/04/04(水) 13:06:17.36ID:PZp+DZN4
352です。よく分かりました!
ありがとうございます!
0357132人目の素数さん垢版2018/04/04(水) 14:44:33.05ID:LbKgW3kd
>>356
技術的な助言をしたけど、学術的に言えば、
p < 0.01 は全て p < 0.01 として、具体的なp値を考える意味はないと思うよ。
一部の例外的な研究分野を除いて(e.g., 遺伝統計学)。
0358132人目の素数さん垢版2018/04/04(水) 15:18:50.72ID:PZp+DZN4
はい、まさにその例外的な分野で使おうとしてます。ありがとうございます。
0370132人目の素数さん垢版2018/04/19(木) 21:35:35.54ID:GVMUXyX9
Rのガンマ関数はいくつでオーバーフローするかやってみた。

> i=1
> while(gamma(i)!=Inf){
+ i=i+1
+ }
Warning message:
In gamma(i) : value out of range in 'gammafn'
> i
[1] 172
> gamma(172)
[1] Inf
Warning message:
value out of range in 'gammafn'
> gamma(171)
[1] 7.257416e+306
0371132人目の素数さん垢版2018/04/29(日) 00:21:51.67ID:5dW+xNwa
matplot()で折れ線グラフ描いたときに、X軸をカテゴリで示したいのですが、
可能でしょうか?

例えばtemp <- c("0時間","8時間","24時間","48時間")として、
matplot()の引数にtempをとるやり方です。
他にもやり方あれば教えてください。
0373132人目の素数さん垢版2018/04/30(月) 16:50:51.65ID:t3vhzyao
>>372
遅くなりましたがありがとうございました。
できました!
0384132人目の素数さん垢版2018/05/01(火) 18:57:32.34ID:iUBwAKWd
特定の長方形の中に複数の長方形を最小面積で敷き詰める平面充填に関するパッケージってありませんかね
0387132人目の素数さん垢版2018/05/06(日) 22:15:43.42ID:BK1CxH7U
# jonckheereテストを書いてみた

jonckheere <- function(L,
alternative = c("two.sided", "increasing", "decreasing"),
cat=TRUE){
# L : list of vectors A1,A2,...,Ak, with assumed tendency
How.Many.Greater.Pairs <- function(A,B){ # How many pairs of A[i] > B[j], count as 0.5 when equal,
n.a = length(A)
n.b = length(B)
how.many.greater.pairs = 0
for(i in 1:n.a){
for(j in 1:n.b){
how.many.greater.pairs = how.many.greater.pairs+ifelse(A[i]==B[j],0.5,A[i]>B[j])
}
}
return(how.many.greater.pairs)
}
Sum.of.Greater.Pairs <- function(L){ #L=list(A1,,,,Ak),A1 < A2 < A3,..,< Ak : vector
k = length(L)
comb = combn(1:k,2) # possible combinaition of pairs to compare
n.comb = ncol(comb) # how many combinations
J = 0 # sum of greater pairs
for(i in 1:n.comb){
J = J + How.Many.Greater.Pairs(L[[comb[1,i]]],L[[comb[2,i]]])
}
return(J)
}
J = Sum.of.Greater.Pairs(L)
n = sapply(L,length)
N = sum(n)
EJ = (N^2-sum(n^2))/4
VJ = (N^2*(2*N+3)-sum(n^2*(2*n+3)))/72
Z = (J-EJ)/sqrt(VJ)
alternative = match.arg(alternative)
p.value = switch(alternative, 'two.sided' = 2 * min(pnorm(Z), pnorm(-Z), 0.5),
'increasing' = pnorm(Z),
'decreasing' = pnorm(-Z))
if(cat){
cat( 'p.value = ', p.value,'\n')
cat('alternative hypothesis: ' ,alternative,'\n')
}
invisible(p.value)
}
0389132人目の素数さん垢版2018/05/22(火) 21:16:34.39ID:iB1pjrmI
>>388
実態調査か何か?
<-と=は挙動が違う場合があるので、使い分けていますが、
代入はどっちかと問われたら、無論 <- または ->

なお、
> 1 -> x
これはエラーにならないけど、
> 1 = x
1 = x でエラー: 代入の左辺が不正 (do_set) です
これはエラー
0390132人目の素数さん垢版2018/05/23(水) 11:17:56.08ID:OSJ/4EBd
>>389
俺は基本=派。

関数の定義は
z.test <- function(x,n=16,sigma=1){
z=sqrt(n)*mean(x)/sigma
2*pnorm(abs(z),lower=FALSE)
}
と書いている。
0391132人目の素数さん垢版2018/05/23(水) 11:24:57.67ID:MGQGuwX9
>1 = x でエラー

当たり前
そんな使い方なんてするかよ

他言語と同じく=一文字の方がすっきりしてイイ
0392132人目の素数さん垢版2018/05/24(木) 14:28:38.60ID:ExPgBsbL
こういうのが紛らわしいから、俺は = 推奨。

x <- 1
if(x <- 1) print('YES')
if(x < -1) print('YES')
0393132人目の素数さん垢版2018/05/24(木) 14:36:00.11ID:EQ5K0CF7
だよねぇ
<-良くない
0394132人目の素数さん垢版2018/05/25(金) 08:05:58.04ID:ZHt2t+40
やったことなかったので関数の初期値設定に<-を使うとどうなるかやってみた。
まず、= の場合
> z.test <- function(x,n=16,sigma=1){
+ z=sqrt(n)*mean(x)/sigma
+ 2*pnorm(abs(z),lower=FALSE)
+ }
> z.test(1:3)
[1] 1.244192e-15

<- で初期値設定すると、エラー

> z0.test <- function(x,n<-16,sigma<-1){
Error: unexpected assignment in "z0.test <- function(x,n<-"
> z=sqrt(n)*mean(x)/sigma
Error in mean(x) : object 'x' not found
> 2*pnorm(abs(z),lower=FALSE)
Error in pnorm(abs(z), lower = FALSE) : object 'z' not found
> }
0395132人目の素数さん垢版2018/05/25(金) 08:11:48.02ID:ZHt2t+40
俺は見栄えがいいと思って関数定義には<-を使っているけど
= でも通常に動作する。
> z.test = function(x,n=16,sigma=1){
+ z=sqrt(n)*mean(x)/sigma
+ 2*pnorm(abs(z),lower=FALSE)
+ }
> z.test(1:3)
[1] 1.244192e-15

<- 推奨の人に聞きたいのだけど
<- でないと動作しないってことあるのだろうか?
0396132人目の素数さん垢版2018/05/25(金) 09:41:36.92ID:GCdXSt8a
<-は、打つのが
=より面倒

うっとおしい
0397132人目の素数さん垢版2018/05/25(金) 20:19:41.68ID:dXqzteX1
RStudioつかってりゃ[Alt+-]で簡単入力

それと引数の指定は代入じゃないと思うんだが感覚が違うよかな?
0398132人目の素数さん垢版2018/05/25(金) 21:33:31.44ID:QNMt6z2O
>>396
essだとアンダースコアを入れるを勝手に「<-」になる。
>>394
それは代入ではなく、関数の規定値の設定。
規定値の設定は「=」と決められているので、「<-」はアウト。
ただし、関数を実行するときには「<-」を使うことができる。
> mean(x<-1:10)
[1] 5.5
> x
[1] 1 2 3 4 5 6 7 8 9 10
0400132人目の素数さん垢版2018/05/28(月) 16:26:17.30ID:d/09kgU6
>>398
ありがとうございます。
そんな使い方ができたのですね。

こんなのしか知りませんでした。

> f <- function() {
+ x<<-1:10
+ mean (x)
+ }
> f()
[1] 5.5
> x
[1] 1 2 3 4 5 6 7 8 9 10
0401132人目の素数さん垢版2018/05/28(月) 20:56:51.59ID:Osxttqv4
一画面しかグラフがないのに

Hit <Return> to see next plot:

と出るの鬱陶しいな、と思っていたら

par(ask=FALSE)

と設定しておけばいいんだな。
0402132人目の素数さん垢版2018/05/29(火) 18:08:52.29ID:ZCWRCH5Y
同名のdataがあるのでパッケージを::で指定してもうまくいかなかった。

data(netmeta::parkinson)

でなくて

data(parkinson, package = 'netmeta')

とするんだな。
0403132人目の素数さん垢版2018/05/30(水) 06:16:03.29ID:fLd3NENr
hist(rnorm(100),col=rgb(runif(1),runif(1),runif(1),runif(1)))
だと、1色だけど

hist(rnorm(100),col=sample(colours(),(sample(1:10,1))))
なら1〜10色で表示される。
0404132人目の素数さん垢版2018/05/31(木) 21:37:03.79ID:BfVjjX7C
runif(1)なんて・・・
0405132人目の素数さん垢版2018/05/31(木) 23:16:15.39ID:grs1zCKo
> hist(rnorm(100),col=rgb(runif(1),runif(1),runif(1),runif(1)))
何色に増やしてもいいがな。
何をやりたいのかな?
hist(rnorm(5000),col=apply(matrix(runif(80),4), 2, function(x){rgb(x[1],x[2],x[3],x[4])}))
0406132人目の素数さん垢版2018/06/01(金) 21:54:20.67ID:Ef899k/0
:::てどういう時に使うんだろ?
ソース読みたくて
library(BayesFactor)
ttestBF_indepSample
では表示されなかったが、
library(BayesFactor)
BayesFactor:::ttestBF_indepSample
だと出てきた。
0413132人目の素数さん垢版2018/06/11(月) 00:14:18.19ID:K1zGYlRd
関数を値で上書きしてしまった場合に元に戻す方法を教えて頂きたく。

例)
rm <- 1
としてしまった場合にrm関数を元に戻したいです。


よろしくお願いします。
0415132人目の素数さん垢版2018/06/11(月) 08:24:34.24ID:2ZHCUqeW
>>413
自分で作ったのではない関数の rm だったら rm(rm) で数値ベクトルオブジェクトが消えて、関数の rm が見えるようになる。
0416132人目の素数さん垢版2018/06/11(月) 15:01:37.34ID:mlFyU0v4
>>413
> rm <- 1
> ls()
[1] "rm"
> rm(rm)
> ls()
character(0)
> rm
function (..., list = character(), pos = -1, envir = as.environment(pos),
[以下略]

深く考えなくてもrm(rm) で元に戻るけど。
rmが数値ではなくて自作関数だったら、少々ややこしいけど、
base::rm()で大丈夫だろう
0417132人目の素数さん垢版2018/06/11(月) 17:04:35.54ID:Z+okZT62
>>413
既に説明されてるけど上書きじゃなくて別オブジェクト扱いになるからrmで消すか明示的にパッケージを::演算子で関数を指定してやればおけ

自作関数だと上書きされちゃうけど
0418132人目の素数さん垢版2018/06/11(月) 19:33:14.14ID:rfEFkwvW
rmが自作関数だと戻せないのでは?

> rm = function(x) asin(sqrt(x))
> rm(1)
[1] 1.570796
> rm
function(x) asin(sqrt(x))
> rm = 1
> rm
[1] 1
> rm(rm)
> rm
function (..., list = character(), pos = -1, envir = as.environment(pos),
inherits = FALSE)
0419132人目の素数さん垢版2018/06/11(月) 19:51:41.60ID:Z+okZT62
同じ名前空間にあるなら上書きされちゃうよ

.Gloalenv(だったかな?)に自作関数があり、そこに上書きして変数にしてるから消したら消えるだけで戻せない
0420132人目の素数さん垢版2018/06/11(月) 19:55:10.50ID:Z+okZT62
ちょっと古いけど、この辺りを読むとなぜそうなるかが分かると思う

(Rの)環境問題について その1。
ttps://qiita.com/kohske/items/325bdf48f4f4885a86f1
0421132人目の素数さん垢版2018/06/11(月) 20:04:41.37ID:mlFyU0v4
>>418
戻せます。
> rm <- function(x) asin(sqrt(x))
> rm
function(x) asin(sqrt(x))
> base::rm(rm)
> rm
function (..., list = character(), pos = -1, envir = as.environment(pos),
[以下略]
0424413垢版2018/06/11(月) 21:00:49.78ID:K1zGYlRd
>>414-422
みなさまご返信ありがとうございました。
例示したものがbase::rmだったので自作関数のことまでは想像だにしませんでした…(がとても良い勉強になりました。)

自環境でも上書きした関数を元に戻すことが出来ることを確認しました。
0425132人目の素数さん垢版2018/06/12(火) 07:42:40.88ID:9RfEtlLW
>>421
戻したいのが自作関数
rm = function(x) asin(sqrt(x))
だったら上書きされて無理じゃないの?
ゴミ箱から消去したファイルを復活させるソフトもあるから
PCに詳しければ可能かもしれないけれど
Rの機能としては復活させるのは無理と思う。
0426132人目の素数さん垢版2018/06/12(火) 11:00:45.94ID:cD/mQB+6
自作のrm関数はbaseパッケージとは別に定義されるから
base::rm(rm)で自作の方のrmは消えてbase::rmが「復活」します。
0428132人目の素数さん垢版2018/06/12(火) 14:36:07.63ID:VF7OcVBc
>>425
ちょっと意味がわからない。
自作の関数なら定義を再実行するだけなのに、
消える消えないって何が問題なんだ?
0430132人目の素数さん垢版2018/06/14(木) 09:27:55.98ID:mxBGyFKT
共同ツール 1
https://seleck.cc/685

https://trello.com/
ボードのメニュー → Power-Upsから拡張可能 Slack DropBoxなど
Trello Chrome拡張機能 elegant
ttp://www.kikakulabo.com/service-eft/
trelloのオープンソースあり

共同ツール 2
https://www.google.com/intl/ja_jp/sheets/about/

共同ツール 3
https://slack.com/intl/ja-jp
https://www.dropbox.com/ja/
https://bitbucket.org/
https://ja.atlassian.com/software/sourcetree
https://www.sketchapp.com/
ttp://photoshopvip.net/103903
ttps://goodpatch.com/blog/sketch-plugins/

Trello Chrome拡張機能プラグイン集
https://chrome.google.com/webstore/search/trello?_category=extensions

Slackプラグイン集
https://slack.com/apps

Sketchプラグイン集
https://sketchapp.com/extensions/plugins/
https://supernova.studio/
0432132人目の素数さん垢版2018/06/17(日) 19:06:33.58ID:OYjqtCQI
>>306
知恵袋に漸化式があったので計算スクリプトを書いてみた。
表がでる確率pのコインをN回投げてK回以上表が続く確率。

# N: flips
# K: least sequential head
# p: probability of head
seqNp <- function(N=100,K=5,p=0.5){
if(N==K) return(p^K)
q=1-p
a=numeric(N) # a(n)=P0(n)/p^n , P0(n)=a(n)*p^n
for(i in 1:K) a[i]=q/p^i # P0(i)=q for any i

for(i in K:(N-1)){ # recursive formula
a[i+1]=0 # a[i+1]=q/p*(a[i]+a[i-1]+a[i-2]+...+a[i-(K-1)])
for(j in 0:(K-1)){
a[i+1]=(a[i+1]+a[i-j])
}
a[i+1]=q/p*a[i+1]
}

P0=numeric(N) # P0[n] : probability of ending with 0 head when flipped n times
for(i in 1:N) P0[i]=a[i]*p^i # P0(n)=a(n)*p^n

MP=matrix(rep(NA,N*K),ncol=K)
colnames(MP)=paste0('P',0:(K-1))
MP[,'P0']=P0
MP[1,'P1']=p
for(i in (K-2):K) MP[1,i]=0
# MP[k,n] = Pk[n] : probability of ending with k head when flipped n times
for(k in 2:K){ # Pk(n+1)=p*P(k-1)(n)
for(i in 1:(N-1)) MP[i+1,k]=p*MP[i,k-1]
}
ret=1-apply(MP,1,sum)

ret[N]
}
0435132人目の素数さん垢版2018/06/19(火) 10:20:04.23ID:fcA67BpN
>>434
run.check <- function (x, n=5) {
# x の中に 1 が n 回以上連続していれば TRUE を返す.

chg <- c(TRUE, diff(x) != 0) # 変化があった場所
chgidx <- c(which(chg), length(x)+1) # 変化があった場所の添え字
run.length <- diff(chgidx) # 0や1の連続している個数
true.length <- run.length[x[chg] == 1] # 1の連続している個数
any(true.length >= n) # 連続している個数が n 以上のrunがあるか?
}
0436132人目の素数さん垢版2018/06/19(火) 21:57:17.85ID:QuKrVrE8
>>435
whichとdiffを用いての解法のお返事ありがとうございます。

実行時間を>302のスクリプトと比べてみました。

run.check <- function (x, n=5) {
# x の中に 1 が n 回以上連続していれば TRUE を返す.

chg <- c(TRUE, diff(x) != 0) # 変化があった場所
chgidx <- c(which(chg), length(x)+1) # 変化があった場所の添え字
run.length <- diff(chgidx) # 0や1の連続している個数
true.length <- run.length[x[chg] == 1] # 1の連続している個数
any(true.length >= n) # 連続している個数が n 以上のrunがあるか?
}


# N(=100)回コインをなげてn(=5回)以上続けて表がでる確率。
seqn<-function(n=5,N=100,p=0.5){
rn=rbinom(N,1,p)
count=0
for(i in 1:N){
if(rn[i] & count<n){
count=count+1
}
else{
if(count==n) {return(TRUE)}
else{
count=0
}
}
}
return(count==n)
}

> system.time(mean(replicate(10^5,run.check(rbinom(100,1,0.5)))))
user system elapsed
17.56 0.04 17.68
> system.time(mean(replicate(10^5,seqn())))
user system elapsed
9.74 0.07 9.78

後者の方が速いのは1がn個連続したら、TRUEを返して終了するので以後のチェックはしないためだろうと思います。

diff や anyの使い方が勉強になりました。

時間を割いてスクリプトを作成していただいてありがとうございます。<(_ _)>
0437132人目の素数さん垢版2018/06/21(木) 10:12:41.96ID:Ze2kEGUX
Rstudioで日本語の入力ができないのですが、解決する方法知ってる方いませんか?
具体的には、IME自体をオンにすることができません。
日本語の表示やコピペは問題なくできます。

環境
Linux - Utubntu
RStudio Version 1.0.143
0438132人目の素数さん垢版2018/06/21(木) 10:26:53.84ID:Fds/4hNR
RStudioのQtが古いのでパッチ当てないと日本語入力できないのが現状ですわ
パッチはUbuntu 16.04.LTS用にしかないので他のバージョンならRStudioサーバー使った方が早いかと

なお、パッチはRStudio 日本語とかでグクってみて
0439132人目の素数さん垢版2018/06/23(土) 17:38:43.39ID:aZCZP6wm
windows版のRStudioでもたまに日本語入力ができなくなる。
別のソフトでIMEのON/OFFをやってから戻ると直るけど。
0441132人目の素数さん垢版2018/06/23(土) 21:30:47.03ID:JcH4CpHc
Windowsはストアアプリでも同じ症状でるから持病なんじゃないかと思う
Ubuntuはfcitxのパッチ当てとけばWindowsのような症状は出ないので快適
0443132人目の素数さん垢版2018/06/26(火) 07:08:45.35ID:Na/Ih9Bj
問題

99人の囚人がいます。彼らの頭に1〜100までのナンバーカードが貼りつけられた帽子をランダムにかぶせます。
他人の帽子は見ることができても、自分の帽子は見ることができません。
帽子の数は全部で100なので、一つ使われずに余ります。
そのナンバーは囚人達にはわからないようにしておきます。
この状況で、囚人たちに一斉に自分のナンバーを宣言させて、全員が正解だったら釈放するという賭けをします。
囚人たちには帽子をかぶせられる前に相談タイムが設けられています。
どういう戦略を取れば、助かる確率を最も高くできるでしょうか?
http://000013.blogspot.com/2010/12/99.html

解答を読んでも数理が理解できないが
確率が0.5になるのはシミュレーションできた。

# http://000013.blogspot.com/2010/12/99.html
inversion <- function(x){
n=length(x)
ret=numeric(n)
for(i in 1:(n-1)){
ret[i] = sum(x[i] > x[(i+1):n])
}
sum(ret) # inversion number
}
is.even= function(x) !inversion(x)%%2 # is inverion number even?

prisoner99 <- function(n=100){
indx=sample(1:n,1) # defective number
X=sample((1:n)[-indx])
Y=numeric(n-1)
for (i in 1:(n-1)){ # select as even permutation
x1=X[-i]
x2=(1:n)[!(1:n) %in% x1] # two numbers unseen for i-th prisoner
tmp=X
tmp[i]=x2[1] ; tmp[n]=x2[2]
Y[i]=ifelse(is.even(tmp), x2[1],x2[2])
}
all(X==Y)
}
mean(replicate(1e3,prisoner99()))
0444132人目の素数さん垢版2018/07/11(水) 16:20:29.88ID:zFHa28EV
>>437
遅レスだが、Ubuntu 18.04LTSならデフォルトのIBus-mozcで日本語入力ができるそうだ。
詳しくはUbuntu Weekly Recipeの第527回を読んでくだされ
0445132人目の素数さん垢版2018/07/22(日) 11:22:38.35ID:Ott8rTSz
覆面算 RED + WHITE = COLOR

どうもCでやったらうまくいかないのでRでやってみた。

# RED + WHITE = COLOR
x=c('R','E','D','W','H','I','T','E','C','O','L','O','R')
unique(x)
redwhite <- function(R,E,D,W,H,I,T,C,O,L){
red=10^(2:0)
white=10^(4:0)
color=10^(4:0)
sum(red*c(R,E,D))+sum(white*c(W,H,I,T,E)) - sum(color*c(C,O,L,O,R))
}

x=unique(x) ; x
REDWHITECOLOR <- function(x){
R=x[1]
E=x[2]
D=x[3]
W=x[4]
H=x[5]
I=x[6]
T=x[7]
C=x[8]
O=x[9]
L=x[10]

cat(paste('RED = ',R,E,D,
' WHITE = ',W,H,I,T,E,
' COLOR = ',C,O,L,O,R),'\n')
}
REDWHITECOLOR(unique(x))

library(gtools)
perm=permutations(n=10,r=10,v=0:9)
perm=perm[perm[,1]!=0&perm[,4]!=0&perm[,8]!=0,] # R!=0,W!=0,C!=0
head(perm) ; tail(perm)
n=nrow(perm)
re=numeric(n)
for(i in 1:n){
re[i]=redwhite(perm[i,1],perm[i,2],perm[i,3],perm[i,4],perm[i,5],perm[i,6],perm[i,7],perm[i,8],perm[i,9],perm[i,10])
}
hist(re)
(indx=which(re==0))
REDWHITECOLOR(perm[indx,])

> REDWHITECOLOR(perm[indx,])
RED = 5 8 7 WHITE = 3 9 6 1 8 COLOR = 4 0 2 0 5
0446132人目の素数さん垢版2018/07/22(日) 12:50:02.38ID:Ott8rTSz
# AAB
# × CD
# ------
# CCE
# BFAA
# ------
# BEBDE
f <- function(A,B,C,D,E,F){
(A*100+A*10+B)*D==C*100+C*10+E &(A*100+A*10+B)*C==B*1000+F*100+A*10+A &
(C*100+C*10+E)+(B*1000+F*100+A*10+A)*10==B*10000+E*1000+B*100+D*10+E
}
library(gtools)
perm=permutations(n=10,r=6,v=0:9)
n=nrow(perm)
re=numeric(n)
for(i in 1:n){
re[i]=f(perm[i,1],perm[i,2],perm[i,3],perm[i,4],perm[i,5],perm[i,6])
}
indx=which(re==TRUE)
perm[indx,]
0447132人目の素数さん垢版2018/07/23(月) 11:09:01.32ID:SDW/E7TY
大変初歩的な質問で恐縮ですが、ご教示いただければ幸いです。

PERT分布を学んでいるのですが、ベータ分布のスケーリングの仕方が分かりません。
最小値a、最頻値b、最大値c として、a, b, c から求めたパラメータをa1、a2 とします。
このとき、
dbeta(x, a1, a2)*(c-a)+a
とすると、当然ながら横軸の値の範囲は0から1で、縦軸の値のみ大きくなってしまいます。

横軸の値の範囲がaからcで、縦軸の値は確率密度のままにするには、どうしたらよいのでしょうか?
0449132人目の素数さん垢版2018/07/23(月) 18:17:20.65ID:SDW/E7TY
>>448

447です。ご教示どうもありがとうございました。

a <- 40 # 最小値
b <- 45 # 最頻値
c <- 70 # 最大値
mu <- (a+4*b+c)/6 # PERT分布の平均値
a1 <- b*(mu-a)/(c-a) # パラメータ a1
a2 <- b*(c-mu)/(c-a) # パラメータ a2
pert1 <- function(x) dbeta(x,a1,a2) # ベータ分布布の計算


まではできたのですが、ご教示いただいた方法で
pert1 <- function(x) dbeta(x-a ,a1,a2)
とすると、x の範囲が0から1で、yが0の一様分布のようなグラフになってしまいます。
0450132人目の素数さん垢版2018/07/23(月) 20:05:23.59ID:5MGL8f5L
4パラべーたへの変換は下記かな?
https://en.wikipedia.org/wiki/Beta_distribution#Four_parameters_2
a1とa2のパラメータ推定って合ってるんだっけ?僕も正直わかんない

やりたいことはこれだと思う
install.packages("mc2d")してからやってね
----------------------------------------------------
rm(list=ls())
library(mc2d)

a <- 40 # 最小値
b <- 45 # 最頻値
c <- 70 # 最大値

pert4<-function(x) dpert(x,min=a,mode=b,max=c,shape=4)
x1<-40:70
plot(x1,pert4(x1))
0451132人目の素数さん垢版2018/07/23(月) 21:05:56.52ID:+HoGXx9d
>>450
447です。

450様、まさにこれ、これです。どうもありがとうございました。
おかげさまで大変助かりました。

448様にも、ご助言下さいましたこt、厚く御礼申し上げます。
0452132人目の素数さん垢版2018/07/27(金) 15:50:12.19ID:E7dz8jqT
lmtestのパッケージをインストールしようとすると不正なマルチバイト文字がありますと出てくるのですがどうすればいいですか?
0453132人目の素数さん垢版2018/07/27(金) 17:33:01.36ID:ufA3ZDTu
>>452
Windows 10 (Rの日本語ヘルプはインストールしていない)+ R studioだけど、そのメッセージ出ないな。
0455132人目の素数さん垢版2018/07/28(土) 12:56:05.38ID:lhV9Awbf
職場のSPSS信者たちにRを認めてもらうにはどうしたら良いだろう
「安かろう悪かろう」「俺が知らないものは三流」的な考え方の人が多くて肩身が狭い…
0456132人目の素数さん垢版2018/07/28(土) 17:53:14.05ID:XHIBT/Gx
>>455
>>452のようなエラーが出たら「無料のものはやっぱりダメね」
有償(SPSS) →信頼できる
ボランティア→いい加減
と言う思考らしい
0457132人目の素数さん垢版2018/07/28(土) 18:33:45.13ID:l8Bhwsl9
>>454
ユーザー名はアルファベット1文字です
studioインストールしてないんですけど、しないとダメですか?
0459132人目の素数さん垢版2018/07/29(日) 07:46:06.57ID:u2P99O/7
linuxなら環境変数LANGをCにすれば解決する問題だからwindowsでも似たような対処すれば行けそう。
0460132人目の素数さん垢版2018/07/29(日) 19:38:42.16ID:hjP1s1BE
これかな?

> Sys.setlocale(locale="C") # locale の変更(USの設定にしないと表示が変になる)
[1] "C"
元に戻すには
> Sys.setlocale(locale="Japanese_Japan.932")
0461132人目の素数さん垢版2018/08/02(木) 20:59:18.66ID:DvtHDake
すみません、教えて下さい。

フィッシャーの正確確率検定で、
適合度(一様性)の検定ってできますか?
できるのは独立性の検定のみ?

Rでいろいろ試したみたんですが、
2群ないとエラーになる。。
0463132人目の素数さん垢版2018/08/02(木) 21:52:11.65ID:DvtHDake
>>462
レス感謝です。

そうなんですが、
期待度数が5未満になってしまった場合は、
カイ二乗検定は向かないんですよね?
0465132人目の素数さん垢版2018/08/02(木) 23:02:57.38ID:clch7kxN
>>463
こういうので
r1=5;r2=4;n1=10;n2=12
prop.test(c(r1,r2),c(n1,n2),correct=TRUE)
chisq.test(matrix(c(r1,r2,n1-r1,n2-r2),2,byrow=TRUE),correct=TRUE)

警告がでるという話かな?
Warning message:
In chisq.test(matrix(c(r1, r2, n1 - r1, n2 - r2), 2, byrow = TRUE), :
Chi-squared approximation may be incorrect
0466132人目の素数さん垢版2018/08/03(金) 09:04:31.58ID:VGe+pklE
>>463
適合度を見るのに関係ないだろ。
> cnt
[1] 1 0 2 4 3 4 12 6 12 11 21 22 21 37 40 30 59 44 49 47 38 48 36 43 38
[26] 46 33 34 30 21 26 33 17 13 14 12 8 16 7 7 9 6 6 5 3 8 4 4 4 1
[51] 0 2 1 0 0 0 0 2
> prb
[1] 0.0002947255 0.0006464052 0.0012538873 0.0022037831 0.0035720843
[6] 0.0054114364 0.0077413658 0.0105430123 0.0137588816 0.0172972083
[11] 0.0210398698 0.0248524558 0.0285950600 0.0321325300 0.0353432214
[16] 0.0381256526 0.0404028045 0.0421240952 0.0432652773 0.0438266419
[21] 0.0438299769 0.0433147339 0.0423338191 0.0409493611 0.0392287274
[26] 0.0372409836 0.0350539129 0.0327316483 0.0303329196 0.0279098757
[31] 0.0255074215 0.0231629878 0.0209066521 0.0187615256 0.0167443293
[36] 0.0148660914 0.0131329065 0.0115467110 0.0101060386 0.0088067297
[41] 0.0076425765 0.0066058952 0.0056880193 0.0048797146 0.0041715201
[46] 0.0035540195 0.0030180499 0.0025548579 0.0021562071 0.0018144483
[51] 0.0015225575 0.0012741483 0.0010634658 0.0008853653 0.0007352804
[56] 0.0006091856 0.0005035529 0.0004153084
> chisq.test(cnt, p=prb, rescale.p=TRUE, simulate.p.value=TRUE)

Chi-squared test for given probabilities with simulated p-value (based
on 2000 replicates)

data: cnt
X-squared = 65.504, df = NA, p-value = 0.2189
5未満の数があっても関係がない
0468132人目の素数さん垢版2018/08/04(土) 02:59:15.87ID:8dNre62F
463です。
カイ二乗検定で、期待度が5未満が多いのは不適切なのかと思い込んでおりましたが、
それは独立性の検定の場合のことであり、
適合度(一様性)の検定の場合は、
気にしなくて良かったのか。。
ならカイ二乗検定でやります。

いろいろ教えて下さり、ありがとうございます。
0474132人目の素数さん垢版2018/08/05(日) 19:10:34.43ID:mULz5b3r
>>472
周囲のspssユーザを見ると「指導教員がspssしか使えないので、
自分もspssしか使えない、
新しい(学術系)ソフトは誰かに丁寧に根気よく指導してみらえないと無理」、
これの再生産。
0479132人目の素数さん垢版2018/08/08(水) 13:11:20.17ID:7/3l/PxD
再帰呼び出しに関数名の代わりにRecall使うと処理に要する時間が増えることに気づいた。

フィボナッチ数列の再帰呼び出し
# 関数名での呼び出し
fibo <- function(n){
if(n==1|n==2) return(1)
else fibo(n-1)+fibo(n-2)
}

# Recallを使っての呼び出し
fiboR <- function(n){
if(n==1|n==2) return(1)
else Recall(n-1)+Recall(n-2)
}


> system.time(fibo(30))
user system elapsed
4.27 0.02 4.36
> system.time(fiboR(30))
user system elapsed
6.65 0.00 6.70
0480132人目の素数さん垢版2018/08/09(木) 17:47:22.65ID:l1M8GWWv
cumsumを再帰関数で書いてみた。

何度も試行錯誤

# cumsum with recursive call
cumsumR <- function(v){
res=numeric(length(v))
cumsumR_sub <- function(v,res,i){
res[1]=v[1]
if(i==length(v)) return(res)
else{
res[i+1] = res[i] + v[i+1]
Recall(v,res,i+1)
}
}
cumsumR_sub(v,res,1)
}
cumsumR(1:10)

とりえあず、動作した。
> cumsumR(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
0481132人目の素数さん垢版2018/08/09(木) 18:31:24.68ID:l1M8GWWv
簡略化できた

cumsumR <- function(v,res=NULL,i=1){
res[1]=v[1]
if(i==length(v)) return(res)
else{
res[i+1] = res[i] + v[i+1]
Recall(v,res,i+1)
}
}

> cumsumR(1:10)
[1] 1 3 6 10 15 21 28 36 45 55
>
0482132人目の素数さん垢版2018/08/10(金) 18:41:42.48ID:Hlm8Oe3x
ifelseの動作がどうも納得できないでご教示いただきたいのですが。
これってifelseの仕様でしょうか?バグでしょうか?

> x=2:1
> if(x[1]<=x[2]) x else x[2:1]
[1] 1 2
> ifelse(x[1]<=x[2],x,x[2:1])
[1] 1
0483132人目の素数さん垢版2018/08/10(金) 18:55:39.89ID:vdkgfABT
>>482
ifelse() はベクトル演算できる関数。
だから、戻り値の要素数は、test部分の要素数に一致する。
testが1つなので、x[2:1]の1つ目の要素が返される。
0484483垢版2018/08/10(金) 18:58:51.59ID:vdkgfABT
testの要素を2つにすれば、出力も2つになる。
> ifelse(c(x[1] <= x[2], x[1] <= x[2]), x, x[2:1])
[1] 1 2
さらに3つにすると、helpに書いている通り、yesやno部分は再利用される。
> ifelse(c(x[1] <= x[2], x[1] <= x[2], x[1] <= x[2]), x, x[2:1])
[1] 1 2 1
0485132人目の素数さん垢版2018/08/10(金) 23:06:17.77ID:Hlm8Oe3x
>>483
ありがとうございました。

バグではなくてそういう仕様だったのですね。

こういう使い方ができるということがわかって勉強になりました。

> x=2:1
> ifelse(c(x[1]!=x[2],x[1]==x[2]),1:2,3:4)
[1] 1 4
0486132人目の素数さん垢版2018/08/10(金) 23:17:14.10ID:VlOUWHrC
教わったので早速、

ifelse() はベクトル演算できると、再利用されるの動作確認。

> ifelse(c(TRUE,TRUE,FALSE,FALSE,TRUE,FALSE,FALSE),1:2,11:15)
[1] 1 2 13 14 1 11 12
0487132人目の素数さん垢版2018/08/10(金) 23:45:24.37ID:VlOUWHrC
2種類の文字の変換もifelseでできるんだなぁ。
> mat
[,1] [,2] [,3]
[1,] 1 1 1
[2,] 1 1 0
[3,] 1 1 0
[4,] 1 1 0
[5,] 1 1 0
[6,] 1 1 0
> print(apply(mat,2, function(x) ifelse(x==1,'真','偽')),quote=F)
[,1] [,2] [,3]
[1,] 真 真 真
[2,] 真 真 偽
[3,] 真 真 偽
[4,] 真 真 偽
[5,] 真 真 偽
[6,] 真 真 偽
0488132人目の素数さん垢版2018/08/11(土) 00:28:09.90ID:OesSEWnz
行列も次元付きのベクトルだからもっと簡略化できた。

> (mat=matrix(sample(0:1,12,rep=T),3,4))
[,1] [,2] [,3] [,4]
[1,] 1 1 0 1
[2,] 0 1 0 0
[3,] 1 0 0 1
> print(ifelse(mat==1,'Right','Wrong'),quote=F)
[,1] [,2] [,3] [,4]
[1,] Right Right Wrong Right
[2,] Wrong Right Wrong Wrong
[3,] Right Wrong Wrong Right
>
0490132人目の素数さん垢版2018/08/22(水) 14:02:15.21ID:rznk0lAS
規約分数にするパッケージが探せなかったので自分でスクリプトを組んでみた。
エラー処置は省略。


reduce_fraction <- function(x,y){
a=x
b=y
r = a%%b # a=bq+r -> a%%b=b%%r
while(r){
a = b
b = r
r = a%%b
}
gcd=b
cat(x/gcd,'/',y/gcd,'\n')
invisible(c(x/gcd,y/gcd))
}


> reduce_fraction(2860,1082900)
11 / 4165
0491132人目の素数さん垢版2018/08/23(木) 01:12:39.77ID:0Wz4IoKN
rvest?でログイン必要なとこをスクレイピングする時って
login_page <- html_session("https://xxxxx";)

login_form <- html_form(login_page)[[1]] %>%
set_values(AAA="xxxx", BBB="xxxx")

というので行けるはずなんですが
最終行のAAAとBBBってそれぞれhtmlタグのname=""のとこからとってくるんですよね?
これにここがname="user[email]"みたいに[]という記号はいってたらどうすればいいでしょうか?
0492132人目の素数さん垢版2018/08/25(土) 17:48:59.21ID:MdsDkupV
>>491
よろしくおねがいいしまーーーーーーーす
0493132人目の素数さん垢版2018/08/26(日) 22:01:57.06ID:2bj/HrEX
>>492
質問の意味がいまいち分からないから、誰も助言できないのでは?

> x <- 'user[email]'
> x
[1] "user[email]"

rvestパッケージを使ったことがないけど、
記号が入っていたらなぜ問題があるのかよく分からない。
0495132人目の素数さん垢版2018/08/27(月) 06:16:23.20ID:x8E4FG0O
>>493
ちがいます
AAAがどれかよくみてみてください
””はありません
0496132人目の素数さん垢版2018/08/27(月) 06:19:43.00ID:x8E4FG0O
ちょっと直接はることはできないのでタグだけはります。
<input class="form-control" autofocus="autofocus" placeholder="Email address" required="required" type="text" value="" name="user[email]" id="user_email">>>494
0497132人目の素数さん垢版2018/08/27(月) 13:25:39.67ID:SdOxff6m
>>495
もっと分かるように説明しないと、追試できる情報も提供しないし。
もしかして変数名などに[]が入っている場合 にどうしたらよいかってこと?

> `user[email]` <- 1:5
> `user[email]`
[1] 1 2 3 4 5
0498132人目の素数さん垢版2018/08/27(月) 15:43:37.46ID:x8E4FG0O
>>497
多分行けました
超感謝!!
0499132人目の素数さん垢版2018/08/27(月) 20:20:32.13ID:5a+trmgU
ある問題のシミュレーションしようと思って
問題文の記号のまま

q <- function(x)
....

とやって
q(100)と入力すると
Rが終了することに気づいた。
0501132人目の素数さん垢版2018/08/29(水) 22:45:10.53ID:BcwFyR33
ちょっとした疑問です。

空ベクトルの検出って長さ0以外に検出方法ってあるでしょうか?

> x=c(1,2)
> x=x[-1]
> x=x[-1]
> length (x)
[1] 0
> x
numeric(0)
> x==numeric (0)
logical(0)
> is.null(x)
[1] FALSE
> is.na(x)
logical(0)
> x==NULL
logical(0)
> x==NA
logical(0)
> length(x)==0
[1] TRUE
0502132人目の素数さん垢版2018/08/31(金) 22:46:15.16ID:IWQvY6FL
4点の座標を入力するとそれらを結ぶ四面体の体積を求めるスクリプトを書いてみた。
高さはパッケージnleqslvを使った近似計算。

# Calculate tetrahedron volume from cordinates
library(nleqslv)
Tetra <- function(O=c(1/2,sqrt(3)/6,sqrt(2/3)),A=c(0,0,0),B=c(1,0,0),C=c(cos(pi/3),sin(pi/3),0)){
fn <- function(x,O,A,B,C){
AO=A-O
BO=B-O
CO=C-O
HO=x[1]*AO+x[2]*BO+(1-x[1]-x[2])*CO # H on triangle ABC
AB=B-A
AC=C-A
c(HO%*%AB,HO%*%AC) # HO vertial to AB and AC
}
fn1 <- function(x) fn(x,O,A,B,C)
x=nleqslv::nleqslv(c(1/3,1/3),fn1)$'x'
AO=A-O
BO=B-O
CO=C-O
HO=x[1]*AO+x[2]*BO+(1-x[1]-x[2])*CO
h=sqrt(sum(HO^2))
a=sqrt(sum((B-C)^2))
b=sqrt(sum((C-A)^2))
c=sqrt(sum((A-B)^2))
s=(a+b+c)/2
base=sqrt(s*(s-a)*(s-b)*(s-c))
V=1/3*base*h
return(V)
}

初期値は辺の長さ1の正四面体

> options(digits = 16)
> Tetra()
[1] 0.1178511301977579
> sqrt(2)/12
[1] 0.1178511301977579

多分、正常に動作していると思う。
0503132人目の素数さん垢版2018/09/01(土) 00:25:33.05ID:52Ub52jp
>>502
行列式det使うと簡単
> po <- c(1/2, sqrt(3)/6, sqrt(2/3))
> pa <- c(0,0,0)
> pb <- c(1,0,0)
> pc <- c(cos(pi/3), sin(pi/3), 0)
> det(cbind(pa-po,pb-po,pc-po))/6
[1] -0.1178511
0504132人目の素数さん垢版2018/09/01(土) 01:41:47.56ID:qG52f2Ee
ベクトルの三重積を教わったので、パッケージ pracma の外積crossを使った

tetrahedron <- function(O=c(1/2,sqrt(3)/6,sqrt(2/3)),A=c(0,0,0),B=c(1,0,0),C=c(cos(pi/3),sin(pi/3),0)){
AO=A-O
BO=B-O
CO=C-O
as.numeric(abs(pracma::cross(AO,BO) %*% CO)/6)
}

4行で済んだ。

>>503

ありがとうございました。

パッケージに頼らずに計算できたのですね。
0505132人目の素数さん垢版2018/09/03(月) 18:55:17.77ID:S47YTHgP
データを解析する前にさらっと特徴を見たい時、皆さんはどんなコマンドを使っていますか?

私が思いつくのは
summary
boxplot
hist
pairs

です。こんなのも良いよってのがあったら教えてくださいm(_ _)m

※ライブラリの使用有無は問いません
0509132人目の素数さん垢版2018/09/09(日) 22:35:22.23ID:9XY+z1xx
>>501
良い方法が見つからなかったので !length(x)で空白ベクトル判定とした。

文字列を逆に並べる再帰呼び出しスクリプト

> reverse <- function(x){
+ if(!length(x)) return(NULL)
+ c(Recall(x[-1]),x[1])
+ }
> cat(reverse(LETTERS[1:26]))
Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
0512132人目の素数さん垢版2018/09/10(月) 18:22:05.74ID:gLTPxqtw
>>511
length は数値を返す関数なのに、なぜわざわざ論理演算をするんだ?
プログラムは、ここの議論を知らない人が読む可能性のほうが高いんだぞ。
0513132人目の素数さん垢版2018/09/10(月) 19:12:52.95ID:ZYY4OYkH
>>512
正規分布が一様分布より大きい期待値の算出に
mean(rnorm(100)>runif(100))
って書かない?
俺は
sum(ifelse(rnorm(100)>runif(100),1,0))/100
って書いたりしないけど。
0515132人目の素数さん垢版2018/09/10(月) 19:50:35.36ID:ZYY4OYkH
>>514
論理値を数値に置き換えて計算しているから
数値を論理値にしても別に違和感がない。
可読性は慣れの問題。
0517132人目の素数さん垢版2018/09/10(月) 21:30:23.37ID:gLTPxqtw
>>513
それとこれとは話が別だ。
logical は TRUE か FALSE の二値しかとらないから、それから数値への変換は自明。
多種の値をとる数値に論理演算をするのはいただけない。
0518132人目の素数さん垢版2018/09/10(月) 21:36:20.92ID:gLTPxqtw
>>515
is.empty.vector のような関数があるならそれでよいが、length を使っているのだから、それを勝手にベクトルが空かどうかの判断に使っているのはあなたであって、他人はそのようには考えない、といっているのだ。
自分だけしかこーどを見ないならべつに構わないが、こういうところに晒すのはよくない。
ましてや常套手段などと言って他人に教え込むのはやめてもらいたい。
0520132人目の素数さん垢版2018/09/10(月) 21:55:50.32ID:5QS5/GHY
whileの中は1でも2でもよくね?

n=0
while(1){
if(n>10) return(10)
n=n+1
}


n=0
while(2){
if(n>10) return(10)
n=n+1
}
0521132人目の素数さん垢版2018/09/10(月) 22:00:57.10ID:5QS5/GHY
>509は
配列を逆順に並べる再帰呼出しのコード。

Rにはrevという関数がある。

そのコードみてみ!

lengthを真偽判定に使ってますがな。


> base:::rev.default
function (x)
if (length(x)) x[length(x):1L] else x
0524132人目の素数さん垢版2018/09/11(火) 08:48:42.34ID:QUqp/jpE
!を引数が数値のときは0か否かを返す関数と理解すれば
if(!0) print(!1)の結果もサクッとわかる。
0525132人目の素数さん垢版2018/09/11(火) 09:08:32.20ID:QUqp/jpE
数値を非零かどうか論理値に変換して処理するかは
関数によるな。

if やwhileは変換処理しているけど
whichだとエラーになるな。

> which(!0)
[1] 1
> which(0)
Error in which(0) : argument to 'which' is not logical
> which(2)
Error in which(2) : argument to 'which' is not logical
> which(!3)
integer(0)
>
0526132人目の素数さん垢版2018/09/11(火) 09:12:56.04ID:QUqp/jpE
!ってベクトル対応しているな
> which(!(-1:1))
[1] 2
> !(-2:2)
[1] FALSE FALSE TRUE FALSE FALSE
0529132人目の素数さん垢版2018/09/15(土) 16:45:38.59ID:h0gUCZ3r
>>525
だいたい、if や while は関数じゃないし。
while (1) などと書くのはCに毒されているんじゃねーの?
Rなら while (TRUE) のほうが良いし、repeat というのもある。
0532132人目の素数さん垢版2018/09/15(土) 17:19:35.45ID:h0gUCZ3r
>>531
Rのライブラリ?の書き方なんてあてにならないよ。
そもそも、rev も 509 の reverse も演算の回数を必要最低限にするなら、条件は length(x)) >= 2 または > 1 だ。
まあ if (length(x)) のほうが速かったのかも知れないが、常にそうなるとは限らないのだから、早すぎる最適化は諸悪の根源だ。
0533132人目の素数さん垢版2018/09/15(土) 19:30:34.55ID:Vl7XZ52q
可読性の次は速度かよ。
自分の流儀と違う { の使い方でも文句いいそう。
0534132人目の素数さん垢版2018/09/15(土) 19:44:27.43ID:VibLIqgl
0,1を1000万個作って
!
!=
>
==
での真偽判定を各々10回する時間を出してみた。


> x=rbinom(1e7,1,0.5)
> system.time(replicate(10,!x))
user system elapsed
1.27 0.33 1.59
> system.time(replicate(10,x!=0))
user system elapsed
2.39 0.36 2.75
> system.time(replicate(10,x>0))
user system elapsed
2.58 0.31 2.92
> system.time(replicate(10,x==1))
user system elapsed
2.60 0.36 2.99
0535132人目の素数さん垢版2018/09/15(土) 19:57:45.72ID:VibLIqgl
!x と x!=0 で10回やったが、

> f <- function(){
+ x=rbinom(1e7,1,0.5)
+ (a=system.time(!x)[3])
+ (b=system.time(x!=0)[3])
+ a<b
+ }
> (re=replicate(10,f()))
elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed elapsed
TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
elapsed
TRUE

結果は再現された。
0536132人目の素数さん垢版2018/09/15(土) 20:06:37.73ID:VibLIqgl
lengthが絡むと

> x=1:1e8
> f1 = function(x) if(!length(x)) return(NULL) else x=x[-1]
> f2 = function(x) if(length(x)==0) return(NULL) else x=x[-1]
> system.time(f1(x))
user system elapsed
2.38 0.53 2.93
> system.time(f2(x))
user system elapsed
2.05 0.61 2.69

御指摘の通り、!の負け
0537132人目の素数さん垢版2018/10/04(木) 17:02:48.04ID:247Ted9r
>>444
>遅レスだが、Ubuntu 18.04LTSならデフォルトのIBus-mozcで日本語入力ができるそうだ。
>詳しくはUbuntu Weekly Recipeの第527回を読んでくだされ

Ubuntu 18.04.1 LTSにアップグレードしたけどできない
いままでスクレイピングにつかってrvestのログインコマンドもエラー出るようになったし最悪だ。。。。
0538132人目の素数さん垢版2018/10/04(木) 20:04:49.68ID:W6fWyA5T
アップグレードってことは文字入力がFcitxのままになってない?Fcitxならパッチ要だよ。
Voyager 18.04LTS(xubuntu 18.04LTS)ではパッチなしでRStudioに日本語入力できた。
0539132人目の素数さん垢版2018/10/26(金) 12:58:59.43ID:8LsI2NoU
昨日、PCを新しくして最新のR入れたんだけど、
作業ディレクトリの固定化できなくね?
前まではショートカットのプロパティで作業フォルダ指定してたんだけど、
新しいR、何度やっても作業ディレクトリがデフォルトのドキュメントに戻りやがる

どうすればいいか、誰がご教示を。
0540132人目の素数さん垢版2018/10/26(金) 13:04:50.23ID:I9GOHEF6
>>539
プロパティでコマンドラインオプションを消せばよい。
--cd-ほにゃらら
というのが付いてるでしょ。
0542132人目の素数さん垢版2018/10/26(金) 23:05:34.11ID:5yNEfvRx
xtsの取り扱い方について質問失礼します。
以下のコードで、dataには2018/10/20 00:00〜2018/10/25 00:00の1時間刻みのaとbの値のxts型オブジェクトが入りますが、(aとbは時系列データのイメージです)
このdataの毎日09:00の値を添え字を使って取り出す方法はありますか?
(data["2018-10-21 00:00"]とすると10/21の00:00が取り出せるような感じで)

library(xts)
time <- seq(as.POSIXct("2018-10-20 00:00"), as.POSIXct("2018-10-25 00:00"), by="1 hour")
a <- rnorm(length(time))
b <- rnorm(length(time))
data <- xts(x = cbind(a,b), order.by = time)

思いついたのはfor文を使って以下のようにするのかなと思ったのですがもう少しいい方法があるだろうなと思いまして…

data_result <- data[10] # まずxts型の入れ物を作る(2018/10/20 09:00)
for (i in 1:4) {
data_result <- rbind(temp,data[10+24*i]) # 2日目以降はこれにくっつける
}
data_result
0543132人目の素数さん垢版2018/10/26(金) 23:12:48.52ID:Xg1/ChR5
失礼、>>542の下のコードはこっちです

data_result <- data[10] # まずxts型の入れ物を作る(2018/10/20 09:00)
for (i in 1:4) {
data_result <- rbind(data_result, ,data[10+24*i]) # 2日目以降はこれにくっつける
}
data_result
0546132人目の素数さん垢版2018/11/01(木) 22:44:27.08ID:xCdOvDq8
巨大数を扱えるというふれこみのRmpfrって正確じゃないな。
50の階乗を計算させてみた

R with Rmpfr
> mpfr(factorial(50),1e5)
1 'mpfr' number of precision 100000 bits
30414093201713018969967457666435945132957882063457991132016803840

Haskell:
Prelude> product[1..50]
30414093201713378043612608166064768844377641568960512000000000000

Python:
import math
print(math.factorial(50))
30414093201713378043612608166064768844377641568960512000000000000

Wolfram:
https://www.wolframalpha.com/input/?i=50!
30414093201713378043612608166064768844377641568960512000000000000
0548132人目の素数さん垢版2018/11/03(土) 09:32:49.16ID:NiwdVATo
R3.5.xから、Windows環境だと日本語パスまわりでエラーがでてどうにもならない
enc2native()しても駄目だし
とりあえずcairo_png()だけでも…
0549132人目の素数さん垢版2018/11/03(土) 10:31:12.42ID:pqZePX+I
一度つかって日本語周りの処理でエラー出てきたんで未だに3.4.4浸かってる
0550132人目の素数さん垢版2018/11/04(日) 21:55:16.95ID:lTCeMsqQ
統計の質問はこのスレでいいんだろうか?

ある医院に1時間あたり平均5人の患者が来院し、その人数の分布はポアソン分布にしたがうとする。
1時間あたりの平均診療人数は6人で、一人あたりの診療時間は指数分布に従うとする。
診察までの平均の待ち時間は何時間か?

このシミュレーション解はこれであってる?

N=1e6
λ=5
μ=6
sum(rpois(N,λ)*rexp(N,μ))/N

> sum(rpois(N,λ)*rexp(N,μ))/N
[1] 0.8331036

60かけて、分にすると
[1] 49.86565
0551132人目の素数さん垢版2018/11/08(木) 12:35:54.73ID:wKTjJ6Fa
>>306
grep 使って書いてみた。
# mhs(c(1,0,1,1,0,1,1,1)) : return 3
mhs = function(x){ # maximum head sequence
y=paste(x,collapse='')
str="1"
if(!grepl(str,y)) return(0)
else{
while(grepl(str,y)){
str=paste0(str,"1")
}
return(nchar(str)-1)
}
}

system.time(mean(replicate(1e4,mhs(sample(0:1,100,rep=T))>=5)))


# N(=100)回コインをn(=5回)以上続けて表がでるか?TRUE or FALSE
seqn<-function(n=5,N=100,p=0.5){
rn=rbinom(N,1,p)
count=0
for(i in 1:N){
if(rn[i] & count<n){
count=count+1
}
else{
if(count==n) {return(TRUE)}
else{
count=0
}
}
}
return(count==n)
}

system.time(mean(replicate(1e4,seqn())))


結果は、
> system.time(mean(replicate(1e4,mhs(sample(0:1,100,rep=T))>=5)))
user system elapsed
4.56 0.01 4.61
> system.time(mean(replicate(1e4,seqn())))
user system elapsed
1.05 0.00 1.07

逆に4倍時間がかかるようになった
0553132人目の素数さん垢版2018/11/08(木) 15:13:38.19ID:UNhl34kg
coinの表裏を1と0で表して、その累積和を取ったベクトルを用意して
そのベクトルの5個前とのdiffの要素の中に5が一回でも現れることが、一回でも5回連続で表が出たことがあることの必要十分条件
grepはどうしても時間がかかるしif文もできれば使いたくない

searchseq <- function(n=5,N=100,p=0.5,trial=10000){
result <- 0 # 表が5回以上出た回数を数える入れ物
for (i in 1:trial){
coin <- rbinom(N,1,p)
coincumsum <- cumsum(coin)
coindiff <- diff(coincumsum,5)
#diff(coincumsum,5)の要素に一個でも5があれば表が5回以上出たことがあったということ
#anyでT/Fにして、sumで0/1にする
result <- result+sum(any(coindiff==5))
}
return(result/trial)
}

結果もよさそう
> searchseq()
[1] 0.80793

> system.time(mean(replicate(10000,mhs(sample(0:1,100,rep=T))>=5)))
ユーザ システム 経過
0.92 0.00 0.93
> system.time(mean(replicate(10000,seqn())))
ユーザ システム 経過
0.29 0.00 0.30
> system.time(searchseq())
ユーザ システム 経過
0.21 0.00 0.20
0555132人目の素数さん垢版2018/11/08(木) 23:32:48.68ID:/ZlhhGjJ
>>553
レスありがとうございました。

rleとも比べてみました。

> system.time(mean(replicate(1e4,seqn())))
user system elapsed
4.290 0.000 4.377
>system.time(mean(replicate(1e4,max(rle(rbinom(100,1,0.5))$len)>=5)))
user system elapsed
3.620 0.000 3.742
> system.time(mean(replicate(1e4,mhs(rbinom(100,1,0.5)>=5))))
user system elapsed
2.390 0.000 2.435
> system.time(searchseq())
user system elapsed
1.880 0.000 1.988
0556132人目の素数さん垢版2018/11/08(木) 23:35:10.38ID:/ZlhhGjJ
>>555
greplの逆転はsampleをrbinomに変えたためでしょう。

> system.time(replicate(1e5,sample(0:1,100,rep=T)))
user system elapsed
7.200 0.180 7.591
> system.time(replicate(1e5,rbinom(100,1,0.5)))
user system elapsed
5.980 0.230 6.319
0559132人目の素数さん垢版2018/11/09(金) 02:01:36.95ID:Qla0VxTD
>>558
ご指摘ありがとうございました。
修正しました。
rle1 <- function(N=100,n=5,p=0.5){
r=rle(rbinom(N,1,p))
max(r$len[which(r$val==1)])
}
結果
> system.time(mean(replicate(1e4,max(rle1()>=5))))
user system elapsed
4.430 0.000 4.546
> system.time(mean(replicate(1e4,seqn())))
user system elapsed
4.490 0.010 4.609
> system.time(mean(replicate(1e4,mhs(rbinom(100,1,0.5))>=5)))
user system elapsed
7.440 0.000 7.656
> system.time(searchseq())
user system elapsed
1.950 0.000 2.066
>
0560132人目の素数さん垢版2018/11/09(金) 07:25:00.97ID:Qla0VxTD
無理矢理1行にして実行

system.time(mean(replicate(1e4,any(diff(cumsum(rbinom(100,1,0.5)),5)==5))))
user system elapsed
1.820 0.000 1.886
>
> system.time(mean(replicate(1e4,with(rle(rbinom(100,1,0.5)), max(lengths[wh
<e(1e4,with(rle(rbinom(100,1,0.5)), max(lengths[whi ch(values==1)])>=5))))
user system elapsed
4.370 0.010 4.478
0561132人目の素数さん垢版2018/11/09(金) 07:59:47.47ID:rijPDFSR
>>560
意味もなくforループ回してた上に毎回sum使って真偽値を数値に変換してたけど
replicate使って最後に一回だけmean取ると2.066→1.886で1割短くなるのね
他人のコード読むのは勉強になる
0563132人目の素数さん垢版2018/11/09(金) 09:44:07.41ID:5AnUTlVm
>>559
全部が0のとき、エラーになるので修正

rle01 <- function(x){ # c(0,1,1,1,0,0) => return 3
if(sum(x)==0) return(0) #c(0,0,0,0,0,0) => return 0
else{
r=rle(x) # Run Length Encoding
max(r$lengths[which(r$values==1)]) # max length of value 1
}
}

動作確認

> rle01(x<-rbinom(100,1,0.5)) ; x
[1] 8
[1] 1 1 0 1 0 1 0 0 0 1 1 1 0 1 0 0 0 0 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 0 0
[36] 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 0 0
[71] 1 1 1 1 1 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 1 0 0 1 1 1 0 1 1
> rle01(x<-rbinom(100,1,0)) ; x
[1] 0
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[36] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
[71] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0564132人目の素数さん垢版2018/11/09(金) 10:10:01.39ID:Ui6BpICy
>>563
センスないなあ。
rle01 <- function(x) {
r <- rle(x)
one <- r$values == 1
if (any(one)) max(r$length[one]) else 0
}
0565132人目の素数さん垢版2018/11/09(金) 10:40:31.84ID:5AnUTlVm
>>564
whichは余分でした。

sumの方がrleより高速だと思ったらから、すべて0の場合はrleを呼ばないことにしただけ。
0連続でやるとこれだけ差がつく。

rle01 <- function(x){ # c(0,1,1,1,0,0) => return 3
if(sum(x)==0) return(0) #c(0,0,0,0,0,0) => return 0
else{
r=rle(x) # Run Length Encoding
max(r$lengths[which(r$values==1])] # max length of value 1
}
}
rle012 <- function(x) {
r <- rle(x)
one <- r$values == 1
if (any(one)) max(r$length[one]) else 0
}

> x=rep(0,1e8)
> system.time(rle01(x))
user system elapsed
0.3 0.0 0.3
> system.time(rle012(x))
user system elapsed
7.36 4.52 13.25
>
0566132人目の素数さん垢版2018/11/09(金) 10:52:23.39ID:Ui6BpICy
>>565
そんな特別な場合のことに対して高速化するのは愚の骨頂。
1が一つでもある場合にsumを呼ぶのは余計じゃないのか?
余計なwhichがあるくらいだから、まずは素直にやりたいこと、やるべきことを正しく書くようにしたら?
0567132人目の素数さん垢版2018/11/09(金) 11:01:40.74ID:5AnUTlVm
1000本に1本あたる宝クジを100本買って続けて2本あたる確率のシミュレーション解の算出時間比較。
確率の理論値は9.8897353347449091e-05

> system.time(mean(replicate(1e4,rle01(rbinom(N,1,p))>=n)))
user system elapsed
0.61 0.00 0.64

> system.time(mean(replicate(1e4,rle12(rbinom(N,1,p))>=n)))
user system elapsed
1.97 0.00 2.03
0569132人目の素数さん垢版2018/11/09(金) 19:43:44.34ID:0M0agNOf
JPXのデータ、ファイル形式csvを読み込もうとするとうまく行かないんですが
どんな引数をつければいいですか
0571132人目の素数さん垢版2018/11/10(土) 11:20:41.80ID:QJ6NJqU7
コインを100回ふったときの表連続の最大数が5であったときの
このコインの表がでる確率の期待値、モード比、信頼区間を求めるのが次のネタ。

unirootで算出できたけど
シミュレーションはどうすればいいのかアイデアが浮かばない。
MCMCで解決できるかなぁ?

これをシミュレーションで検証したい。

$Rscript main.r
lower mean mode upper
0.2487456 0.4469764 0.4589692 0.6386493

http://tpcg.io/asKRE9
0572132人目の素数さん垢版2018/11/11(日) 20:11:21.81ID:ODPKEEGK
1億回のコイントスで何回連続して表がでる確率が高いかRでやってみた。

# maximal sequential head probability at 10^8 coin flip
> y
[1] 2.2204460492503131e-16 2.2204460492503131e-16
[3] 8.8817841970012523e-16 1.5543122344752192e-15
[5] 3.5527136788005009e-15 6.8833827526759706e-15
[7] 1.4210854715202004e-14 2.8199664825478976e-14
[9] 5.6843418860808015e-14 1.1346479311669100e-13
[11] 2.2737367544323206e-13 4.5452530628153909e-13
[13] 9.0949470177292824e-13 1.8187673589409314e-12
[15] 3.6379788070917130e-12 7.2757355695785009e-12
[17] 1.4551915228366852e-11 2.9103608412128779e-11
[19] 5.8207660913467407e-11 1.1641509978232989e-10
[21] 6.6493359939245877e-06 2.5720460687386204e-03
[23] 4.8202266324911647e-02 1.7456547460031679e-01
[25] 2.4936031630254019e-01 2.1428293501123058e-01
[27] 1.4106434838399229e-01 8.1018980443629832e-02
[29] 4.3428433624081136e-02 2.2484450838189007e-02

25回が続くのが4回に1回あることになる。
pythonで25回以上と25回ちょうどになるのを計算させてみた。

その結果、
Over 25
6977459029519597/9007199254740992
= 0.7746535667951356
Just 25
2246038053550679/9007199254740992
= 0.24936031612362342

高速化を狙ってCに移植したら
100万回で暴走。
https://egg.5ch.net/test/read.cgi/hosp/1540905566/132
0573132人目の素数さん垢版2018/11/12(月) 21:04:57.19ID:boi8bvdM
"マラソン大会の選手に1から順番に番号の書かれたゼッケンをつける。
用意されたゼッケンN(=100)枚以下の参加であった。
無作為に抽出したM(=5)人のゼッケン番号の最大値はMmax(=60)であった。
参加人数推定値の期待値とその95%信頼区間を求めよ"

decken <- function(M, Mmax, N, conf.level=0.95){
if(Mmax < M) return(0)
n=Mmax:N
pmf=choose(Mmax-1,M-1)/choose(n,M)
pdf=pmf/sum (pmf)
mean=sum(n*pdf)
upr=n[which(cumsum(pdf)>conf.level)[1]]
lwr=Mmax
c(lower=lwr,mean=mean,upper=upr)
}
decken(M=5,Mmax=60,N=100)

> decken(M=5,Mmax=60,N=100)
lower mean upper
60.0000 71.4885 93.0000

これをシミュレーションで確認したい。

# simulation
M=5 ; Mmax=60 ; N=100
sub <- function(M,Mmax,N){
n=sample(Mmax:N,1) # n : 参加人数n
m.max=max(sample(n,M)) # m.max : n人からM人選んだ最大番号
if(m.max==Mmax) return(n)
}
sim <- function(){
n=sub(M,Mmax,N)
while(is.null(n)){
n=sub(M,Mmax,N) # 最大番号が一致するまで繰り返す
}
return(n)
}
runner=replicate(1e4,sim())
summary(runner) ; hist(runner,freq=F,col="lightblue")
quantile(runner,prob=c(0,0.95))
cat(names(table(runner)[which.max(table(runner))]))

> summary(runner) ; hist(runner,freq=F,col="lightblue")
Min. 1st Qu. Median Mean 3rd Qu. Max.
60.00 63.00 68.00 71.43 77.00 100.00
> quantile(runner,prob=c(0,0.95))
0% 95%
60 93
> cat(names(table(runner)[which.max(table(runner))])) # 最頻値
60

結果は確認できたけど、もっと高速なシミュレーションアルゴリズムはあるだろうか?
0574132人目の素数さん垢版2018/11/16(金) 13:44:59.80ID:U19cHKqd
重複があるか否かを返す、anyDuplicatedという関数を知ったので総当たり比較と早いかどうか比べてみた。
覆面算を □/□ * □/□ = □□/□を解くの使ってみた。
a/b * c/d == ef/g (c>a)として

F = function(fun){
n=1:9
ans=NULL
for(a in n){
for(b in n){
for(c in a:9){
for(d in n){
for(e in n){
for(f in n){
for(g in n){
if(fun(a,b,c,d,e,f,g)){
ans=rbind(ans,c(a,b,c,d,e,f,g))}}}}}}}}

return(ans)
}
で虱潰しに判定

F1=function(a,b,c,d,e,f,g){ #全部の組み合わせが等しくないのを確認
(a/b)*(c/d)==(10*e+f)/g &
a!=b & a!=c & a!=d & a!=e & a!=f & a!=g &
b!=c & b!=d & b!=e & b!=f & b!=g & c!=d &
c!=e & c!=f & c!=g & d!=e & d!=f & d!=g & e!=f & e!=g & f!=g
}

F2=function(a,b,c,d,e,f,g){ # anyDuplicatedで重複なしを判定
(a/b)*(c/d)==(10*e+f)/g & !anyDuplicated(c(a,b,c,d,e,f,g))
}

> system.time(F(F1))
user system elapsed
52.56 0.25 53.38
> system.time(F(F2))
user system elapsed
113.78 0.11 115.81

anyDuplicatedでコードは短くなるが速さが犠牲になった。
0576132人目の素数さん垢版2018/11/18(日) 12:56:58.01ID:tDkQkz0a
初歩的な質問で恐縮ですが、
truehistで出したヒストグラムの情報をテキストファイルとして保存する方法、教えて頂けませんか?
0578132人目の素数さん垢版2018/11/18(日) 17:12:37.03ID:HQweHJGH
>>576
MASS::truehist
でソースを覗いたら最後はinvisible()になっていた。
ここを
return(list(breaks=breaks,h=h,nbins=nbins,xlab=xlab))
にしたら

$`breaks`
[1] -0.001 0.999 1.999 2.999 3.999 4.999 5.999 6.999 7.999 8.999 9.999 10.999 11.999
[14] 12.999 13.999

$h
[1] 1

$nbins
[1] 17

$xlab
[1] "x"
で出力されるけど、
どのパラメータがあればヒストグラムが再現できるのかは不勉強にてわからない。
0580132人目の素数さん垢版2018/11/18(日) 20:37:19.22ID:HQweHJGH
>>579
レスありがとうございます。
すると
truehist のソースの最後の
invisible()

return(list(breaks=breaks,est=est))
として、breakの中点を横軸、estを縦軸にするとヒストグラムが再現できるわけですね。
0581132人目の素数さん垢版2018/11/18(日) 20:40:50.06ID:HQweHJGH
invisible() → return(list(breaks=breaks,est=est))
に改造したソースをtruehist0として

midpoint <- function(x){ # c(1,2,3,4) -> c(1.5,2.5,3.5)
n=length(x)
mpt=numeric(n-1)
for(i in 1:(n-1)){
mpt[i]=mean(x[i],x[i+1])
}
return(mpt)
}
x=rnorm(10000)
(data=truehist0(x))
with(data, plot(midpoint(breaks),est,type='h',lwd=5,col='cyan'))

で元のヒストグラムが再現できた。
0582132人目の素数さん垢版2018/11/18(日) 20:52:08.49ID:HQweHJGH
graphics:::hist.default

でhistのソースを表示させてみた。

r <- structure(list(breaks = breaks, counts = counts, density = dens,
mids = mids, xname = xname, equidist = equidist), class = "histogram")
if (plot) {
plot(r, freq = freq1, col = col, border = border, angle = angle,
density = density, main = main, xlim = xlim, ylim = ylim,
xlab = xlab, ylab = ylab, axes = axes, labels = labels,
...)
invisible(r)
}

histでのcountsが
truehistではestと呼ばれているようだ。

estimateの略かな?
0583132人目の素数さん垢版2018/11/20(火) 18:37:20.95ID:kwMT/Yc9
どいつもこいつもナイル川で説明しやがって
データの操作が一番むずいんだよ!
0584132人目の素数さん垢版2018/11/21(水) 12:43:45.15ID:4Qrr7yQM
あるデータ群に対して、確率密度関数のパラメータをフィッティングさせる方法ってないですか?
ちなみに、フィッティングさせたいのはレブィフライト確率密度関数です。
0587132人目の素数さん垢版2018/11/21(水) 21:59:06.34ID:kb0MtFao
>>584-585

とりあえず、最小二乗法でやってみた。

ガンマ分布の乱数を近似してみた。

dlevy <- function (x,m,c) sqrt(c/2/pi)*exp(-c/2/(x-m))/(x-m)^3/2
set.seed(123)
dat=rgamma(1e3,1) ; hist(dat,freq=F)
x=density(dat)$x ; y=density(dat)$y
lines(x,y)
f<-function(mc){
m=mc[1];c=mc[2]
sum((y-dlevy(x,m,c))^2)
}
(mc=optim(c(0,1),f, method='N')$par)
curve(dlevy(x,mc[1],mc[2]),add=T,col=2)
0589132人目の素数さん垢版2018/11/22(木) 19:54:16.79ID:bptUComJ
ソースが長かったので

sink('print.out')
print(MASS::fitdistr)
sink()

でprint.outに出力してみた。

これもoptimを使っているようだが、最小二乗法なのかどうなのかわからなかった。
0591132人目の素数さん垢版2018/11/23(金) 18:16:00.74ID:rwOyVQ2V
>>590
レスありがとうございます。

λ=5
μ=6
N=1e6
sum(rpois(N,λ)*rexp(N,μ))/N

> sum(rpois(N,λ)*rexp(N,μ))/N
[1] 0.833631

ρ=λ/μ
ρ/(1-ρ)
ρ/(1-ρ)*1/μ
> ρ/(1-ρ)*1/μ
[1] 0.8333333

なのでいいのだろうとは思っていたのですが、時系列のシミュレーションは自信がありませんでした。
0592132人目の素数さん垢版2018/11/23(金) 21:47:20.33ID:rwOyVQ2V
>>591
>550の設定で12分毎に患者が来院したら、待ち時間は全員0だと思うのだが

ρ/(1-ρ) の公式って正しいんだろうかな?
0594132人目の素数さん垢版2018/11/27(火) 11:01:28.21ID:V3tvhpxu
>>592
自己レス
公式は定常状態に達したときという前提での計算なんだな。

MMS = function(n, lamda=5,mu=6,s=1){
rho=lamda/mu
sig=0
for(i in 0:s) sig=sig+rho^i/factorial(i)
p0=1/( sig + rho^(s+1)/factorial(s)/(s-rho) )
ifelse(n >= s, rho^n/factorial(s)/s^(n-s)*p0, rho^n/factorial(n)*p0)
}

E=0
for(i in 0:1000) E=E+i*MMS(i)

> E
[1] 5
0596132人目の素数さん垢版2018/11/27(火) 16:44:04.82ID:V3tvhpxu
>>595
こういう類の待ち時間の話。

ある医院では、患者が平均10分間隔でポアソン分布にしたがって訪ねてくることがわかった。
医者は1人であり、1人の患者の診療にかかる時間は平均8分の指数分布であった。
「平均待ち時間」を5分以下にするには同じ診察効率の医師が何人に必要か?
その最小人数で「平均待ち時間」を5分以下に保って診療するには1時間に何人まで受付可能か?


公式に当て嵌めれば解けるのだけど
どうやってシミュレーションすればいいのか思い浮かばない。
コイントスやサイコロだとシミュレーションは容易なんだが。
0597132人目の素数さん垢版2018/11/28(水) 14:59:50.66ID:r8zTzMor
# シミュレーションしたみたが、結果が合致しない(特定のseedでは合致したけど)

# ある医院に1時間あたり平均5人の患者が来院し、その人数の分布はポアソン分布にしたがうとする。
# 1時間あたりの平均診療人数は6人で、一人あたりの診療時間は指数分布に従うとする。
# 診察までの平均の待ち時間は何時間か?

MM1sim <- function(n=40,lambda=5/60,mu=6/60,seed=FALSE,Print=TRUE){
# service starc clock time(ssct) since 9:00
ssct=numeric(n)
# waiting time(w8)
w8=numeric(n)
# service end clock time(sect)
sect=numeric(n)
# arrival clock time(act)
if(seed) set.seed(1234) ;
act=round(cumsum(rexp(n,lambda)))
# duration of service(ds)
if(seed) set.seed(5678) ;
ds=round(rexp(n,mu))

# simulation assuming service starts at 9:00
head(act) # act : arrival clock time
head(ds) # ds : duration of service
# initial values
ssct[1]=act[1] # 9:15 service start clock time for 1st guest
sect[1]=act[1]+ds[1] # 9:25 sevice end clock time for 1st guest
w8[1]=0


for(i in 2:n){
w8[i]=max(sect[i-1]-act[i],0)
ssct[i]=max(sect[i-1],act[i])
sect[i]=ssct[i]+ds[i]
}
if(Print){
print(summary(w8))
hist(w8,freq=FALSE,col="lightblue",main="")
}
invisible(w8)
}

w8m=replicate(1e3,mean(MM1sim(P=F)))
summary(w8m)
0598132人目の素数さん垢版2018/11/28(水) 15:00:27.16ID:r8zTzMor
途中の計算サンプル

# simulation step by step
#
# act[2] # 9:16 arrival clock time of 2nd
# max(sect[1]-act[2],0) # 9:25-9:16 vs 0 = ?sevice for 1st ends b4 2nd arrival
# w8[2]=max(sect[1]-act[2],0) # 9 min : w8ing time of 2nd
# ssct[2]=max(sect[1],act[2]) # 9:25 vs 9:16 = service start clock time for 2nd
# sect[2]=ssct[2]+ds[2] # 9:25 + 8 = 9:33 service end clock time for 2nd
#
# act[3] # 9:17 arrival clock time of 3rd
# max(sect[2]-act[3],0) # 9:33 - 9:17 vs 0 = ?serivce for 2nd ends b4 3rd arrival?
# w8[3]=max(sect[2]-act[3],0) # 16 min : w8ting time of 3rd
# ssct[3]=max(sect[2],act[3]) # 9:33 vs 9:17 = service start clock time for 3rd
# sect[3]=ssct[3]+ds[3] # 9:33 + 11 = 9:44 service end clock time for 3rd
#
0599132人目の素数さん垢版2018/11/28(水) 19:28:45.39ID:r8zTzMor
>>597
患者来院数40人程度では定常状態に達しないということみたいだな。

10万人での待ち時間の分布(理論値50に近い)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 5.532 28.619 47.540 67.370 528.511

100人での待ち時間の分布 (シミュレーションの度にばらつく)
Min. 1st Qu. Median Mean 3rd Qu. Max.
0.000 6.958 16.564 22.200 31.652 109.204

40人来院を1万回繰り返した平均の分布
Min. 1st Qu. Median Mean 3rd Qu. Max.
1.304 11.764 19.357 25.449 32.536 177.913

ここに上げておきました。
http://tpcg.io/7psmrQ

結局のところ、待ち時間行列の理論を個人医院に適応しても
定常状態(待ち行列の長さが一定)に達していないと実用性がなさそうだな。

シミュレーションはなんとなく機能していた感じ。

ここに上げておきました。
https://www.tutorialspoint.com/tpcg.php?p=7psmrQ
http://tpcg.io/7psmrQ
0600132人目の素数さん垢版2018/11/29(木) 18:50:23.24ID:GEvMs+K3
来院患者数と待ち時間シミュレーションの結果をグラフにしてみた。
個人医院で待ち行列の長さが一定になるほどの受診があるとは考えがたいからこっちの方が現実に即しているんじゃなかろうか
と思うが、解析解はどんなふうになるのか想像もつかん。

https://i.imgur.com/tCOoxF7.png
0601132人目の素数さん垢版2018/12/01(土) 18:03:07.99ID:gm1XmpT3
初歩的な質問ですいません
truehistで軸を対数軸にして表示する方法って分かりますか?
0604132人目の素数さん垢版2018/12/02(日) 08:28:26.92ID:gEGEypwn
histで縦軸を対数表示させるならこんな感じかな。

with(hist(c(rnorm(1e6),rnorm(1e5,5,0.5))),plot(mids,log10(counts),type='h',col=4,lwd=10))

truehistだとソース改造すればいい。
0606132人目の素数さん垢版2018/12/02(日) 13:24:03.04ID:8De20Fh0
histグラムぽく対数表示

dat=hist(c(rnorm(1e6),rnorm(1e5,5,0.5)))
attach(dat)
plot(breaks[-1],counts,type='s',log='y',ylim=range(counts))
segments(x0=breaks[-1],y=min(counts),y1=counts)
segments(x0=breaks[1],y=min(counts),y1=counts[1])
0607132人目の素数さん垢版2018/12/04(火) 00:31:54.32ID:4UCEIb49
すみませんがアドバイスお願いします。
heatmap.2でDendrogramつきヒートマップを描きたいのですが、カラムの並びを任意に変えたいです。
Dendrogramの細かい並びは変えないように、大きなクラスタの並びを変えたいです。
例えば、(1,2,3)(4,5,6)(7,8,9)とあるのを
(4,5,6)(7,8,9)(1,2,3)とならび変えるのが目的です。
このとき、4,5,6と7,8,9は近いクラスタを形成します。なので、樹形図は崩れないように書き換えられると思っています。

https://www.biostars.org/p/237067/
上記サイトをみると、as.dendrogramのアウトプットをreorderで並び替えてColvに入れるようですが、
うまくいきませんでした。並びは全く変わっていません。
どなたか教えていただけますか。情報に漏れがありましたらご指摘ください。

環境は以下の通りです。
R 3.4.0
Rstudio 1.0.143
Win10になります。
0608132人目の素数さん垢版2018/12/04(火) 10:04:43.34ID:QKKYvADK
頓珍漢な答かもしれない。
並べ替えだけなら
x=rbind(c(1,2,3),c(4,5,6),c(7,8,9))
x[c(2,3,1),]
0610132人目の素数さん垢版2018/12/04(火) 18:58:07.88ID:7f8uMrnq
初歩的な話なんだが、一様分布の分散は無限大かと思っていたら区間[a,b]で(a-b)^2/12とのこと。
Wolframで計算したら確かにそうなった。
https://www.wolframalpha.com/input/?i=integral(x-(a%2Bb)%2F2)%5E2%2F(b-a),from+a+to+b

バスの到着時間が平均10分の指数分布に従うときにランダムにバス停に行ったときの平均待ち時間は10分。

バスの到着時間が平均10分の一様分布に従うときにランダムにバス停に行ったときの平均待ち時間は6分40秒。

バスがきちんと10分毎に到着するときはランダムにバス停に行ったときの平均待ち時間は5分。

乱数発生させて公式でのシミュレーション
> d2w8 <- function(x){# w8=E[X2]/2E[X]=(V[X]+E[X]^2)/2E[X]
+ c(mean=mean(x),var=var(x),w8=mean(x^2)/mean(x)/2)
+ }
> N=1e6
> d2w8(rexp(N,1/10)) # exp average:10
mean var w8
10.02477 100.67652 10.03377
> d2w8(runif(N,0,20)) # unif average:10
mean var w8
9.997470 33.325065 6.665408
> d2w8(rep(10,N)) # regular interval 10
mean var w8
10 0 5
0611132人目の素数さん垢版2018/12/06(木) 14:39:28.97ID:P/rPOK1I
NULLのときってどうしてこういう仕様なんだろ?
プログラムしていたら、これに気づかないのがバグの原因だったw

> any(NULL)
[1] FALSE
> all(NULL)
[1] TRUE
0612132人目の素数さん垢版2018/12/06(木) 20:13:51.63ID:P/rPOK1I
= と <-で微妙に動作が違うな。

> switch (3,
+ x =1,
+ x =2,
+ x =3
+ )
[1] 3

> switch (2,
+ x <- 1,
+ x <- 2,
+ x <- 3
+ )
0614132人目の素数さん垢版2018/12/06(木) 22:22:18.13ID:P/rPOK1I
どちらが見やすいかという問題かな。
> rm(x)
> x=switch(1,x =1)
> x
[1] 1
> switch(1,x<-1)
> x
[1] 1
0615132人目の素数さん垢版2018/12/06(木) 23:13:35.91ID:EMJ7DN40
>>614
その二つは異なるアルゴリズムでたまたま結果が同じになっているだけ
=と<-の違いはRやるなら理解しておいたほうが良い
0617132人目の素数さん垢版2018/12/07(金) 08:01:49.32ID:H6LI4wTx
0^x =0
x^0=1
0^0=1とした方が辻褄が合うことが多いけど
Rのこの仕様には何のメリットがあるんだろ?
> any(NULL)
[1] FALSE
> all(NULL)
[1] TRUE
>
0619132人目の素数さん垢版2018/12/23(日) 11:38:19.16ID:CnP6hLfL
>>120
平成29年の簡易生命表から
f=c(179,28,19,13,9,7,6,5,5,4,4,4,5,7,9,10,11,12,14,16,18,19,19,20,21,22,23,24,25,27,28,30,
31,34,37,39,41,43,46,51,57,63,70,77,83,91,99,109,119,130,142,155,167,178,190,202,216,
233,249,265,282,302,326,354,387,420,457,502,549,598,648,700,761,836,927,1026,1142,1284,
1455,1651,1862,2089,2341,2625,2934,3264,3598,3923,4233,4508,4740,4893,4973,5007,4999,
4729,4314,3797,3222,2634,2071,1566,1135,788,523,761)
m=c(191,31,21,13,10,8,8,8,7,7,7,8,9,11,14,17,21,26,32,37,42,46,49,50,50,50,49,49,50,52,55,
58,60,63,65,67,71,76,82,89,97,104,112,122,134,148,165,183,203,224,246,268,294,324,357,
391,425,461,502,549,601,659,722,792,872,958,1052,1147,1239,1331,1433,1546,1663,1783,
1905,2026,2167,2333,2532,2750,2973,3195,3414,3630,3827,4000,4133,4200,4194,4104,3916,
3681,3388,3046,2669,2272,1875,1494,1145,841,589,392,246,144,79,71)

LE <-function(ndx,Y,N0=10^5){ # life expectancy
n=length(ndx)
lx=numeric(n)
lx[1]=N0
for(i in 1:(n-1))
lx[i+1] <- lx[i] - ndx[i]
nqx=ndx/lx
nLx=numeric(n)
for(i in 1:n)
nLx[i] <- mean(c(lx[i],lx[i+1]))
nLx[n]=0
Tx=rev(cumsum(rev(nLx)))
le=Tx/lx
return(round(le[Y+1],1))
}

LE(m,65)
LE(m,61)
0620132人目の素数さん垢版2018/12/28(金) 00:54:31.27ID:fO3GkB5Y
pushってありますか?
例えばベクトルに値を追加すると
先頭が消えて後尾に新しい値をついかして要素数を一定に保つような

一定要素数以下の平均を求めたいのでそういうのが簡単に実現できる方法あればなおよいです
0621132人目の素数さん垢版2018/12/28(金) 01:17:50.69ID:fO3GkB5Y
ベクトルをrev()して先頭を[1:50]とかでとりだしてman()すればいいとわかりました
ほかにもっと簡単な方法アレばお湿気てください
0626132人目の素数さん垢版2019/01/07(月) 02:16:23.34ID:OfD+CJ7t
時系列データをplot()したときに縦線をabline()でいれたいのだがどうすればいいかよくわからないです

具体的には
timeStr <- "2018-01-07 01:00"
dateTime <- strptime(timeStr, format="%Y-%m-%d %H:%M") #"POSIXlt" クラスオブジェクトに変換
として時間データに変換したものをx軸としてプロットしたものです
たとえば
plot(x=dateTime, y=1)
abline(v=?????)
として縦線を追加したいのですが
0627132人目の素数さん垢版2019/01/07(月) 02:50:32.42ID:OfD+CJ7t
v=as.POSIXct("2019-01-06 01:00")
みたいな感じにすれば解決しました
0628132人目の素数さん垢版2019/01/07(月) 18:42:57.56ID:oKAYsRfx
>>278
かなり遅れすだけど
formals(cor)
0629132人目の素数さん垢版2019/01/07(月) 19:36:20.34ID:oKAYsRfx
>>611
>>617
俺の予想
判定するときにNULLは強制的に論理値に変換される
変換されると logical(0) になる
logical(0) は空のベクトル
からのベクトルが渡されて中身をチェックしていく
アルゴリズムとして早く処理するためには
any()はTRUE探しにいって、一個でもTRUEがみつかればその時点でTRUEをかえす
all()はFALSEを探しに行って、一個でもFALSEがみつかればその時点でFALSEをかえす
もちろん最後までみない

空のベクトルが渡されたのでTRUEもFALSEもみつからない、となると
any()ではFALSEとなり
all()ではTRUEとなる

これで辻褄はあう
ちなみに
any(c())
all(c())
でも同じ結果が出る
0630132人目の素数さん垢版2019/01/08(火) 12:14:42.13ID:LiVTLUAx
1行のテキストデータを最終的に数値とテキストの混在するN行M列のデータフレームにしたいのですが、なかなかうまく出来ません。
1行データの構造の設計からデータフレームの変換までどうすればシンプルに実現できるか助言ください。

たとえば
1 a
2 b
というようなデータを
1-a,2-b
というような一行のテキストデータから初めてテーブル構造にするというような形です

x <- "1-a,2-b"
y <- str_split(x, ",")

と試しにやってみたのですがyが行単位のベクトルになるだけでここからどうデータフレームにすればよいかわかりません
0632132人目の素数さん垢版2019/01/08(火) 13:31:30.92ID:By0HLtnN
>>630
文字列 1-a,2-b を 数値とテキストのデータフレームにしたいという意味と解した。

x="1-a,2-b"
y=strsplit(x,",")
z=unlist(y)
w=NULL
for(i in 1:length(z)){
w=rbind(w,unlist(strsplit(z[i],"-")))
}
data.frame(NUM=as.numeric(w[,1]),TEXT=w[,2])
0633132人目の素数さん垢版2019/01/08(火) 13:33:34.43ID:By0HLtnN
実行結果
> x="1-a,2-b"
> y=strsplit(x,",")
> z=unlist(y)
> w=NULL
> for(i in 1:length(z)){
+ w=rbind(w,unlist(strsplit(z[i],"-")))
+ }
> data.frame(NUM=as.numeric(w[,1]),TEXT=w[,2])
NUM TEXT
1 1 a
2 2 b
>
0634132人目の素数さん垢版2019/01/08(火) 13:34:00.52ID:LiVTLUAx
>>631
NMは任意の数字です
したいことは
データを一行に記録してそれを
テーブル構造にすることです。
これだけです。

一旦ファイルに保存してread.csvなどにすればよいのでしょうが
いちおう直接テキストデータをコピペしてからということにしたいのです。

なぜこんなことをするかと言うと
TamperMonkeyという拡張機能でJavaScriptで使ってウェブ上のデータを収集しているのですが、
localStrageというクッキーの拡張版のような機能をつかってデータをクライアントに保存するときに基本的にテキストデータベースでの保存になので
一行のデータとして後ろにどんどんデータを追加していくのが一番単純な処理に成るからです。

そのlocalStorageに保存されたデータはコピペで取り出すしかないので
それをRで処理する時に一行のテキストデータから始めないといけないのです。
0635132人目の素数さん垢版2019/01/08(火) 13:56:11.34ID:qzUBBMdZ
>>634
, を行のデリミタ、- を列のデリミタとして、一行の文字列をデータフレームにするというのであれば、
s に文字列が入っているとして、
r <- unlist(strsplit(s, ","))
d <- lapply(r, function(x) unlist(strsplit(x, "-")))
as.data.frame(do.call(rbind, d))

列数が行によって異なるときにどうなるかは知らん。
0636132人目の素数さん垢版2019/01/08(火) 14:57:46.44ID:By0HLtnN
>>629
内部動作の考証ありがとうございます。


未だにこれは理解できません
> logical(NULL)
Error in logical(NULL) : invalid 'length' argument
> logical(0)
logical(0)
> logical(1)
[1] FALSE
0637132人目の素数さん垢版2019/01/08(火) 19:53:14.03ID:CxwlQqo4
>>630
> txt <- "1-a,2-b,3-c"
> read.table(text = gsub(',', '¥n', txt), sep = '-')
V1 V2
1 1 a
2 2 b
3 3 c
こんな感じか?
0638132人目の素数さん垢版2019/01/08(火) 20:04:46.51ID:CxwlQqo4
>>636
自分の解釈では、
NULL は「無」なのでエラー(引数はベクトルの要素数を必ず与えなければいけない)
0のとき、0個という指定なので、0個の要素をもつベクトル
1のとき、1個という指定なので、1個の要素を持つベクトル(規定値はFALSE)

ちなみに、
> logical(2)
[1] FALSE FALSE
2のとき、2個という指定なので、2個の要素を持つベクトル(規定値はFALSE)
0640132人目の素数さん垢版2019/01/08(火) 21:41:07.74ID:LiVTLUAx
皆さんありがとうございます。

>>637
ファイル入れなくてもできるんですね
0641132人目の素数さん垢版2019/01/08(火) 22:24:00.83ID:LiVTLUAx
最古の元号って大化なん?
一巡回って大化2でいいよ
あとは干支みたいに回せばいい
0643132人目の素数さん垢版2019/01/08(火) 23:33:49.53ID:/Jd5B1BR
じゃあ太蟹(たいかに)で
0644132人目の素数さん垢版2019/01/08(火) 23:44:56.11ID:LiVTLUAx
>>641は誤爆ですw
レス付くと思わなかった。。。
0645132人目の素数さん垢版2019/01/08(火) 23:47:19.60ID:LiVTLUAx
>>639
⇣の結果をすべて即答できるようになれば合格だと思います…

any(c(TRUE,NA))
any(c(FALSE,NA))
any(c(FALSE,NA,TRUE))
any(c(NA, TRUE))
any(c(NA,FALSE,TRUE))

all(c(TRUE,NA))
all(c(FALSE,NA))
all(c(FALSE,NA,TRUE))
all(c(NA, TRUE))
all(c(NA,FALSE,TRUE))

TRUE | NA
FALSE | NA
FALSE | NA | TRUE
NA | TRUE
NA | FALSE
NA | FALSE | TRUE

TRUE & NA
FALSE & NA
FALSE & NA & TRUE
NA & TRUE
NA & FALSE
NA & FALSE & TRUE
0647132人目の素数さん垢版2019/01/09(水) 02:19:38.70ID:tVKwPfCD
改元は改源で
0649132人目の素数さん垢版2019/01/10(木) 19:23:43.99ID:a/KDy24T
ggplot2で凡例をまとめる事ってできないでしょうか。
例えば、下記のコードでは線と点で別々の凡例になります。
線と点のスタイルを合わせて1つの凡例にしたいのですがどうすればいいでしょうか。

geom_line(mapping=aes(colour=Conditions),alpha=0.6)
+ geom_point(mapping=aes(shape=Conditions,colour=Conditions),alpha=0.8)
+ scale_shape_manual(values = 1:3)
0650649垢版2019/01/10(木) 20:22:57.38ID:a/KDy24T
すみません自己解決しました。
このコードではなくもっと後のthemeで凡例のスタイルを変えるときに余計なことをしていました。
0651132人目の素数さん垢版2019/01/10(木) 23:01:43.10ID:HnjZz/GW
mean.a <- function(x) "a"
mean(a)
#> [1] "a"

これ本に書いてたんだけど
君たちこれ実行して"a"がでてくる?
自分とこでじっこうしても

> mean(a)
[1] NA
警告メッセージ:
mean.default(a) で: 引数は数値でも論理値でもありません。NA 値を返します

となるんやけど?
いみわからん。
0653132人目の素数さん垢版2019/01/10(木) 23:11:23.83ID:HnjZz/GW
あ、上の方から順に入力していったらでたわ
でもJSでOOかじった程度なので全然意味分からん
なにやってんのこれ?
0655132人目の素数さん垢版2019/01/11(金) 19:05:06.45ID:Q3ISqt43
>>652
横からだが、勉強になった。
クラスの自作とか考えたことがなかったけど、今度、俺様クラスを作ってみよう
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"
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
とするとエラーなしに計算してくれた。

(備忘録)
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を超えています。これ以上書き込みはできません。

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