我正在尝试在Julia中实施这个简单的计量经济学/统计学练习。我之前从未使用过Julia,而且我已经在R中完成了这个代码,但我似乎无法翻译代码。
这是大纲:我有一个内环,对于固定的N,我从分布中绘制K个样本,然后将它们存储在N×K的矩阵中。我为两个矩阵执行此操作,它们将每个矩阵相乘每个矩阵的列(获得2×1矢量)它们并存储在2×K矩阵中。
之后,我做了一个外部循环,比如5个不同的N值。最后,我希望有5个不同的矩阵,即2 x K,这样我就可以绘制它们。我无法弄清楚的是如何有效地存储这个矩阵。在R中,我只是将它们放在一个列表中,并将它们分别称为计算。
using Distributions
using StatsBase
J = 500
N = [10 100 500 1000 10000]
i = 1
b = ones(3,J)
for n in N
x = ones(n,J)
e = ones(n,J)
y = ones(n,J)
for j = 1:J
x[:,j] = rand(Normal(3,1),n)
y[:,j] = 3 + 2.5*x[:,j] + e[:,j]
x = [y[:,j] x[:,j]]
b[:,j] = inv(y'*x)*(x'*y[:,j])
end
i = i + 1
i
end
我已尝试使用此代码,但它似乎根本不起作用。我甚至无法将这个简单的循环用于下面的工作:
for i = 1:10
x = ones(i, 10)
end
我得到ERROR: UndefVarError: x not defined
。你能帮助我吗?
答案 0 :(得分:3)
你只需将它们放在Vector{Matrix}
矩阵向量中。
但朱莉娅的一个常见范例是改为定义一个能够做你想要的函数f
,然后在N上广播该函数,即通过调用a = f.(N)
(N应该是一个Vector,而不是一个矩阵) ,BTW,数字之间的逗号,而不是空格。)
所以,假设你要存储5个不同K的2 x K矩阵。实际上有很多方法可以做到这一点,这取决于品味,风格,便利性等。以下是一些例子,其中k变化从20到24:
# a python-style list comprehension
mymatrices = [randn(K,2) for K in 20:24]
# a function broadcast over the array
f(k) = randn(k,2)
mymatrices = f.(20:24)
# a Vector with preallocated elements
mymatrices = Vector{Matrix{Float64}}(5)
for (i, k) in enumerate(20:24) #enumerate is smart
mymatrices[i] = randn(k, 2)
end
# a Vector that grows dynamically
mymatrices = Matrix{Float64}[] # shorter optional syntax for an empty vector
for (i, k) in enumerate(20:24)
push!(mymatrices, randn(k, 2))
end
# map with an anonymous function
mymatrices = map(k -> randn(k,2), 20:24)
答案 1 :(得分:2)
所以在你们的帮助和更多googleing之后,我想出了这个有效的代码。不确定这是否违反了StackOverflow的目的,但我发布了我的答案。如果你们有时间,请批评,看起来有点过于冗长,我确信有更有效的方法来做到这一点。
using Distributions
N = [10, 100, 500, 1000, 10000]
J = 500
bet = Vector{Matrix{Float64}}()
for n in N
b = Array{Float64, 2}(3, J)
for j = 1:J
x1 = Array{Float64, 2}(n,J)
x2 = Array{Float64, 2}(n,J)
epsilon = Array{Float64, 2}(n,J)
y = Array{Float64, 2}(n,J)
cons = ones(n)
x1[:,j] = rand(Normal(3,1),n)
x2[:,j] = rand(Normal(-1,1),n)
epsilon[:,j] = rand(Normal(0,1),n)
y[:,j] = 3 + 2.5*x1[:,j] + 4*x2[:,j] + epsilon[:,j]
x = [cons x1[:,j] x2[:,j]]
b[:,j] = inv(x'*x)*(x'*y[:,j])
end
push!(bet, b)
end
答案 2 :(得分:1)
循环工作正常,x
在内部设置正确,但是一旦循环结束,x
超出范围,因此未定义。
julia> for i = 1:10
x = ones(i, 10)
end
julia> x
ERROR: UndefVarError: x not defined
如果您先创建它:
julia> x = Array{Float64}(10, 10);
julia> for i = 1:10
x = ones(i, 10)
end
julia> x
10×10 Array{Float64,2}:
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0
然后它仍然在范围内。