16. サイバー系
(参考)JuliaのGLM_1
#リンク関数のところ(ロジット関数のみ)
type Link
name::String # name of the link
linkFun::Function # link function mu -> eta
linkInv::Function # inverse link eta -> mu
muEta::Function # derivative eta -> d mu/d eta
end
logitLink =
Link("logit",
mu -> log(mu ./ (1. - mu)),
eta -> 1. ./ (1. + exp(-eta)),
eta -> (e = exp(-abs(eta)); f = 1. + e; e ./ (f .* f)))
#ちょっと関数定義
function logN0(x)
ret = [x]
ret[ret .> 0] = log(ret[ret .> 0])
ret
end
y_log_y(y, mu) = y .* logN0(y ./ mu)
2012/12/01 15
17. サイバー系
(参考)JuliaのGLM_2
#分布のところ(二項分布のみ)
type Dist
name::String # the name of the distribution
canonical::Link # the canonical link for the distribution
variance::Function # variance function mu -> var
devResid::Function # vector of squared deviance residuals
deviance::Function # the scalar deviance
mustart::Function # derive a starting estimate for mu
end
BinomialDist =
Dist(“Binomial",
logitLink,
mu -> max(eps(Float64), mu .* (1. - mu)),
(y, mu, wt)-> 2 * wt .* (y_log_y(y, mu) + y_log_y(1. - y, 1. - mu)),
(y, mu, wt)-> -2. * sum(y .* log(mu) + (1. - y) .* log(1. - mu)),
(y, wt)-> (wt .* y + 0.5) ./ (wt + 1.)
2012/12/01 16
18. サイバー系
(参考)JuliaのGLM_3
#glmFit関数
function glmFit(y::Vector{Float64}, X::Matrix{Float64}, dist::Dist, epsilon::Float64,
maxit::Int32)
offset = float64(fill(0, length(y)));
weights = float64(fill(1, length(y)));
mustart = ((weights .* y) + 0.5) ./ (weights + 1)
eta = dist.canonical.linkFun(mustart)
mu = dist.canonical.linkInv(eta)
(m, n) = size(X);
devold = sum(dist.devResid(y, mu, weights))
coef = 1; beta = 1; Q =1; R = 1; w = 1; QRd = 1
Qr = zeros(n,n)
pvalue = float64(fill(1, n));
for iter=1:maxit
muEtaVal = dist.canonical.muEta(eta)
z = (eta-offset) + (y - mu) ./ muEtaVal
w = sqrt((weights .* muEtaVal.^2) ./ dist.variance(mu))
(Q, R) = qr(diagmm(w, X));
R1 = R[1:n, 1:n]; Q1 = Q[:, 1:n];
beta = R1 ¥ (Q1' * (w .* z))
eta = X * beta
mu = dist.canonical.linkInv(eta)
dev = sum(dist.devResid(y, mu, weights))
2012/12/01 17
19. サイバー系
(参考)JuliaのGLM_4
#glmFit関数の続き
if (abs(dev-devold)/(0.1+abs(dev)) < epsilon)
coef = beta
break
else
devold = dev
coef=beta
end
end
for i=1:n
for j=1:n
if(R[i,j]==0)
Qr[i,j]=Q[i,j]
else
Qr[i,j]=R[i,j]
end
end
end
2012/12/01 18