裏 RjpWiki

文字通り,RjpWiki の裏を行きます
R プログラム コンピュータ・サイエンス 統計学

「トライアングル・メイズ」問題

2016年09月29日 | ブログラミング

締め切りが 2016/09/29 10:00 AM なので,その 1 分後に投稿されるように予約

設問

次のルールで生成される迷路を考えます。

レベル 1 の迷路から始めましょう。レベル 1 の迷路を M1 と呼びます。M1 は、3 つの点を L の字の形につないだものです。
左上の点がスタートで、右下の点がゴールです。

レベル 2 の迷路 M2 は、M1 を 3 つつなげて作ります。
M1 を 1 つ置き、さらにその上と右に 1 つずつ M1 をつなげたものです。
左上の点がスタートで、右下の点がゴールです。

レベル 3 の迷路 M3 は、M2 を 3 つつなげて作ります。
M2 を 1 つ置き、さらにその上と右に 1 つずつ M2 をつなげたものです。
左上の点がスタートで、右下の点がゴールです。

以降同様に、レベル k の迷路 Mk を、レベル k-1 の迷路 Mk-1 を 3 つつなげることで定義します。



さて、この迷路を、点と線をたどってスタートからゴールまで着く方法を考えます。
自然数 n に対し、迷路 Mn を最短距離でゴールするたどり方の数を F(n) と定義します。

例えば F(1) = 1,F(2) = 2 です。



同様に、F(3) = 6,F(4) = 42 です。
さらに、F(10) を 1000003(=10^6+3) で割った余りは 998593 となることが確かめられます。

標準入力から、自然数 n(1 ≦ n ≦ 10^8)が与えられます。
標準出力に F(n) を 1000003 で割った余り を出力するプログラムを書いてください。

=====

いつもの定石,すなわち,小さな問題の解を求め規則性を見つける。a(n) = a(n-1) * (a(n-1)+1)
ただし,真っ正直に計算するのでは n がばかでかいときには時間が掛かりすぎる。
ここでは,「1000003 で割った余り」を求めよということなので,答えの数列は一度ループにはまると,ループをぐるぐる回ることになるということ(これも定石)。
1~213 はループの外,214 項目の数値と同じ数値は1169 項目と同じになる(これは調べる)。
すなわち,214~1168, 1169~2123, ... は長さ955 のループ(同じ数字列の繰り返し)。

f = function(n) {
    m = 1168
    k = 1000003
    a = numeric(m)

    options(scipen=100)
    a[1] = f1 = 1
    a[2] = f2 = 2
    for (i in 3:m) {
        f3 = ((f2 %% k) * ((f2+1) %% k)) %% k
        a[i] = f3
        f1 = f2
        f2 = f3
    }
    if (n >= 214) {
        n = (n-214) %% 955 + 214
    }
    cat(a[n], " ")
}

> f(10)
998593  

> f(100000000)
342482  

コメント
この記事をはてなブックマークに追加

素数で作る天秤ばかり

2016年09月20日 | ブログラミング

素数で作る天秤ばかり

2016/09/20 10:00 AM なので,その 1 分後に投稿されるように予約

【問題】
天秤ばかりを使って重さを量りたいと考えています。
ただし、使えるおもりは重さが素数のものしかありませんでした。

m, n をともに正の整数とし、m 以下の素数すべてがおもりの重さとして1つずつ用意されているとき、n グラムの計り方が何通りあるかを求めてください。

例えば、m = 10, n = 2のとき、2, 3, 5, 7 のおもりが一つずつありますので、左右に以下のおもりを使った4通りがあります。
(量るものを左側に置いたとします。)

左側         右側
なし         「2」
「3」         「5」
「5」         「7」
「2」、「3」     「7」

標準入力から m と n がスペースで区切って与えられるとき、n グラムの計り方が何通りあるかを標準出力に出力してください。
(ただし、 m < 50 とします。)

