我不关心Inceptionfda
的使用,例如list- in -list-in-list对象结构,但是我的回答将遵守软件包编写者创建的系统。
我认为首先考虑我们正在做的事情是有启发性的。根据您到目前为止所做的描述,这就是我认为您正在做的事情(如果我误解了某些内容,请告诉我)。我将继续使用表示法,由于缺乏实际数据,我将举Ramsay和Silverman的功能数据分析以及Ramsay,Hooker和Graves的R和MATLAB的功能数据分析为例 (以下一些方程和代码被直接取消了)从这些书中)。
我们正在通过功能线性模型来建模标量响应,即
ÿ一世= β0+ ∫Ť0X一世(小号)β(小号)ds + ϵ一世
我们会在一定程度上扩展。我们使用基函数。所以,ķβķ
β(小号)= Σk = 1ķbķθķ(小号)
用矩阵表示法是。β(s )= θ′(s )b
我们也在某些基础上扩展协变量函数(例如基础函数)。所以,大号
X一世(小号)= Σk = 1大号C我ķψķ(小号)
同样,在矩阵符号中,这是。X(小号)= c ^ ψ (小号)
因此,如果我们让,我们的模型可以表示为J =∫ψ (s )θ′(小号)ds
ÿ= β0+ C J b。
如果让和,则我们的模型是ξ = [ β 0Z = [ 1CJ]ξ=[β0b′]′
y=Zξ
对我们来说,这看起来更加熟悉。
现在,我看到您正在添加某种正则化。该fda
包装适用以下形式的粗糙度惩罚
P=λ∫[Lβ(s)]2ds
对于一些线性微分算。现在可以显示出(如果没有详细说明,这很难显示),如果我们将惩罚矩阵为[R大号[R
[R =λ ⎛⎝⎜⎜⎜⎜⎜00⋮00[R1个⋮0⋯⋯⋱⋯00⋮[Rķ⎞⎠⎟⎟⎟⎟⎟
其中是的基数展开,然后我们将平方的罚和最小化:β 我[R一世β一世
(ÿ - Ž ξ )′(ÿ - Ž ξ ) + λ ξ′[R ξ,
所以我们的问题仅仅是解决方案的岭回归:
ξ^= (Z′ž +λ - [R )− 1ž′ÿ。
我仔细阅读了以上内容,是因为(1)我认为了解我们正在做的事情很重要,并且(2)以上某些内容对于理解以后将要使用的某些代码是必需的。转到代码...
这是带有R代码的数据示例。我正在使用fda
包装中提供的加拿大天气数据集。我们将通过功能线性模型对多个气象站的对数年降水量进行建模,并将每个气象站的温度曲线(每天一次记录一次,连续365天记录温度)作为函数协变量。我们将按照您对情况的描述进行类似的处理。数据记录在35个站点。我将数据集划分为34个站(将用作我的数据)和最后一个站(将作为我的“新”数据集)。
我将继续使用R代码和注释(我假设您对fda
软件包足够熟悉,因此以下内容都不令人感到惊讶-如果不是这种情况,请告诉我):
# pick out data and 'new data'
dailydat <- daily$precav[,2:35]
dailytemp <- daily$tempav[,2:35]
dailydatNew <- daily$precav[,1]
dailytempNew <- daily$tempav[,1]
# set up response variable
annualprec <- log10(apply(dailydat,2,sum))
# create basis objects for and smooth covariate functions
tempbasis <- create.fourier.basis(c(0,365),65)
tempSmooth <- smooth.basis(day.5,dailytemp,tempbasis)
tempfd <- tempSmooth$fd
# create design matrix object
templist <- vector("list",2)
templist[[1]] <- rep(1,34)
templist[[2]] <- tempfd
# create constant basis (for intercept) and
# fourier basis objects for remaining betas
conbasis <- create.constant.basis(c(0,365))
betabasis <- create.fourier.basis(c(0,365),35)
betalist <- vector("list",2)
betalist[[1]] <- conbasis
betalist[[2]] <- betabasis
# set roughness penalty for betas
Lcoef <- c(0,(2*pi/365)^2,0)
harmaccelLfd <- vec2Lfd(Lcoef, c(0,365))
lambda <- 10^12.5
betafdPar <- fdPar(betabasis, harmaccelLfd, lambda)
betalist[[2]] <- betafdPar
# regress
annPrecTemp <- fRegress(annualprec, templist, betalist)
现在,大约一年前,当我第一次被告知有关功能数据时,我就试用了这个软件包。我也无法predict.fRegress
给我想要的东西。现在回头看,我仍然不知道如何使其表现出来。因此,我们只需要半手动获得预测即可。我将使用直接从代码中提取的片段fRegress()
。同样,我继续通过代码和注释。
首先,设置:
# create basis objects for and smooth covariate functions for new data
tempSmoothNew <- smooth.basis(day.5,dailytempNew,tempbasis)
tempfdNew <- tempSmoothNew$fd
# create design matrix object for new data
templistNew <- vector("list",2)
templistNew[[1]] <- rep(1,1)
templistNew[[2]] <- tempfdNew
# convert the intercept into an fd object
onebasis <- create.constant.basis(c(0,365))
templistNew[[1]] <- fd(matrix(templistNew[[1]],1,1), onebasis)
现在获取预测
ÿ^ñ Ë W ^= Zñ Ë W ^ξ^
我只fRegress
使用用于yhatfdobj
略微计算和编辑它的代码。 fRegress
计算yhatfdobj
通过估计积分通过梯形规则(具有和在其各自的基座展开)。 X 我 β∫Ť0X一世(小号)β(小号)X一世β
通常,fRegress
通过遍历存储在中的协变量来计算拟合值annPrecTemp$xfdlist
。因此,对于我们的问题,我们用新的协变量列表中的对应变量替换了该协变量列表templistNew
。这是代码(fRegress
与两次编辑中发现的代码相同,删除了不需要的代码,并添加了一些注释):
# set up yhat matrix (in our case it's 1x1)
yhatmat <- matrix(0,1,1)
# loop through covariates
p <- length(templistNew)
for(j in 1:p){
xfdj <- templistNew[[j]]
xbasis <- xfdj$basis
xnbasis <- xbasis$nbasis
xrng <- xbasis$rangeval
nfine <- max(501,10*xnbasis+1)
tfine <- seq(xrng[1], xrng[2], len=nfine)
deltat <- tfine[2]-tfine[1]
xmat <- eval.fd(tfine, xfdj)
betafdParj <- annPrecTemp$betaestlist[[j]]
betafdj <- betafdParj$fd
betamat <- eval.fd(tfine, betafdj)
# estimate int(x*beta) via trapezoid rule
fitj <- deltat*(crossprod(xmat,betamat) -
0.5*(outer(xmat[1,],betamat[1,]) +
outer(xmat[nfine,],betamat[nfine,])))
yhatmat <- yhatmat + fitj
}
(注意:如果您在中查看此块和周围的代码fRegress
,您将看到我上面概述的步骤)。
我通过使用所有35个站点作为我们的数据重新运行天气示例来测试代码,并将上述循环的输出与进行比较,annPrecTemp$yhatfdobj
然后一切都匹配了。我还使用不同的站点作为“新”数据运行了几次,一切似乎都很合理。
让我知道以上任何不清楚的地方,或者是否有任何不正常的工作。抱歉,回复过于详细。我帮不上忙:)如果您还不拥有它们,请查看我用来撰写此回复的两本书。他们真的是好书。