Basicamente, tudo o que quero fazer é prever uma resposta escalar usando algumas curvas. Eu tenho tanto quanto fazer uma regressão (usando fRegress do pacote fda), mas não tenho idéia de como aplicar os resultados a um novo conjunto de curvas (para previsão).
Eu tenho N = 536 curvas e 536 respostas escalares. Aqui está o que eu fiz até agora:
- Eu criei uma base para as curvas.
- Eu criei um objeto fdPar para introduzir uma penalidade
- Eu criei o objeto fd usando smooth.basis para suavizar as curvas com a penalidade escolhida na base especificada.
- Fiz uma regressão usando fRegress (), regredindo as curvas na resposta escalar.
Agora, tudo que eu gostaria de fazer é usar essa regressão para produzir previsões para um novo conjunto de dados que eu tenho. Não consigo encontrar uma maneira fácil de fazer isso.
Felicidades
predict.fRegress
anewdata
opção (no manual da fda aqui )?fda
pacote. Eu estava escrevendo uma resposta que envolvia obter previsões manualmente, mas uma grande parte dela foi perdida por não salvá-la. Se alguém não me derrotar, eu devo ter uma solução para você em alguns dias.Respostas:
Eu não ligo para o
fda
uso 's de Inception -como estruturas de objetos lista-dentro-de-lista-dentro-lista, mas a minha resposta vai respeitar o sistema os escritores pacote criaram.Acho instrutivo pensar primeiro no que estamos fazendo exatamente. Com base na sua descrição do que você fez até agora, é isso que acredito que esteja fazendo (deixe-me saber se interpretei algo errado). Continuarei usando a notação e, devido à falta de dados reais, um exemplo da Análise de Dados Funcionais de Ramsay e Silverman e Análise de Dados Funcionais de Ramsay, Hooker e Graves com R e MATLAB (Algumas das equações e códigos a seguir são levantados diretamente desses livros).
Estamos modelando uma resposta escalar por meio de um modelo linear funcional, ou seja,
Expandimos o de alguma forma. Usamos, digamos, funções básicas. Então,Kβ K
Na notação matricial, isso é .β(s)=θ′(s)b
Também expandimos as funções covariáveis de alguma maneira (digamos , funções básicas de ). Então,L
Novamente, na notação matricial, esse é .X(s)=Cψ(s)
E assim, se permitirmos , nosso modelo poderá ser expresso comoJ=∫ψ(s)θ′(s)ds
E se permitirmos e , nosso modelo éZ=[1CJ] ξ=[β0b′]′
E isso parece muito mais familiar para nós.
Agora vejo que você está adicionando algum tipo de regularização. O
fda
pacote funciona com penalidades de rugosidade do formuláriopara alguns operador diferencial linear . Agora pode ser mostrado (detalhes deixados aqui - não é realmente difícil mostrar isso) que se definirmos a matriz de penalidade comoL R
onde é em termos da expansão de , minimizamos a soma penalizada dos quadrados:Ri βi
e, portanto, nosso problema é apenas uma regressão de crista com solução:
Eu caminhei pelo exposto porque, (1) acho que é importante entendermos o que estamos fazendo e (2) alguns dos itens acima são necessários para entender parte do código que usarei mais tarde. Para o código ...
Aqui está um exemplo de dados com código R. Estou usando o conjunto de dados climáticos canadense fornecido no
fda
pacote. Modelaremos a precipitação anual de log para várias estações meteorológicas por meio de um modelo linear funcional e usaremos perfis de temperatura (as temperaturas foram registradas uma vez por dia durante 365 dias) de cada estação como covariáveis funcionais. Vamos proceder da mesma forma que você descreve em sua situação. Os dados foram gravados em 35 estações. Dividirei o conjunto de dados em 34 estações, que serão usadas como meus dados, e a última estação, que será meu "novo" conjunto de dados.Continuo via código R e comentários (presumo que você esteja familiarizado o suficiente com o
fda
pacote, de modo que nada a seguir seja muito surpreendente - se esse não for o caso, informe-me):Agora, quando eu fui ensinado sobre dados funcionais há mais ou menos um ano, brinquei com este pacote. Também não consegui
predict.fRegress
me dar o que queria. Olhando para trás agora, ainda não sei como fazê-lo se comportar. Portanto, teremos que obter as previsões semi-manualmente. Vou usar peças que extraí direto do códigofRegress()
. Novamente, continuo via código e comentários.Primeiro, a configuração:
Agora, para obter as previsões
Eu apenas pego o código que∫T0Xi(s)β(s) Xi β
fRegress
usa para calcularyhatfdobj
e editar um pouco.fRegress
calculayhatfdobj
estimando a integral através da regra trapezoidal (com e expandidos em suas respectivas bases).Normalmente,
fRegress
calcula os valores ajustados percorrendo as covariáveis armazenadas emannPrecTemp$xfdlist
. Portanto, para o nosso problema, substituímos essa lista covariável pela correspondente em nossa nova lista covariável, ou sejatemplistNew
,. Aqui está o código (idêntico ao encontrado emfRegress
duas edições, algumas exclusões de código desnecessário e alguns comentários adicionados):(observação: se você olhar para este bloco e o código ao redor
fRegress
, verá as etapas descritas acima).Testei o código reexecutando o exemplo climático usando todas as 35 estações como nossos dados e comparando a saída do loop acima
annPrecTemp$yhatfdobj
e tudo corresponde. Também executei algumas vezes usando estações diferentes como meus "novos" dados e tudo parece razoável.Deixe-me saber se alguma das opções acima não está clara ou se algo não está funcionando corretamente. Desculpe pela resposta excessivamente detalhada. Eu não pude evitar :) E se você ainda não os possui, confira os dois livros que eu escrevi para esta resposta. São livros realmente bons.
fonte
nfine
e ver o quanto a integral muda, mas acho que não fará muito. Quanto à penalização, sim, estamos penalizando diretamente os em vez de neste caso. Ramsay e Silverman discutem outro método de penalidade que estima sem funções básicas em que aplicamos a penalidade diretamente em . Ambas as formas estão induzindo uma restrição de suavidade nas funções , mas não tenho certeza se você obterá o 'mesmo efeito'.