【入出力サンプル】
標準入力
10 2

標準出力
4


==========

bin を毎回呼び出すとそのオーバーヘッドがあるので,結果をリスト bin.list に保存しておき,関数呼び出しをリストの参照に換えることで,実行時間は速くなる

bin = function(p) {
    retval = matrix(0L, nrow = 2^p, ncol = p)
    for (n in 1:p) {
        retval[, n] = rep(c(rep(0L, (2^p/2^n)), rep(1L, (2^p/2^n))), length = 2^p)
    }

    retval
}

f = function(m, n) {
    bin.list = sapply(1:14, bin)
    count = 0
    prime = c(2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47)
    prime = as.integer(prime[prime
    left.use = bin.list[[length(prime)]] # bin(length(prime))
    left = left.use %*% prime + n
    for (i in 1:(nrow(left.use) - 1)) {
        rest = prime[!left.use[i, ]]
        if (left[i]
            right.use = bin.list[[length(rest)]] # bin(length(rest))
            right = right.use %*% rest
            count = count + sum((left[i] == right))
        }
    }
    cat(count)
}


f(10, 2)  # 4
f(20, 10) # 90
f(30, 50) # 286
f(40, 30) # 3217
f(46, 3)  # 24946

コメント
この記事をはてなブックマークに追加

何回いえばわかるんだ(^_^)

2016年09月14日 | ブログラミング

> 第5回みえ県民意識調査は、各市町の選挙人名簿を使用した等間隔無作為抽出法により、標本を抽出しており、標本数10,000人に対して、有効回答数は5,236人でした。そのため、各属性において、実際の県全体と回答者の構成が異なる部分もあることから、以下にその概略をまとめています。

「等間隔無作為抽出法」というのは統計学用語にあるのかな?ふつうは「等間隔抽出法」とか「系統抽出法」じゃないか?

標本数10,000人」というのは大間違い。「調査対象が10,000人」ということ。「標本数」と「標本の大きさ(サンプルサイズ)」は大違い。

また,本文中で「回答数(サンプル数)」と何回も書いているが,「サンプル数」というのは統計用語にはない「標本の大きさ」とか「サンプルサイズ」というのがよい。

> 例えば、同じ調査を異なる調査対象で100回行った場合、95回以上の割合で同様の差が生じる場合は「統計的に有意な差がある」と表現し、90回以上の割合で同様の差が生じる場合は「統計的にある程度有意な差がある」と表現しています。

「統計学的に有意」の説明はいい加減。

> U>1.64の時、平均値の差は統計的に有意であると言える(危険率5%)

うおっ。何の断りもなく「片側検定」を行っているよ。

いい加減な用語を使っていると,内容の信頼性が低下する。

顧問として,「○○大学地域学部 教授 ○○○○」の名前があるんだが...

地元なんだから,三重大学の奥村晴彦先生に監修してもらうと良いのでは?

コメント
この記事をはてなブックマークに追加

パターゴルフのコース設計

2016年09月13日 | ブログラミング

締め切りが 2016/09/13 10:00 AM なので,その 1 分後に登録されるように予約

パターゴルフのコースを新しく作ることにしました。
そこで、各ホールの標準打数を考えています。

m ホールで合計の標準打数が n になるように、各ホールの標準打数を決めなければなりません。
なお、各ホールの標準打数は1以上5以下とし、m≦18とします。

例えば、3ホールで合計が12の場合、以下の10通りがあります。
2 5 5
3 4 5
3 5 4
4 3 5
4 4 4
4 5 3
5 2 5
5 3 4
5 4 3
5 5 2

標準入力から m と n がスペースで区切って入力されます。
このとき、各ホールの標準打数のパターン数を標準出力に出力してください。

【入出力サンプル】
標準入力
3 12

標準出力
10

==========

m, n が小さいときの解を網羅して,規則性を見いだす。
規則に従い,以下のような行列(18×90 の行列)を生成する。

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21] [,22] [,23] [,24] [,25]
[1,]    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
[2,]    0    1    2    3    4    5    4    3    2     1     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
[3,]    0    0    1    3    6   10   15   18   19    18    15    10     6     3     1     0     0     0     0     0     0     0     0     0     0
[4,]    0    0    0    1    4   10   20   35   52    68    80    85    80    68    52    35    20    10     4     1     0     0     0     0     0
[5,]    0    0    0    0    1    5   15   35   70   121   185   255   320   365   381   365   320   255   185   121    70    35    15     5     1
  :
  :

その行列の m 行,n 列の数値が解である。

f = function(m, n) {
    a = matrix(0, 18, 90)
    a[1, 1] = 1
    x = rep(1, 5)
    for (i in 2:18) {
        k = i+0:(length(x)-1)
        for (j in 0:4) {
            a[i, j+k] = a[i, j+k] + x
        }
        x = a[i, i:(i*5)]
    }
    cat(a[m, n])
}

> f(3, 12)
[1] 10
> f(5, 21)
[1] 70
> f(9, 35)
[1] 32211
> f(13, 60)
[1] 6175
> f(18, 72)
[1] 2546441085

コメント
この記事をはてなブックマークに追加

カードを使って数を作ろう(簡単編)

2016年09月02日 | ブログラミング

締め切りが 09/02 10:00 AM に設定されている(ずいぶん先だなあ)

ということで 09/02 10:01 AM に投稿されるように予約(あとで,締め切りが延ばされても,それには関知しない)

【概要】
カードが何枚かあります。
カードには、一桁の数字が書いてあります。
カードを n 枚選んで並べて数を作ります。
たとえば、「3」「1」「4」「1」「5」が書いてあるカードから 3 枚(つまり、n=3)を選んで並べると「341」や「115」を作ることができます( 「334」や「31」は作れません)。
作れる数のうち、ある数 m にもっとも近い数を答えてください。

【入出力】
入力は
4,1234,1/2/2/3/9/9/9
のような感じです。
コンマ区切りで、n(カードの枚数)、m(この値に近い数を作る)、カード列 が並んでいます。
カード列は、カードに書いてある数字をスラッシュ区切りで並べたものです。

出力は、
1232
のような感じです。最も近い数が 2 つある場合は、小さい順に両方共出力してください。
1233,1235
のような感じです。
末尾の改行はあってもなくても構いません。
作れる数がひとつもない場合には、- を出力してください。
 
【例】
入力     出力
4,1234,1/2/2/3/9/9/9     1232
4,1234,1/2/2/3/3/5/5     1233,1235

 
【補足】
「01」のような、「0」で始まる二桁以上の数は作れません。一桁の「0」は OK です。
カードの枚数は8枚以下です。
n は 1 以上で、カードの枚数を超えることはありません。
m は 0 以上、10の9乗以下です。
6 のカードを逆さにして 9 として使ったりすることはできません。
不正な入力に対処する必要はありません。

【テスト用データ】
1,3,0/9/8
2,10,0/9/8
3,414,3/4/9/8/7
4,4981,4/5/0/1/2/3/8
5,12345,0/0/0/0/0/0/0
5,43103,3/5/0/2/1/4/9/4
6,172365,3/2/3/7/2/7/1/6
7,6523060,4/0/7/2/6/5/3/3
8,19069255,1/2/9/3/7/6/9/0
8,80465325,2/6/5/7/8/9/7/7
8,88888888,8/8/8/8/8/8/8/8
8,88888888,9/8/7/6/5/4/3/2

perm = function(n) {
    z = matrix(1)
    if (n > 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]]
            }
        }
    }
    dimnames(z) = NULL
    return(z)
}

