研究や教育で用いられるコンピュータについての心得を書いておきます. 最近は段々多くなってきたので目次をつけておきます.
本ページは、横軸に任意の列(VARX)を指定し、
縦軸に VARS_use の各変数を順に取り、
黒丸の点+右側に都道府県番号(no) のラベルを付けた散布図を
PNGで連続保存する R スクリプトの解説です。既存のページと同じフォームで整えています。
横軸を VARX に、縦軸を VARS_use の各列に設定して、
ファイル名 VARX_YVAR_タイムスタンプ.png で一括出力します。
タイムスタンプは毎回新規に生成します。
dat(例:zaishishin)に存在。no(都道府県番号)があること。VARS_use には縦軸候補の列名が入っていること(横軸と同名は自動除外)。VARX を "clinic"(既定)や "homedeath" などに変更。# ===== 横軸に使う列名を最初に定義 =====
# VARX <- "homedeath" # ← 必要に応じて "age" などに変更
VARX <- "clinic" # ← 必要に応じて "age" などに変更
# 必要列の存在確認
if (!VARX %in% names(dat)) stop(sprintf("'%s' がデータにありません。", VARX))
if (!"no" %in% names(dat)) stop("'no' 列(都道府県番号)がデータにありません。")
# x軸・ラベル(数値化と文字化)
x <- as.numeric(gsub(",", "", dat[[VARX]]))
lab <- as.character(dat[["no"]])
# タイムスタンプは毎回新規作成
plot_ts <- format(Sys.time(), "%y%m%d%H%M%S")
# y軸に回す変数(横軸と同じ列は除外)
y_vars <- setdiff(VARS_use, VARX)
if (!length(y_vars)) stop("縦軸に回す変数がありません。")
for (yvar in y_vars) {
y <- as.numeric(gsub(",", "", dat[[yvar]]))
ok <- is.finite(x) & is.finite(y) & !is.na(lab)
if (!any(ok)) {
cat(sprintf("skip: %s(有効な観測がありません)\n", yvar))
next
}
# ファイル名:x軸名_Y軸名_タイムスタンプ.png
fname <- paste0(VARX, "_", yvar, "_", plot_ts, ".png")
png(filename = fname, width = 1600, height = 1200, res = 200)
par(mar = c(5, 5, 2, 2))
# 黒丸を描画 → すぐ右に都道府県番号 no を表示
plot(x[ok], y[ok],
pch = 16, col = "black",
xlab = VARX, ylab = yvar,
main = paste0("Scatter: ", yvar, " vs ", VARX))
grid()
text(x[ok], y[ok], labels = lab[ok],
pos = 4, offset = 0.4, cex = 0.9, col = "black")
dev.off()
cat("saved:", normalizePath(fname), "\n")
}
VARX <- "clinic""homedeath" などに差し替え可。if (!VARX %in% names(dat)) ... と if (!"no" %in% names(dat)) ... で安全確認。no を文字列に。plot_ts <- format(Sys.time(), "%y%m%d%H%M%S") を毎回新規生成し、ファイル名に付与。y_vars <- setdiff(VARS_use, VARX) で横軸と同名の列を除外。yvar について {VARX}_{yvar}_{timestamp}.png を保存。pch=16)で点を描画し、text(..., pos=4, offset=0.4) で右隣に番号ラベルを配置。offset を 0.3〜0.8 で調整、または cex を 0.7〜0.9 に。png(..., width=1600, height=1200, res=200) を編集。readr::parse_number() の利用も検討。こうしてみるとRもStataも一長一短があり,どちらも難しさや洗練されていない部分を感じます.ベクトルや行列の操作はRが長けています.Stataは転置'するのを忘れると行と列が逆さまになります.また,エクセルファイルを読み込むときにエラーではないですが,注意が出てきて煩わしい.
指定したデータフレーム(既定:zaishishin)から複数列の記述統計
(mean / sd / cv / min / max)を計算し,タイムスタンプ付きの Excel(例:
在支診_250916113045.xlsx)に書き出すための最小スクリプトです.
DATA_NAME をあなたのデータ名に合わせる(例:そのまま "zaishishin").getwd())に Excel が出力されます.# ===================== データフレーム名を指定 =====================
DATA_NAME <- "zaishishin" # ← ここを必要に応じて変更
dat <- get(DATA_NAME, envir = .GlobalEnv) # 文字列の名前をグローバル環境から取り出す
# ===================== 出力ファイル名 =====================
FILE_PREFIX <- "在支診" # ← 出力するエクセルファイルの前の名前
# ===================== 変数ベクトル =====================
VARS <- c("medi_population", "care", "clinic", "homedeath", "nursingdeath", "age", "income",
"Medical_care_inpatient_p", "Inpatient_living_p", "Reimbursements_etc_p")
# ===================== 統計量ベクトル =====================
STATS <- c("mean", "sd", "cv", "min", "max") # 計算自体は下で固定(参考として保持)
# ===== 計算 =====
VARS_use <- VARS[VARS %in% names(dat)]; if (!length(VARS_use)) stop("対象列がありません.")
L <- lapply(VARS_use, function(v) as.numeric(gsub(",", "", dat[[v]]))) # カンマ削除→数値化
m <- sapply(L, mean, na.rm = TRUE)
s <- sapply(L, sd, na.rm = TRUE)
cv <- ifelse(is.finite(m) & m != 0, s / m, NA_real_) # 変動係数(CV)=sd/mean.meanが0/非有限→NA
mn <- sapply(L, function(x) suppressWarnings(min(x, na.rm = TRUE)))
mx <- sapply(L, function(x) suppressWarnings(max(x, na.rm = TRUE)))
results_df <- data.frame(
Variable = VARS_use, mean = m, sd = s, cv = cv, min = mn, max = mx,
check.names = FALSE, row.names = NULL
)
# ===== Excel 出力(簡潔版) =====
if (!requireNamespace("openxlsx", quietly = TRUE)) install.packages("openxlsx")
timestamp <- format(Sys.time(), "%y%m%d%H%M%S")
out_file <- paste0(FILE_PREFIX, "_", timestamp, ".xlsx")
openxlsx::write.xlsx(results_df, out_file, rowNames = FALSE)
cat("出力:", normalizePath(out_file), "\n")
DATA_NAME:使用するデータフレーム名(例:"zaishishin").FILE_PREFIX:出力Excelの接頭辞(例:在支診_yyMMddHHmmss.xlsx).VARS:記述統計を出したい列名ベクトル.存在する列のみ処理.STATS:出力する統計量のラベル(計算は mean / sd / cv / min / max で固定).DATA_NAME を正しいデータ名に変更,または先に読み込む.install.packages("openxlsx") を実行.昔Rを使っていたのですが,この論文とかかなり忘れてしまったので,備忘録を書きます.RStudioは便利ですがRぽさが無くなりました.
このページは,作業ディレクトリの設定 → Excel の読み込み → 別スクリプト d1.r の実行,という一連の流れを
start.r にまとめる際の説明です.
setwd("c:/Users/t/dropbox/arbeit") # 適切なディレクトリを選ぶ.ここではarbeit
getwd() # 作業ディレクトリの確認
# install.packages("readxl") # 下がエラーならパッケージを読み込む
library(readxl) # エクセルファイルを読みたい
zaishishin <- read_excel("C:/Users/t/Dropbox/arbeit/zaishishin.xlsx") # エクセルファイルを読み込む.ここではzaishishin
source("C:/Users/t/Dropbox/arbeit/d1.r", encoding = "UTF-8", echo = TRUE, chdir = TRUE) # Rの実行.ここではd1.r
setwd("c:/Users/t/dropbox/arbeit")/ 区切りが安全).getwd()# install.packages("readxl")readxl をインストール(必要なときにコメントを外して実行).library(readxl)zaishishin <- read_excel(".../zaishishin.xlsx")zaishishin を作成.シート指定は sheet = "Sheet1" など.source(".../d1.r", encoding="UTF-8", echo=TRUE, chdir=TRUE)d1.r を実行.encoding は文字コード,echo=TRUE は実行行を表示,chdir=TRUE はスクリプトの場所に移動してから実行(相対パスが安定).start.r として保存.PowerShell / cmd から直接実行する場合:
Rscript --vanilla --encoding=UTF-8 "C:/Users/t/Dropbox/arbeit/start.r"
.xlsx/.xls)を確認.Dropbox の場合は「このデバイスに常に保存」を.install.packages("readxl") を実行.read_excel() の失敗が疑われます.ファイルパス/シート名を確認.Rscript ... を直接入力していないか.R 内では source() を使う.変数例:medi_population care clinic homedeath nursingdeath age income(必要に応じて置き換え)
本ドキュメントは,Stata の tabstat を用いて mean / sd / cv / min / max をまとめて計算し,
「行=変数・列=統計量」のワイド表に整形して,Excel(.xlsx)に書き出す DO ファイル
desc5_commented.do の詳しい解説です.
.dta あるいは .csv)を開く.use "YOUR_DATA.dta", clear または import delimited "YOUR_DATA.csv", varnames(1) clearVARS / STATS / FILE_PREFIX / SHEET を必要に応じて編集.FILE_PREFIX_YYYYMMDDHHMMSS.xlsx が作成されます(シート名=SHEET).*******************************************************
* desc5_commented.do — 記述統計(ワイド形式のみ)をExcel保存
* -----------------------------------------------------
* ・対象変数の mean / sd / cv / min / max を tabstat で計算
* ・行=変数,列=統計量 の行列に整形して Excel に出力
* ・ファイル名は「ファイル名_YYYYMMDDHHMMSS.xlsx」(常にユニーク)
* ・ロング形式は出力しません
* ・必要な編集箇所は「PARAMETERS」ブロックのみ
*******************************************************
* =============== [OPTIONAL] データ読込の例 ===============
* use "YOUR_DATA.dta", clear
* あるいは
* import delimited "YOUR_DATA.csv", varnames(1) clear
* ========================================================
* ===================== PARAMETERS =======================
* 1) 記述統計の対象変数(カンマ無しのリスト)
local VARS "medi_population care Medical_care_inpatient_p Inpatient_living_p Reimbursements_etc_p clinic homedeath nursingdeath age income"
* 2) 出したい統計量(cv を外したい場合は cv を消すだけ)
local STATS "mean sd cv min max"
* 例:cv を外す -> local STATS "mean sd min max"
* 3) Excelファイル名の先頭(自由に変更可)
local FILE_PREFIX "ファイル名"
* 4) 書き出すシート名(自由に変更可)
local SHEET "desc"
* ========================================================
* ---------------- 記述統計(tabstat) -------------------
* columns(statistics) で列=統計量,行=変数の並びになる
tabstat `VARS', statistics(`STATS') columns(statistics) save
* tabstat の結果(r(StatTotal))を行列HYに整形
matrix HY = r(StatTotal)' // 転置して「行=変数」に
matrix colnames HY = `STATS' // 列名を統計量に
matrix rownames HY = `VARS' // 行名を変数名に
* ----------- 出力ファイル名:タイムスタンプ -------------
* ・YYYYMMDDHHMMSS 形式の連結(空白や記号が入らない安全な形式)
local STAMP = string(date(c(current_date),"DMY"), "%tdCCYYNNDD") + ///
string(clock(c(current_time),"hms"), "%tcHHNNSS")
* 完全なファイル名を作成
local FNAME = "`FILE_PREFIX'_" + "`STAMP'" + ".xlsx"
* --------------- Excel へワイド形式で出力 ---------------
* ・putexcel で行列HYをそのまま書き出し
* ・nformat("0.000") は Excel 純正の数値書式(互換性〇)
putexcel set "`FNAME'", sheet("`SHEET'") replace
putexcel A1 = matrix(HY), names nformat("0.000")
display as result "Saved: `FNAME' (sheet: `SHEET')"
/***
-----------------------------------------------------------
[参考] export excel を使う堅牢版(必要に応じて使用)
・HY を一旦データ化してから export excel を使う方法
・フォーマットはExcel側で設定(ここでは設定しない)
-----------------------------------------------------------
preserve
clear
svmat double HY, names(col) // HY をデータ化(列=統計量)
* 行名(変数名)を列に復元
gen str60 var = ""
local i = 1
local rnames : rownames HY
foreach r of local rnames {
replace var = "`r'" in `i'
local ++i
}
order var
export excel using "`FNAME'", sheet("`SHEET'") firstrow(variables) replace
restore
***/
*******************************************************
* ヒント
* ・統計量の種類は STATS で切替(cv を抜きたい時は STATS から削除)
* ・SHEET 名や FILE_PREFIX も自由に変更可能
* ・値の丸めはExcel側の表示形式でも調整できます(#,##0.000 など)
*******************************************************
local VARS "..."local STATS "..."tabstat が受け付ける名称(例:mean, sd, cv, min, max).cv を外したい場合はリストから削除.local FILE_PREFIX "..."YYYYMMDDHHMMSS)と拡張子 .xlsx が自動で付きます.local SHEET "..."replace 指定で上書きします.tabstat `VARS', statistics(`STATS') columns(statistics) save により,
列=統計量・行=変数の表を作成し,結果を r(StatTotal) として返します.
save を付けないと r(StatTotal) は残りません.
matrix HY = r(StatTotal)' で転置(行=変数)し,
matrix colnames HY = `STATS',matrix rownames HY = `VARS' で見出しを付与します.
日付は string(date(c(current_date),"DMY"), "%tdCCYYNNDD"),時刻は
string(clock(c(current_time),"hms"), "%tcHHNNSS") の形式で取り出し,連結して
YYYYMMDDHHMMSS を作ります.空白や記号が入らないのでファイル名として安全です.
putexcel set "`FNAME'", sheet("`SHEET'") replace で出力先を設定し,
putexcel A1 = matrix(HY), names nformat("0.000") で表を貼り付けます.
names は行列の行名・列名を先頭行/列に出力,nformat("0.000") は Excel の数値表示形式です.
フォーマットを Excel 側で設定したい,あるいは putexcel の仕様が合わない場合は,
svmat で一旦データ化し,export excel を使う方法が堅牢です(上記コメントブロック参照).
VARS に存在しない列名が含まれていないか確認.. になります.nformat("0.000") で調整(例:"#,##0.000").STATS に median,p25,p75 などを追加.putexcel set を切替えて複数シートへ.エクセルで次のコマンドを入力する.
=IF(ISNA(VLOOKUP($B2,shusseki_1,1,FALSE)),"",1)
LaTeX文章に図を書き入れるときははWinTpicが便利です. 丹野の論文中にある図のほとんどはWinTpicで作成されています. 例えば,最近の論文の図を見ると TeX の数式になっていて良いですね. 画面で見ると汚いですが,印刷はちゃんとしています. その使い方とダウンロードについては,例えば,WinTpicによる描画・目次等を見て下さい.
OHP用のLaTeXマクロとして SLITex や slides クラスが有名ですが, 一部のコマンドが使えなかったりフォントが制限されたりします. それに TeX ではもちろん使えない. かといってOHP用の大きなフォントを自分で metafont で作るのは面倒臭い. それで,myzsize.texというマクロを用います. 最初はMETAFONTが起動してたくさんのフォントが作られて驚きますが,サイズが決まりすべてのフォントが揃えた後はMETAFONTは起動されなくなります. \input でインクルードして \mysize にポイント数を入れるだけです. フォントを生成してしまえばそれはTeXでも使えます. サンプルとしてIMGTAでのOHPや東大でのOHPを挙げておきます. 日本語フォントももちろん生成できます. 図は始めに紹介した WinTpic で作りました.
Acrobatがインストールされていることを前提とします. dvipskでpostscriptファイルに変換して distiller で pdf 形式にします. TeX形式のファイルをコンパイルしてできた foo.dvi に対して,
dvipsk -P dl -z foo.dvi
そして foo.ps という ps ファイルを生成します. その後,ファイルをクリックするかdistiller のアイコンにファイルを載せるとpdfファイルができ上がります.
LaTeXで表を tabular 環境で作のは面倒臭いし,空白が多いとついつい & を余分に入力したり入れ忘れたりします. 簡単に表を制作する方法として
を用いる方法があります. Excel2LaTeXは Excel の表を tabular 環境に出力するソフトです. Excelはあまり使いたくないので,Excelから csv 形式にセーブしてからcsv エディタを用いています. csv エディタとしてはListPadを用いていましたが,最近はHTML形式やtabular形式に 変換できる椿に乗り換えました. Visual Tabularは罫線の位置も指定することができるし,HTML形式にも落とすことができるのでとても便利です. ちょっとした表を作成するときはLaTeX形式でもHTML形式でもVisual Tabularを用いています.
Acrobatがインストールされていることを前提とします. Excelのグラフを eps 形式に変換してdvioutの hypertex と Ghostscript を利用して表示と印刷をします. Excelのグラフを[印刷]でプリンターを distiller にしてファイル形式をEPSにするだけですが,ちょっとした工夫が必要です. マクロ経済学の講義ノート(1)にあるグラフはこのようにして LaTeX に取り込みました. 詳しくは,ExcelのグラフをEPSファイルにする方法を参考にして下さい.
また,次の方法でgifファイルにした後 Linux で netpbm を用いてEPSを作ることもできますが,Windowsベースの人はこちらの方が早いでしょう.
Excelのグラフを gif 形式の画像に変換してimgタグでHTML形式のファイルに読み込ませます.
経済数学の試験の講評にある点数の度数分布はこのようにして HTML ファイルに取り込みました.
以前 TeX や LaTeX のコンパイルは卓駆★というファイラーからコマンドを登録して行っていましたが, LaTeXフロントエンドが便利でこれを使っています. 2回目の起動は左クリック2回で一発ですし,違う tex ファイルをドラッグ&ドロップで実行することもできます. 他のTeX関係のソフトはYahooのYahoo!コンピュータ - フリーソフト&シェアウェアを参考にして下さい.
LaTeXでは左と上に1インチ=2.54cmのマージンが自動的に入ります. それを見越して左右のマージンを調整して本文を中心に置かなければなりません. そのためには,xを左右のマージン,yを本文の幅としたときに, y+2 x=15.92cmになるようにすると本文が上手く収まります. 計算式は下を見てください.
\setlength{\textwidth}{13.90cm}
\setlength{\oddsidemargin}{1.01cm}
\setlength{\evensidemargin}{1.01cm}
% A4 横21cm ( 29.7 cm × 21.0 cm )
% 1インチ=2.54cm
% 2.54cm +margin x + width y + x + 2.54 cm =21.00
% y+2x=15.92 (*)
講義のレジメをHTMLで書いていたときはたくさんの色を用いていましたが,LaTeX → pdf に移行してから「色が無い」という意見が出ました. それでLaTeXで色を表示することについて書いてみます. 話は簡単で,プリアンブルに
\usepackage[dvips]{color}
\usepackage{graphicx}
と書いて「赤い色」を赤くしたければ,本文中に
\textcolor{red}{赤い色}
と書くだけです. けれども,一々 \textcolor と書くのは面倒だし白黒プリンターだと赤が出ません. (実はカラープリンターを持っていません.^^;) ですから強調したい文字を太文字にしておきたいです. そこで \red という命令を新たに作っています.
\def\red#1{\textcolor{red}{\bf #1}} % 赤
これですと\red{赤い時}で赤の太文字になり白黒プリンターでも確認ができます. 例えばミクロ経済学の基礎の1ページ目のようになります.
テストで何問か出題するときに問題番号を自動的に割り振ってくれるととても便利です. 特に問題を作成しているときに問題が何問あるのかを確認したり,問題の順序を変えるたびに番号を一々書き換える面倒な作業を省略できます. このミクロの問題のように小問には大問の番号をつけてアルファベット順に並べましょう. 作成するコマンドは \mondai と \shomon です. プリアンブルに次のコマンドを書くと出来上がります.
\newcounter{mondai} % 問題カウンター
\def\mondai{\refstepcounter{mondai} % 問題
\hspace{0zw}\makebox[2zw][r]{\fbox{\bf\large %
\arabic{mondai}}\hspace{1zw}}} %
\newcounter{shomon}[mondai] % 小問カウンター
\def\shomon{\refstepcounter{shomon} % 小問
\makebox[1zw][r]{\fbox{\arabic{mondai}\Alph{shomon}}} %
\hspace{0.5zw} %
\hangindent=2zw \hangafter=-3} %
ここでの工夫は小問の場合はインデントを深くしていることです. TeXのコマンド \hangindent でインデントを通常の倍 2zw にして, \hangafter で先頭から3行目までをインデントさせています. 小問が4行以上の場合はこの絶対値を増やします. (マイナスに注意.) もしくは,もっと多めに取っておけば良いでしょう. そうすると小問は大問に比べて引っ込んだところに位置することができます.
Windowsではショートカットキーがある程度共通化されているので覚えておくと便利です. 丹野はVZエディターのキーバインディングになれているので,以前はまったく使ってませんでしたが慣れると便利です. あんまり多いと忘れるのでIEを中心にいつも使っているキー+アルファを書いておきます. マウス操作の貼り付けで置換はおおにしさんから教えてもらいましたが,これは本当に目から鱗で感激しました.
使えるショートカットはここなどが見やすいです. しかし,これは便利だと思ってもキー操作を直ぐに忘れてしまうので代表的なショーットカットだけで十分でしょう.
論文の表紙を1頁目に書いて,ボディは2頁目以降に書くことがあります. その際にページの通し番号を2枚目以降からにして1枚目の表紙にはページ番号を入れないようにする日は,表紙のページに以下のコマンドを入れると良いです.
\thispagestyle{empty}
\setcounter{page}{0}
表紙が2ページ渡る場合は各ページで\thispagestyleを入れて,最初にページカウンターを-1にすると良いでしょう.
タダノブのページのミラーサイトとして無料のHPエリアGeocitiesを利用しています. しかし,ページの上に広告が出るのが玉に瑕です. 広告収入で運営されているので仕方のない面もありますが,それを標準設定で回避することができます. Geocitiesのトップページから
トップ > インフォメーションセンター > ツール > ジオガイドマネージャ > ジオガイドの調整・変更
で広告表示のオン/オフができます. 何も色んな裏ワザを駆使しなくてもいいのです. けれども,一応広告収入で運営されているので幾つかのページは広告が出るように設定しています.
Excel のグラフを TeX 形式のファイルに載せる方法があるのですが正確に書いておかないと忘れるため新しく Excelの図をEPSファイルにする方法を作りました.
昔のMS-DOSやWindows95ではautoexec.batにパスを書き込んで設定しましたが,Windows 2000やWindows XPでは初心者に分かり易いように設定がコントロールパネルでできるようになりました. 超初心者のためにパスの設定方法を書いておきます.
LaTeXの文章の文字数を数える方法を紹介します. DeTexを使ってLaTeXのコマンドを除去する方法が一番簡単です. しかし,少々回りくどいのですが,DVIファイから生成されたPDFファイルをpdftextでテキストファイルへ転換して文字数を数える方法を書いておきます. pdftotextについてはnakagamiさんのPDF関連がとても親切にインストールの仕方を 教えてくれます.
$ pdftotext -enc EUC-JP hoge.pdf
そうするとhoge.txtというテキストファイルが生成されます. オプション -enc は文字のエンコーディングを指定しています. そしてText Analyzerで文字数を数えるます.テキストファイルへコンバートした時に空白ができるかもしれませんが,オプションで無視することもできるなかなかの優れものです.結局人に見せる時はPDF化するわけですし,自分で作ったマクロがある人や原稿をテキストファイルで出して欲しいと編集者に言われた場合は結局はこちらの方が早いようです.