Tuesday, May 12, 2026

Gabaix 1999 QJEのMathematica

 数学が難しくてあまりちゃんと読まれていないと思われるGabaixのランダム成長理論.成長率が都市規模に依存しない (Gibrat) とき,都市規模分布がZipfになるというメッセージはある程度知られていると思われるが,Mathematicaでシミュレーションしてみよう.


1. reflected GBM

都市規模S_{it}が幾何ブラウン運動に従う

$$dS_{it}/S_{it} = \mu dt + \sigma dB_{it},$$

が,外生的な下限S_{min}で反射するとする.下限がないと分布が拡散し続け,定常分布を持たなくなってしまう.

パラメーターを設定する.ここがいまいちだとZipf係数は-1とけっこう乖離する.

mu = 0.001(* 期待成長率. zipfになるのはmu=0 *) 

sigma =  Sqrt[0.1] (* SD. 少し大きめにして動きを激しくする. 下限にヒットして跳ね返す必要.実証はQJEの脚註17 *)

Smin = 1 (* 反射壁, 最小人口 *)

nCities = 1024 (* 都市数 *)

tMax = 4096 (* シミュレーション期間 *)

dt = 1 (* time step *)

ブラウン運動をMapで書く.

nextSize[s_List] := 

 Map[Max[Smin, #] &, 

  s*Exp[(mu - sigma^2/2) dt + sigma Sqrt[dt]*

      RandomVariate[NormalDistribution[0, 1], nCities]]]

あとは走らせるだけ.

initialSizes = ConstantArray[1.1, nCities] (* 初期の人口. Sminの近くに設定. *);

SeedRandom["gabaix"] (* mathematicaは文字列でも乱数のseedを設定できる *)

history = NestList[nextSize, initialSizes, tMax]; 

finalSizes = Last@history;

finalSizesNorm = finalSizes / Mean@finalSizes (* 基準化 *)

プロットは

sortedSizes = ReverseSort@finalSizesNorm;

ranks = Range@nCities;

 ListLogLogPlot[Transpose@{sortedSizes, ranks - 1/2}, 

  AxesLabel -> {"log Pop", "log Rank (-1/2)"}, 

  PlotLabel -> "Zipf Plot at T=" <> ToString@tMax, 

  PlotStyle -> PointSize[Medium]PlotFit -> "Linear"



無理矢理反射させているので,bottomで崖のようになっていることが確認できる.

2. heterogeneous cities

命題2は,muやsigmaが異なっていても,それぞれGibrat則を満たしていれば集計したときZipf則が成り立つ,というものである.ここではsigmaが大きい群と小さい群の2グループに分けてみよう.

(* 2グループ *)

nCities1 = 500; nCities2 = 500;

sigma1 = 1; sigma2 = 1;

mu1 = 0.05; mu2 = 0.20; 

(*シミュレーション関数 (幾何ブラウン運動+反映壁) *)

simulateZipf[nCities_, tMax_, sigma_, sMin_] := 

 Module[{mu = -sigma^2/2, nextSize, initialSizes},

  nextSize[s_List] := 

   Map[Max[sMin, #] &, 

    s*Exp[mu + sigma*RandomVariate[NormalDistribution[0, 1], nCities]]];

  initialSizes = ConstantArray[sMin, nCities];

  Last[NestList[nextSize, initialSizes, tMax]]]

SeedRandom["eeckhout"] (* seed *)

(*グループ1 *)

group1 = simulateZipf[nCities1, tMax, mu1, sigma1];

(*グループ2*)

group2 = simulateZipf[nCities2, tMax, mu2, sigma2];

(*合計(集計)*)

aggregate = Join[group1, group2]; 

あとはプロット

zipfData[list_] := Transpose[{Range[Length@list] - 1/2, ReverseSort@list}]

ListLogLogPlot[{zipfData[group1], zipfData[group2], 

  zipfData[aggregate]}, 

 PlotLegends -> {"Group 1 (sigma=0.05)", "Group 2 (sigma=0.20)", 

   "Aggregated"}, AxesLabel -> {"log Rank", "log Pop"}, 

 PlotStyle -> {Automatic, Automatic, {Black, Thick}}, 

 PlotLabel -> "Aggregation of Heterogeneous Cities"]




3. Kesten Processes

Zipf法則自体はもっとシンプルなKesten過程でもいける (Appendix 1).

$$S_{t+1} = \gamma_{t+1} S_{t} + \epsilon_{t+1}.$$

パラメーターの設定

(*gamma は期待値が1に近いがわずかに下回るのが定常性を得る上で重要 *)

gammasigma = 0.1

gammamu = - gammasigma^2/1.25

epsilonConst = 0.01; (*加法的ショック(最小規模を支える)*)

nCities = 1024 (* 都市数 *)

tMax = 4096 (* シミュレーション期間 *)

gammaDist = LogNormalDistribution[gammamu, gammasigma];

Mean@gammaDist (* 期待値0.997004 *)

遷移を定義する:

kestenStep[s_List] := RandomVariate[gammaDist, nCities]*s + epsilonConst

シミュレーションの実行

initialSizes = ConstantArray[1.1, nCities];

SeedRandom["pareto"]

history = NestList[kestenStep, initialSizes, tMax];

finalSizes = Last@history;

finalSizesNorm = finalSizes / Mean@finalSizes;

同様にプロットすると,


毎期epsilonを加えてなめらかにbottomが形成されるので崖はなくなるし,収束も早めだが,上の例はconcaveっぽい感じで係数-1.066ぐらい (SE=.022なので-1は棄却).


Reference

Gabaix, Xavier. "Zipf's law for cities: an explanation." The Quarterly journal of Economics 114.3 (1999): 739-767.

JUE

都市・地域経済学のトップジャーナルであるJUEに論文を掲載していただきました.

Rainald Borck, Jun Oshiro, Yasuhiro Sato,

Property tax competition: A quantitative assessment,

Journal of Urban Economics,

Volume 153, 2026, 103861, 

ISSN 0094-1190,

https://doi.org/10.1016/j.jue.2026.103861.

(https://www.sciencedirect.com/science/article/pii/S009411902600032X)

Abstract: We investigate which of four alternative taxation regimes often used in the public finance literature best approximates actual property taxation in Japan and Germany. To that end, we develop a model of property taxation and characterize equilibria under four alternative regimes: the Benthamite, rent-seeking, land-rent maximization, and tax harmonization regimes. We characterize possible sources of fiscal externalities in each regime. We then quantify the effects of switching from the observed tax system to each of the four regimes in Japan and Germany. We find that the Benthamite or rent-seeking regime best approximates the Japanese system, whereas the tax harmonization regime does so for Germany. We also quantify the welfare effects of switching to the different regimes.

Keywords: Property taxes; Tax competition; Efficiency


Thursday, April 3, 2025

大学のメールアドレスが変わります

 これまでj-oshiro@grsなんちゃらというメールアドレスを利用していましたが,ドメインの頭部分が変わります.

j-oshiro [at] cs.u-ryukyu.ac.jp

となりました.私にメールでご連絡いただける際はよろしくお願いします.grsドメインはしばらくすると使えなくなるようです.

職場が変わったわけではありません (新たに大学院で授業担当教員を務めることにはなりましたが).


Wednesday, April 2, 2025

有人国境離島法に基づく離島振興政策の効果検証

 琉球大学島嶼地域科学研究所の査読誌,Okinawan Journal of Island Studiesで特集号のゲスト・エディタを務めました.その縁で私も1つ書くことになり,実証論文を上梓しました.

Jun Oshiro (2025) "Assessing Development Policies for Inhabited Remote Islands on Borders" Okinawa Journal of Island Studies, 6, 51--79.

エディタの一人といっても,ブラインドの査読を経ての掲載です.

レプリケーション・ファイルは私のサイトにアップしています (元データは除く).


論文の大雑把なまとめ

ざっくりまとめると,有人国境離島法に基づく経済振興策に効果があったか見ました.結果,いい効果があるとは言えない,でした (効果ありと言えるだけの積極的な証拠が現時点ではない).という論文です.以下はその大雑把なまとめ.


背景など

同法は国土保全・安全保障を目的に2017年からスタートしています.

対象となる離島のうち,一部の島は「特定有人国境離島」として経済振興策が採られることとなりました.島により濃淡ありますが,交通費補助や漁業・観光振興などです.

有人国境離島の中で、振興策の有無という2群を比較しました(DID).

有人国境離島 (比較群, 黒字) と特定有人国境離島 (処置群, 赤字) の地理的配置は以下の通りです.

内閣府の資料より.

処置が地理的に固まっている (伊豆諸島を除き,指定地域内に処置群・比較群が混在することがない) のは懸念材料の一つです.あいにく本稿では島間のスピルオーバーには対処していません.

振興あり(SIB)となし(IB, 除く奄美小笠原沖縄)の人口を目で比べると,1島あたり人口のトレンドは平行に推移しているように見えます.処置後も大きく変わらず,この時点で政策効果があったとしても弱そうな予感がします.

Fig 1

目ではなく統計的に政策評価するにあたり,課題はいくつかあります.処置 (特定有人国境離島かどうか) 割付ルールが未公開,島のデータが乏しい,NもTも小さく検出力は限定的,などです.

今回はBorusyak, Jaravel, and Spiess (2024, REStud) のimputationアプローチでDIDして善処しようとしてます (限界はあり).いまどきのDIDはいろいろありますが,処置タイミングは全国一律であり,他のアプローチでもだいたい似た推定結果になりそうでした.

データは日本離島センターの『離島統計年鑑』 (2009--2022年) を利用しました.


結果など

素朴なTWFEによるDIDだと,政策効果は有意に負でした.といっても,厳しい状況の島だから処置がなされるという逆因果が疑われます.

そこで,指定地域レベルの線形トレンドをコントロールし,動学処置効果も許したDIDがメインの特定化です.おおむね有意ではないですが,ネガティブな影響にすら見えることがあります.

ウエイトなしで人口 (対数) への影響を見たのが以下のイベント・スタディ図です.

Fig 2a
事前トレンドも怪しくいまいち解釈が難しいところですが,怪しさについては人口が一定以下の島が影響していることがわかりました.たとえば2015年時点で人口20人以上かどうかで分けると以下の通りです (20人以上が左,20人未満が右).人口が多い場合は事前トレンドは悪くないように見えます.
この図は論文中にありません.

20人以下の島への効果が怪しげな雰囲気を生み出しており,20人以上いる島については比較的効果は小さい (それどころか2019, 2020年は負で有意) ようです.同様の傾向はサンプルを分ける閾値を10人以上, 5人以上などに変えても見られます.
そういうわけで,一定以上の人口規模の島については,国境離島の経済振興政策は人口に対してポジティブな効果を持ったとは言えない,というのが本稿の主要な結論になります.

では人口数十名以下の小さい離島には効果があるのかというと,私はそうとも言えないと思っています.こうした島は,処置前に急速に人口流出しており,処置する頃にはもう動けない人だけ数人残っているような状況のようです.人口下限がバインドするタイミングと処置タイミングがたまたま一致すると,処置が (いわば手遅れなのに) あたかも猛烈にいい効果をもたらした (人口減少を食い止めた) かのように見えてしまうせいだと思われます (下図のイメージ).


観光客数(対数)をアウトカムにした場合も,有意ではないけどネガティブな雰囲気がします.

Fig 3

研究潮流としては,国境離島を舞台にしたplace-based policyの政策評価,という位置づけになると思います.同時に,日本の安全保障政策を考える一つのヒントとなりえる貢献だと考えられます.


本研究は,なぜ・どういった理屈でこれといっていい効果が見えないのか,どうしたらもっと改善できるのか,といったことまでは明らかにできていません.論文中ではいくつかの可能性について議論を足しています.たとえば,PBPがいい効果を持つには,地元行政の政策遂行能力も重要だと思われますが,地方の離島だとそうしたキャパシティが不足している可能性があります.

なお,経済振興策は効果ないから早く止める・縮小すべき,ということまでは言っていません.もし政府が国境離島の振興・無人化阻止にコミットしきれていないことが問題であれば,政府はもっと経済振興策を拡充すべきだという議論をすることは可能だと思います.(私は拡充すべきとも言っていませんのであしからず.) ともあれ,離島の無人化を防ぐコストは現在投じられているコスト・エフォートよりも高い可能性があるとは考えられます.


論文には書いてませんが,消滅しそうな離島を維持する費用 (政策の経費だけでなく) がどれほどかというのは丁寧に検討する必要があると思いました (最適停止問題など).

消滅寸前の僻地に人を非ゼロにとどめる費用はこの研究では明らかにできていません (安全保障上の便益はいっそう定量化困難と思われますが).


国交省や内閣府の担当部署にインタビューにでも行けばよかったのでしょうけど,乳幼児複数の面倒を見ている中で出張は困難でした.そのうち機会があれば知らない島や行政にアクセスしてみたいと思います.

    
Reference
Borusyak, Kirill, Xavier Jaravel, and Jann Spiess. "Revisiting event-study designs: robust and efficient estimation." Review of Economic Studies 91.6 (2024): 3253-3285.

Wednesday, January 31, 2024

ReplacePartの中身, Mathematica

 Mathematicaで以前からこれが遅くなる原因ではないか…と思っていた部分を検証したのでメモ.

概要

Mathematicaの代入

expr /. {replace1 -> value1, replace2 -> value2, ...}

は,代入されるもの・代入するものが多いと遅くなる (vectorizationできるならすべき).

これの類推で,expr (ここでは行列) の一部を書き換える関数ReplacePart

    ReplacePart[expr, {{i1,j1} -> value1, {i2,j2} -> value2, ...}]

Tableを用いて

    ReplacePart[expr, Table[position[[i]] -> value[[i]], {i, Length@position}]]

のように書くのは遅くなる原因なのだろうか (7年ぐらい前に書いたコードはこれ).

MapThreadを使うとベクトルをベクトル表記のまま同じことができる:

    ReplacePart[expr, MapThread[Rule, {position, value}]]

ので,Tableを使う場合とMapThreadを使う場合で差が出るか見てみた.

結果

MapThreadのほうが1割ぐらい速かった.実行環境はやや古いiMacのMathematica14.0.0.

コード

以下コード.

pattern01[nrow_, ncol_, nreplace_, nDo_] := 

 Module[{timebegin, mat, replacePosition, newValue},

  (* record computational time *)

  timebegin = SessionTime[] ;

  (*"set seed"*)

  ParallelEvaluate[SeedRandom[1]] (* enable to be replicated *);

  Do[

   (* a matrix that I want replace with newValue *)

   mat = RandomReal[1, {nrow, ncol}];

   (* positions of mat to be replaced. 

   the number of replace is at most nreplace. *)

   replacePosition = 

    DeleteDuplicates@

     Transpose@{RandomInteger[{1, nrow}, nreplace], 

       RandomInteger[{1, ncol}, nreplace]};

   (* new values (taking Exp is optional) *)

   newValue = Exp@RandomReal[1, Length@replacePosition];(* 

   replacepart with Table *)

   mat = 

    ReplacePart[mat, 

     Table[replacePosition[[i]] -> newValue[[i]], {i, 

       Length@replacePosition}] ];,

   nDo] (* end of Do *);

   Print[ToString@(SessionTime[] - timebegin) <> " sec"];

  Return@DateString[]

  ]


pattern02[nrow_, ncol_, nreplace_, nDo_] := 

 Module[{timebegin, mat, replacePosition, newValue},

  (* record computational time *)

  timebegin = SessionTime[] ;

  (*"set seed"*)

  ParallelEvaluate[SeedRandom[1]] (* enable to be replicated *);

  Do[

   (* a matrix that I want replace with newValue *)

   mat = RandomReal[1, {nrow, ncol}];

   (* positions of mat to be replaced. 

   the number of replace is at most nreplace. *)

   replacePosition = 

    DeleteDuplicates@

     Transpose@{RandomInteger[{1, nrow}, nreplace], 

       RandomInteger[{1, ncol}, nreplace]};

   (* new values (taking Exp is optional) *)

   newValue = Exp@RandomReal[1, Length@replacePosition];(* 

   replacepart with MapThread *)

   mat = 

    ReplacePart[mat, MapThread[Rule, {replacePosition, newValue}] ];,

   nDo] (* end of Do *);

   Print[ToString@(SessionTime[] - timebegin) <> " sec"];

  Return@DateString[]

  ]

 

"Parallel Karnels" (* 使ってないけど *)

LaunchKernels[];

"run (execution requires about 20min)"

 (* 16384x128行列のうち最大1024箇所を書き換える,を65536回実行 *) 

pattern01[2^14, 2^7, 2^10, 2^16] 

(* 1420 sec *)

pattern02[2^14, 2^7, 2^10, 2^16] 

(* 1318 sec *)


その他

Parallelize@ReplacePartのようにして並列化はできなさそう.

Monday, January 16, 2023

安里・志賀『なぜ基地と貧困は沖縄に集中するのか?』

スキマ時間にちらっとめくったのでメモ.といっても,正直読むに耐えないのでちゃんと読んでません.

安里長従, 志賀信夫 (2022) 『なぜ基地と貧困は沖縄に集中するのか?: 本土優先、沖縄劣後の構造』

  • (構造的)差別の定義が変?
    • 差別とはAだ,そしてAの原因は差別だ,と結論を定義しているに近い議論に見えた (ちゃんと読めば違うかも).
    • 差別とはあってはならないこととのことだが,その「あってはならない」かどうかを誰がどういった基準で判断するのかが不明.
      • 差別に限らず,他の要因が潜在的にあってもその可能性を潰すことなく自説を都合よく当てはめるようなところが目立ち,読者は置いてけぼり.
    • 人に対する差別と地域に対する差別は分けて議論したほうがよかったのではないか.
  • 知的誠実性に疑問.
    • 学者らしき人に,あなたの言うことは間違っているとやんわり指摘されたっぽい下りがあるが,それを真摯に受け止め検討した形跡がどこにもない.
    • 他にも強い違和感のある記述があったがどれだったか忘れてしまった.
  • 経済学的な議論では,根拠が薄弱?
    • (マル経しか知らなさそうな) 素人相手に目くじらを立てるのもなんだけど,経済学っぽいトピックの箇所はほとんどの場合根拠が書かれていない・論証不足・関連するliteratureの無知,と感じた.
      • 県民のwelfareが目的になっていないのが悪い,というものの,そんなのどこの地方自治体だってそんなもんであろうし,仮にbenevolentであっても筆者の望む帰結・政策につながる必然性はないのでは…など.
      • 経済学を箔付けのためには使わないでほしい (アマルティア・センと言ってみたかっただけじゃないか? など).
    • 素人という点では,全体的に文章構成が稚拙で話が見えないので読むのが苦痛.

樋口にムカついているというのは伝わってくる (それはわかる) が,説得力という面では五十歩百歩ではないかと思った.

Friday, November 25, 2022

沖縄経済史本の改訂版が出ます

『沖縄経済と業界発展』が売れ行き好調につき,第2版が若干の改訂を加えて出版されることになりました.ありがとうございます.

過去のブログ記事: 『沖縄経済と業界発展 ー歴史と展望ー』

ISBNが新しくなり,

978-4-906-68919-4

となっています.


私の担当箇所の差分は以下のようにマイナーなものです:

  • 初版で書いた部分は一切変更していません.
    • 加筆修正したい気持ちはありますが,それは別の機会にしたいと思います.
  • 2版では,初版では抜けていた,復帰後の議論を追記しています (60--62ページ).
    • これといって学術的新規性のある内容ではありません.
私の担当箇所以外でも,ところどころ追記やデータの更新が行われています.
もし初版を持っていないのであれば,改訂版をお買い求めいただければと思います.
12月には県内書店に,もう少し経つととAmazon.co.jpなどでも購入できるようになろうかと思います (電子では出ないと思われます).