X



トップページ数学
1002コメント395KB
【R言語】統計解析フリーソフトR 第6章【GNU R】 [無断転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
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を超えています。これ以上書き込みはできません。

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