Guest User

Untitled

a guest
Oct 15th, 2018
195
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.95 KB | None | 0 0
  1. using Distributions
  2. using LinearAlgebra
  3. using Optim
  4. using Statistics
  5. using DataFrames
  6. using CSVFiles
  7. using FastGaussQuadrature
  8. using NLSolversBase
  9.  
  10. df = load("fake_data.csv") |> DataFrame
  11. T = convert(Int64,maximum(df.age[df[:caseid] .== 1, :]) - minimum(df.age[df[:caseid] .== 1, :]) + 1)
  12. Ni = convert(Int64,maximum(df.caseid))
  13.  
  14. #create choice specific dataframes, with its own unique individual caseid from 1 to Ni0
  15. df0 = df[df.school .== 0,:]
  16. sort!(df0, (:t, :caseid))
  17. df0.caseid = repeat(1:size(df0[df0.t .== 1,:].caseid)[1],T)
  18. sort!(df0, (:caseid, :t))
  19.  
  20. df1 = df[df.school .== 1,:]
  21. sort!(df1, (:t, :caseid))
  22. df1.caseid = repeat(1:size(df1[df1.t .== 1,:].caseid)[1],T)
  23. sort!(df1, (:caseid, :t))
  24.  
  25.  
  26. #selection equation sum of X variables across t=1:T
  27. Xs = by(df, :caseid) do x
  28. DataFrame(xsa = sum(x.xa), xsb = sum(x.xb), xsb2 = sum(x.xb2), xsbc = sum(x.xbc), xsbc2 = sum(x.xbc2), xsc = sum(x.xc), za = mean(x.za), zb = mean(x.zb), school = mean(x.school))
  29. end
  30.  
  31. #Number of unique individuals in each choice dataframe
  32. Ni0 = convert(Int64,maximum(df0.caseid))
  33. Ni1 = convert(Int64,maximum(df1.caseid))
  34.  
  35. constants = [T, Ni, Ni0, Ni1]
  36.  
  37.  
  38. include("MLE_function.jl")
  39.  
  40. #just guess actual parameters
  41. β0 = [1., 2., -0.01, 0.5]
  42. β1 = [.85, 3.4, -0.03, 1.]
  43. σ0 = repeat([log(sqrt(0.1))], T)
  44. σ1 = repeat([log(sqrt(0.1))],T)
  45. σw = 1.
  46. σt = log(sqrt(.4))
  47. δz = [4., 1.1]
  48. δt = 0.1
  49. ρ = 0.9
  50.  
  51. theta = vcat(β0, β1, δz, δt, ρ, σ0, σ1, σw, σt)
  52.  
  53. #define nodes and weights of gauss hermite
  54. nnodes = 20
  55. nodes, weights = gausshermite(nnodes)
  56. quad = [nnodes, nodes, weights]
  57.  
  58. function wrapmle1(theta)
  59. return mle1(theta, df0, df1, Xs, quad, constants)
  60. end
  61.  
  62. #check that function works
  63. @time wrapmle1(theta)
  64.  
  65. #fails
  66. func = TwiceDifferentiable(wrapmle1, theta; autodiff = :forward)
  67. @time mini1 = optimize(func, theta, BFGS(), Optim.Options(show_trace=true))
  68.  
  69. #goes through
  70. func = TwiceDifferentiable(wrapmle1, theta; autodiff = :finite)
  71. @time mini1 = optimize(func, theta, BFGS(), Optim.Options(show_trace=true))
Add Comment
Please, Sign In to add comment