func = function(s) {
    t = as.integer(unlist(strsplit(s, "[,/]")))
    n = t[1]
    m = t[2]
    t = t[-(1:2)]
    k = length(t)
    p = matrix(t[perm(k)], ncol=k)[,1:n, drop=FALSE]
    p = unique(p)
    if (n > 1) {
        p = p[p[,1] != 0, , drop=FALSE]
    }
    if (nrow(p) == 0) return("-")
    fac = if (n == 0) 1 else 10^((n-1):0)
    d = p %*% fac
    diff = abs(d-m)
    suf = which(diff == min(diff))
    paste(d[suf], collapse=",")
}

con = file("stdin", "r")
cat(func(readLines(con)))


コメント
この記事をはてなブックマークに追加

変進小数の足し算

2016年08月10日 | ブログラミング
締め切りが 8/10 10.00 AM なのでその一分後に掲載されるように予約登録

変進小数の足し算
【概要】

小数の足し算をして下さい。ただしこの小数は、

小数第 n 位 が 11-n 進数

という不思議なルールになっています。例えば、小数第1位は 10進数、小数第9位は2進数です。
このルールを「変進小数」と呼びます。



【入出力】

入力は
8.622+3.177
こんな感じです。
2個の変進小数が「+」で区切られて並んでいます。

 

