作者ru486good (金仔)
看板NCCU09_STGRA
标题[统模] 第四题
时间Wed May 5 00:43:40 2010
老师说资料只要用0~99岁就好了唷!!
题目没有说
但是这题是要用SVD和PCA去配适Lee-Carter模型
alpha(x)用每个年龄的平均死亡率即可
原始资料 扣掉 alpha(x)之後即可进行拆解
由於维度的问题 用SVD的时候要先转置
PCA的话
对原始资料 扣掉 alpha(x)之後的correlation matirx拆解
Loading是beta(x)
Score是k(t)
#########程式码 有需要可以参考看看#####
###SVD 1970~2000男性
#ux是(年龄x年份)的死亡率矩阵
y=t(ux)
logy=log(y) #log死亡率
ax=apply(logy,2,mean) #alpha x
ax1=matrix(ax,ncol=ncol(y),nrow=nrow(y),byrow=T) #各年龄中央死亡率matrix
y1=logy-ax1 #ln(mxt) - ax
a1=svd(y1) #SVD分解
kt = a1$u[,1]*a1$d[1] #kt:time component,只取第一个singular
value
bx = a1$v[,1] #beta x: age component
b2 = kt%*%t(bx) #ln(mxt) - ax
mx = b2+ax1 #修匀的死亡率(log scale):ln(mxt)
#预测2001~2008
x = c(1970:2000)
fit = lm(kt~x)
diff.svd = NULL
real = data[,32:39]
for(i in 1:8){
ktt = predict(fit,data.frame(x=2000+i))
u = ax+bx*ktt
diff.svd = cbind(diff.svd,(exp(u)-real[,i])/real[,i])
}
###PCA
R = cor(y1) #t(A) A = t(A) bx kt = P V t(P)
P = eigen(R)$vectors
V = eigen(R)$values #ln(mxt) - ax = e1*(lamda1)
PC = P[,1] #第一主成分
Bx = PC*sqrt(V[1]) #第一主成分*sqrt(第一特徵值)
Kt = as.vector(PC%*%t(y1)/sqrt(V[1])) #第一主成分得点/sqrt(第一特徵值)
Mx = Kt%*%t(Bx)+ax1
##预测2001~2008
Fit = lm(Kt~x)
diff.pca = NULL
for(i in 1:8){
ktt = predict(Fit,data.frame(x=2000+i))
u = ax+Bx*ktt
diff.pca = cbind(diff.pca,(exp(u)-real[,i])/real[,i])
}
##
ts.plot(apply(diff.svd,1,mean)/ apply(diff.pca,1,mean),
main='虚线以上PCA较佳,以下SVD较佳',xlab='年龄',ylab=' SVD 的 Bias / PCA 的
Bias')
abline(h = 1,lty=2)
sum(diff.svd^2) ; sum(diff.pca^2)
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.202.222
1F:推 hidog88s:PCA 可以改用 covariance matrix 试试。 05/05 01:44