出力は、
11.811
のように、足し算の結果を変進小数で出力して下さい。


素直にプログラム

conv = function(s) {
    s = unlist(strsplit(s, "\\."))
    t = as.numeric(unlist(strsplit(s[2], "")))
    c(as.numeric(s[1]), c(t, rep(0, 9))[1:9])
}
deconv = function(x) {
    for (i in 10:2) {
        if (x[i] >= 12-i) {
            x[i-1] = x[i-1]+1
            x[i] = x[i]-(12-i)
        }
    }
    as.numeric(paste(x[1], ".", paste(x[2:10], collapse=""), sep=""))
}
x = "8.622+3.177"
options(scipen=100)
a = unlist(strsplit(x, "\\+"))
deconv(conv(a[1])+conv(a[2]))

コメント
この記事をはてなブックマークに追加

念のため(^_^)

2016年08月04日 | ブログラミング

> 8月3日

> 10%水準だと強い主張ができないとお悩みのあなた!「片側検定」を使えば、10%水準の微妙な結果もあっという間に5%水準で統計的に有意になり、議論の説得性が増します!American Sociological Reviewでも使われている権威ある手法です!( ´ ▽ ` )ノ

皮肉っているのではあるが,この手法は片側検定がある場合しか使えない。

平均値の差の検定であれば,「2群の平均値の差の検定」などの場合だけに有効であるが,「3群以上の平均値の差の検定」(いわゆる一元配置分散分析)の場合には使えない。同じく,比率の差の検定も2群の場合のみ,独立性の検定ならば 2×2 分割表の場合のみなど。

コメント
この記事をはてなブックマークに追加

信頼区間が重なっていても,有意差があることもあるんだよ

2016年07月28日 | 統計学

「有意差なしのロゴです。有意差がないときにご利用ください」だって...

https://pbs.twimg.com/media/CoTKh__VYAEhjkT.jpg

図が傾いているし,左右の棒の基線がなんなのか?

一番問題なのは,エラーバーがなんなのか。

たとえば,左側の棒の下端が第一群の標本平均,右側の棒の上端が第二群の標本平均として,エラーバーはそれぞれの母平均の95%信頼区間を表しているものとする。

以下のテストデータで,提示されロゴが表す状態が再現できる。

n1 = 40; mean1 = -39; se1 =   6/qt(0.975, n1-1); sd1 = sqrt(n1)*se1
n2 = 30; mean2 =  83; se2 = 128/qt(0.975, n2-1); sd2 = sqrt(n2)*se2

x = scale(rnorm(n1))*sd1+mean1
y = scale(rnorm(n2))*sd2+mean2
d = data.frame(g=rep(1:2, c(n1, n2)), z=c(x, y))

plot(c(0, 3), c(-50, 220), type="n", xaxt="n", yaxt="n", xlab="", ylab="", bty="n")
w = 0.15
rect(1-w, c(0, mean1), 1+w, c(mean1, 0))
rect(2-w, c(0, mean2), 2+w, c(mean2, 0))
abline(h=0, col="red", lty=3)
arrows(1:2, c(mean1-6, mean2-128), 1:2, c(mean1+6, mean2+128), angle=90, length=w*0.7, code=3)
text(1+1.2*w, mean1, paste("mean =", mean1), pos=4)
text(2+1.2*w, mean2, paste("mean =", mean2), pos=4)
text(2+1.2*w, 0, "base line", pos=4)
text(1:2+1.2*w, mean1-se1*qt(0.975, n1-1), "mean-se = -45", pos=4)

では,このデータで平均値の差の検定を行うとどうなるか

> t.test(x, y, var.equal=TRUE)

    Two Sample t-test

data:  x and y
t = -2.2519, df = 68, p-value = 0.02756

となり,信頼区間が重なっているにもかかわらず「有意な差である」という結論になる。

もっとも,var.equal=FALSE にすると,サンプルサイズをいろいろ変化させても有意な差ではないという結果にはなる。

 

> t.test(x, y, var.equal=FALSE)

    Welch Two Sample t-test

data:  x and y
t = -1.9472, df = 29.13, p-value = 0.06121

いずれにせよ,「エラーバーが重なっているから有意差はない」とはいい切れないのである。

コメント
この記事をはてなブックマークに追加

ダミー変数をカテゴリー変数に変換

2016年07月03日 | ブログラミング

奥村先生が,名古屋市のHPVVのデータの解析をしている

kaito = read.csv("kaito.csv", header=FALSE, colClasses="character", fileEncoding="UTF-8")
dim(kaito)
birth = ifelse(rowSums(kaito[,5:11]=="1") != 1, NA,
  ifelse(kaito[,5]=="1", 6,
  ifelse(kaito[,6]=="1", 7,
  ifelse(kaito[,7]=="1", 8,
  ifelse(kaito[,8]=="1", 9,
  ifelse(kaito[,9]=="1", 10,
  ifelse(kaito[,10]=="1", 11,
  ifelse(kaito[,11]=="1", 12, NA))))))))
table(birth, useNA="ifany")

birth はご本人も「もっとエレガントな方法があるだろうが,面倒なので…」と書いてあるが,簡単なので以下のように

birth2 = as.matrix(kaito[,5:11] == 1) %*% 6:12
birth2 = ifelse(birth2 < 6 | birth2 > 12, NA, birth2)
table(birth2, useNA="ifany")

kaito[,5:11] == 1 は,元のデータを colClasses="character" で読んだので,必要悪
掛けるベクトルの選択には注意(6:12 なら問題なし)
数値で読んでいればそのまま行列掛算
無視すべき(NA にすべき)データは,ifelse(birth2 < 6 | birth2 > 12, NA, birth2) で処理

それにしても,ダミー変数展開をそのままデータ入力するとは非効率甚だしい

---------

質問:以下の項目で当てはまるものにチェックしてください

□ Aです □ Bです □ Cです □ Dです ✓ Eです □ Fです □ Gです

0, 0, 0, 1, 0, 0, 0 って入力したのか...バカ

普通は

質問:以下の項目で当てはまる番号に○をつけてください

1. Aです 2. Bです 3. Cです 4. Dです 5. Eです 6. Fです 7. Gです 8. いずれでもない 9. わからない

一桁の数字で入力するだろ

また,いずれでもない,わからない などの項目も設けていないと,無回答なのか,該当しないのか,単に回答し忘れたのかなどすら区別できない

統計学以前,統計調査票(アンケート調査票)の作り方を知らない素人がやった調査なのか?

コメント
この記事をはてなブックマークに追加

アダムズ方式で議席数を計算

2016年06月21日 | ブログラミング

当初決められていた締め切りが 6月21日(火)10:00 AM なので,その 1 分後に投稿されるように予約
なお,締め切り日が延期されても,関知しない

衆院選挙制度改革法が成立し、「アダムズ方式」による議席数の割り当てが2020年の国勢調査に基づき用いられることが決まりました。
アダムズ方式は、各都道府県の人口を「ある同じ数値」で割って、その答えの合計が全国の議席数と同一になるように割る値を調整する計算方式です。
商が小数になる場合は切り上げることになっています。


例えば、250人、200人、150人の3つの県から10議席を選ぶとき、それぞれ65で割ると3.84…、3.07…、2.30…なので4,4,3となり合計が10になりません。
それぞれ75で割ると3.33…、2.66…、2なので4,3,2となりこれも合計が10になりません。
しかし、それぞれ70で割ると3.57…、2.85…、2.14…なので4,3,3となり合計が10になります。


標準入力の一行目に「議席数の合計」と「小選挙区の数」、二行目以降に小選挙区の数の分だけ人口が与えられます。
このとき、標準出力に各小選挙区の議席数を出力してください。


なお、人口として与えられる数は最大で1500万、小選挙区の数は最大で50とします。
「議席数の合計」「小選挙区の数」「人口」「割る数」のいずれも整数です。
※各小選挙区の議席数が一意に決まらないような入力は考えなくてもよいものとします。


【入出力サンプル】
標準入力
10,3
250
200
150

標準出力
4
3
3

例解

EPS = 1-1e-14

root = function(k, n) {
    f = function(x) sum(as.integer(k/x+EPS))-n
    left = 1
    right = max(k)
    repeat {
        mid = as.integer((left+right)/2)
        if (100 > right - left) {
            return(c(left, right))
        } else if (f(mid)*f(right) > 0) {
            right = mid
        } else {
            left = mid
        }
    }
}

func = function(s) {
    n = as.integer(unlist(strsplit(s[1], ",")))[1]
    k = as.numeric(s[-1])
    ans = root(k, n)
    for (i in ans[1]:ans[2]) {
        l = as.integer(k/i+EPS)
        if (sum(l) == n) {
            cat(paste(l, "\n", sep="", collapse=""))
            break
        }
    }
}

con = file("stdin", "r")
s = readLines(con)
func(s)

コメント
この記事をはてなブックマークに追加

排他的 n 乗数(その2)

2016年06月15日 | ブログラミング

table は高くつくので以下のようにすれば十数倍速くなる。だが,まだまだ時間が掛かりすぎる。

func = function(s) {
    options(scipen=100)
    s = as.integer(unlist(strsplit(s, ",")))
    m = s[1]-1
    n = s[2]
    for (i in m:1) {
        a = as.integer(strsplit(as.character(i), "")[[1]])
        y = integer(10)
        y[a+1] = 1
        if (sum(y) == length(a)) {
            b = strsplit(as.character(i^n), "")[[1]]
            if (!any(b %in% a)) return(i)
        }
    }
    return("-")
}

コメント
この記事をはてなブックマークに追加

排他的 n 乗数

2016年06月13日 | ブログラミング

「排他的 n 乗数」と呼ばれる数は,
    (a) 10 進数で表記したときに,同じ数字を含まない
    (b) n 乗した結果(10 進数表記)に,元の数に現れる数字が含まれない
というもので,例えば,608 は,608^3=224755712 なので「排他的3乗数」,284 は 284^4 = 6505390336 なので「排他的4乗数」である。

しかし,22^2=484 は,条件 (a) に合わないので 22 は「排他的 2 乗数」ではなく,123^4=228886641 は,条件 (b) に合わないので,123 は「排他的 4 乗数」ではない。

2 つの正の整数 m と n があるとき,m より小さい「排他的 n 乗数」のうち,もっとも大きな値を求めよ。そのようなものがない場合には "-" を返すものとする。

以下の R プログラムでは,時間が掛かりすぎる。

func = function(m, n) {
  options(scipen=100)
  for (i in (m-1):1) {
    a = unlist(strsplit(as.character(i), ""))
    if (!any(table(a) > 1)) {
      b = unlist(strsplit(as.character(i^n), ""))
      if (!any(b %in% a)) return(i)
    }
  }
  return("-")
}

コメント
この記事をはてなブックマークに追加

スーパーマーズ?

2016年06月02日 | 雑感

> 31日、火星が地球に最接近します。「スーパーマーズ」とも言われ、

そんな言葉聞いたこともない

最接近とは言っても,当然,目で見えるほどの大きさになるわけでもなく,

数十パーセントも大きく見えるわけでもないので,「これぞ誇大広告!!」の最たるもんでしょう。

また,31日が過ぎると,突如普通の大きさに戻るわけでもないので,慌てる必要もない。

別のサイトで「どこで見られる?」ともあったが,「晴れていれば,日本国内,どこで見ても同じ」とうのが正解。

曇っていたら見えないでしょうが!!!!!

コメント
この記事をはてなブックマークに追加

基本的な機能は,「基本的な重要性」を持っているのです

2016年05月30日 | ブログラミング

> みんなのRはテキストとしてかなり満足しているけど、str()・source()・write.table()・transform()あたりが載っていなくてびびった。

列挙に「・」を使う意味がわからないけど(^_^)

str() は,既存の関数の戻り値の内容ならば,"? 関数" を読めばわかるわけ

source() は,自作関数を作って活用する段階で必要なもの。それ以前なら,作り置いたファイルから,コンソールにコピペすれば十分なわけ

write.table() も,必要ではあるものの,read.table() したデータテーブルをいろいろ試行錯誤的というか追加的というか発展させていくわけで,write.table()したものを,そのまま使って分析へというのも,あんまり考えられない。データ入力からあらたな変数生成という過程をプログラムに残すということならば,むしろ write.table() で,ある時点のデータフレームを固定化する必要はないのではないか?むしろ,柔軟性を残す意味で,read.table() のあとの様々なデータ処理を一体化して保存しておくのがよいのではないか(このような時点では source() を使う必要もないのだよ)

transform() を便利だと思う人もいるだろうけど,直接的な記述をした方が「間違いがない」というメリットもあるんだよね。「わかりやすい」というのは,最大の長所。うっかりミスも防げる。

何が不要/必要,便利/不便というのは,それを使う人の技術水準で異なってくるんだね

指導者はある程度高度の水準にいるので,被指導者のレベルで何が必要かがわからなくなっているのではないか????

コメント
この記事をはてなブックマークに追加

正しい方法を使おう

2016年05月14日 | ブログラミング

2016 年 05 月 13 日 (金)

> R で計算するなら 1 - pnorm(60, 50, 10) あるいは pnorm(60, 50, 10, lower.tail = FALSE) twitter.com/yuba/status/73…

q が通常範囲であればどちらでもよいが,q が大きい場合は違いが生じる。

> options(digits=16)
> q = 100; 1 - pnorm(q, 50, 10); pnorm(q, 50, 10, lower.tail = FALSE)
[1] 2.866515719235352e-07
[1] 2.866515718791939e-07
> q = 120; 1 - pnorm(q, 50, 10); pnorm(q, 50, 10, lower.tail = FALSE)
[1] 1.27986510278788e-12
[1] 1.279812543885835e-12
> q = 150; 1 - pnorm(q, 50, 10); pnorm(q, 50, 10, lower.tail = FALSE)
[1] 0
[1] 7.619853024160527e-24


「統計学: R を用いた入門書 改訂第 2 版」にも,lower.tail を指定しない方法が書かれているが,どちらが正しいかは 3 番目の結果を見れば自明。

まあ,実際の統計学においては,その違いは結果を左右するようなものではないが。

コメント
この記事をはてなブックマークに追加