usando informações de vizinhos em dados de imputação ou localizando dados externos (em R)

13

Eu tenho um conjunto de dados supondo que os vizinhos mais próximos são os melhores preditores. Apenas um exemplo perfeito de gradiente bidirecional visualizado-

insira a descrição da imagem aqui

Suponha que tenhamos um caso em que faltam poucos valores, podemos prever facilmente com base em vizinhos e tendências.

insira a descrição da imagem aqui

Matriz de dados correspondente em R (exemplo fictício para treino):

miss.mat <- matrix (c(5:11, 6:10, NA,12, 7:13, 8:14, 9:12, NA, 14:15, 10:16),ncol=7, byrow = TRUE)
miss.mat 
    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    5    6    7    8    9   10   11
[2,]    6    7    8    9   10   NA   12
[3,]    7    8    9   10   11   12   13
[4,]    8    9   10   11   12   13   14
[5,]    9   10   11   12   NA   14   15
[6,]   10   11   12   13   14   15   16

Notas: (1) A propriedade de valores ausentes é assumida como aleatória , isso pode acontecer em qualquer lugar.

(2) Todos os pontos de dados são de variável única, mas seu valor é considerado influenciado pela neighborslinha e coluna adjacentes a eles. Portanto, a posição na matriz é importante e pode ser considerada como outra variável.

Minha esperança em algumas situações é de prever alguns valores fora do normal (pode haver erros) e corrigir o viés (apenas exemplo, vamos gerar esse erro nos dados fictícios):

> mat2 <- matrix (c(4:10, 5, 16, 7, 11, 9:11, 6:12, 7:13, 8:14, 9:13, 4,15, 10:11, 2, 13:16),ncol=7, byrow = TRUE)
> mat2

    [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    4    5    6    7    8    9   10
[2,]    5   16    7   11    9   10   11
[3,]    6    7    8    9   10   11   12
[4,]    7    8    9   10   11   12   13
[5,]    8    9   10   11   12   13   14
[6,]    9   10   11   12   13    4   15
[7,]   10   11    2   13   14   15   16

Os exemplos acima são apenas ilustrativos (podem ser respondidos visualmente), mas o exemplo real pode ser mais confuso. Estou procurando se existe um método robusto para fazer essa análise. Eu acho que isso deveria ser possível. Qual seria o método adequado para realizar esse tipo de análise? alguma sugestão de programa / pacote R para fazer esse tipo de análise?

insira a descrição da imagem aqui

rdorlearn
fonte
Você pode assumir que os dados ausentes são MAR (na terminologia de Rubin (1976))?
User603 28/05
sim, os valores podem ser assumidos como ausentes aleatoriamente (MAR). Veja minhas edições recentes.
Rdorlearn

Respostas:

7

A questão pede maneiras de usar vizinhos mais próximos em uma robusta forma de identificar e valores atípicos localizados corretos. Por que não fazer exatamente isso?

O procedimento é calcular um bom local robusto, avaliar os resíduos e zerar qualquer que seja muito grande. Isso satisfaz todos os requisitos diretamente e é flexível o suficiente para se ajustar a diferentes aplicativos, porque é possível variar o tamanho da vizinhança local e o limite para a identificação de valores extremos.

(Por que a flexibilidade é tão importante? Como qualquer procedimento desse tipo tem uma boa chance de identificar certos comportamentos localizados como sendo "periféricos". Como tal, todos esses procedimentos podem ser considerados " smoothers" . Eles eliminam alguns detalhes juntamente com os aparentemente estranhos. precisa de algum controle sobre o compromisso entre reter os detalhes e não detectar os outliers locais.)

Outra vantagem desse procedimento é que ele não requer uma matriz retangular de valores. De fato, ele pode ser aplicado a dados irregulares usando um local mais adequado para esses dados.

R, assim como a maioria dos pacotes de estatísticas com todos os recursos, possui vários smoothers locais robustos incorporados, como loess. O exemplo a seguir foi processado usando-o. A matriz possui linhas e 49 colunas - quase 4000 entradas. Representa uma função complicada com vários extremos locais, bem como uma linha inteira de pontos onde não é diferenciável (um "vinco"). Para um pouco mais do que 5 % dos pontos - uma proporção muito elevada para ser considerada "periféricas" - foram adicionados erros Gaussianas cujo desvio padrão é de apenas 1 / 20 do desvio padrão dos dados originais. Este conjunto de dados sintético apresenta, portanto, muitos dos recursos desafiadores de dados realistas.794940005%1/20

Figuras

Observe que (conforme Rconvenções) as linhas da matriz são desenhadas como faixas verticais. Todas as imagens, exceto os resíduos, são sombreadas para ajudar a exibir pequenas variações em seus valores. Sem isso, quase todos os outliers locais seriam invisíveis!

(0,79)(49,30)

As manchas na trama "Residuais" mostram os óbvios outliers locais isolados. Esse gráfico também exibe outra estrutura (como a faixa diagonal) atribuível aos dados subjacentes. Alguém poderia melhorar esse procedimento usando um modelo espacial dos dados ( por métodos geoestatísticos), mas descrever isso e ilustrá-lo nos levaria muito longe aqui.

1022003600

#
# Create data.
#
set.seed(17)
rows <- 2:80; cols <- 2:50
y <- outer(rows, cols, 
           function(x,y) 100 * exp((abs(x-y)/50)^(0.9)) * sin(x/10) * cos(y/20))
y.real <- y
#
# Contaminate with iid noise.
#
n.out <- 200
cat(round(100 * n.out / (length(rows)*length(cols)), 2), "% errors\n", sep="")
i.out <- sample.int(length(rows)*length(cols), n.out)
y[i.out] <- y[i.out] + rnorm(n.out, sd=0.05 * sd(y))
#
# Process the data into a data frame for loess.
#
d <- expand.grid(i=1:length(rows), j=1:length(cols))
d$y <- as.vector(y)
#
# Compute the robust local smooth.
# (Adjusting `span` changes the neighborhood size.)
#
fit <- with(d, loess(y ~ i + j, span=min(1/2, 125/(length(rows)*length(cols)))))
#
# Display what happened.
#
require(raster)
show <- function(y, nrows, ncols, hillshade=TRUE, ...) {
  x <- raster(y, xmn=0, xmx=ncols, ymn=0, ymx=nrows)
  crs(x) <- "+proj=lcc +ellps=WGS84"
  if (hillshade) {
    slope <- terrain(x, opt='slope')
    aspect <- terrain(x, opt='aspect')
    hill <- hillShade(slope, aspect, 10, 60)
    plot(hill, col=grey(0:100/100), legend=FALSE, ...)
    alpha <- 0.5; add <- TRUE
  } else {
    alpha <- 1; add <- FALSE
  }
  plot(x, col=rainbow(127, alpha=alpha), add=add, ...)
}

par(mfrow=c(1,4))
show(y, length(rows), length(cols), main="Data")

y.res <- matrix(residuals(fit), nrow=length(rows))
show(y.res, length(rows), length(cols), hillshade=FALSE, main="Residuals")
#hist(y.res, main="Histogram of Residuals", ylab="", xlab="Value")

# Increase the `8` to find fewer local outliers; decrease it to find more.
sigma <- 8 * diff(quantile(y.res, c(1/4, 3/4)))
mu <- median(y.res)
outlier <- abs(y.res - mu) > sigma
cat(sum(outlier), "outliers found.\n")

# Fix up the data (impute the values at the outlying locations).
y.imp <- matrix(predict(fit), nrow=length(rows))
y.imp[outlier] <- y[outlier] - y.res[outlier]

show(y.imp, length(rows), length(cols), main="Imputed")
show(y.real, length(rows), length(cols), main="Real")
whuber
fonte
whuber: Entendo corretamente que você supõe que os valores extremos são células isoladas? Em caso afirmativo, você saberia o quão sensível é essa abordagem à violação dessa suposição?
User603 28/05
@ user603 Não suponho que os discrepantes estejam isolados - muitos deles no exemplo não - mas presumo que a proporção de discrepantes em qualquer bairro local seja baixa o suficiente para que eles não destruam o local. Pode-se argumentar que, se houver algum bairro com uma proporção muito grande desses outliers, eles não poderão mais ser considerados outliers locais!
whuber
1
@ user603 Absolutamente! Mas isso parece nos tirar da situação presuntiva em que "os vizinhos mais próximos são os melhores preditores". Por respeito a isso, tudo o que fazemos ao processar os dados deve preservar essa previsibilidade local. Se uma coluna tem uma "escala muito diferente" da sua vizinha, essa circunstância violaria fortemente essa suposição declarada. (Também me pergunto o seu foco nas colunas: ao reler a pergunta, não consigo detectar nenhuma assimetria nos papéis das colunas e das linhas.)
whuber
1
p
1
@whuber esta é uma ótima solução, obrigado - eu estava tentando introduzir pelo menos alguns valores ausentes, o que é sempre uma situação real - uma mistura de valores ausentes (por exemplo, 50 valores ausentes) e outliers (100 outliers). emocionante !
Rdorlearn
4

Eu recomendo que você dê uma olhada neste artigo [0]. O problema que ele pretende resolver parece se encaixar bem na sua descrição, exceto que o método proposto pelo autor é um pouco mais refinado do que a entrada NN (embora use algo semelhante como ponto de partida).

XXnp

k

A primeira etapa de cada iteração é a etapa de imputação de dados. Isso é feito como no algoritmo EM: as células ausentes são preenchidas pelo valor que se espera que elas tenham (esta é a etapa E).

XXttRppkLLkkDDkp

Para resumir o artigo, aqui está o algoritmo geral que eles propõem:

  • l=0WW0XX

  • Então, faça até convergência:

    WWl(ttl,LLl,DDl)

    l=l+1

    YYl=LLl1(WWl1ttl1)(LLl1)

    WWlWWlN(ttl1,LLl1DDl1(LLl1))YYl

||WWl1WWl||F(tt,LL,DD)

(ttl1,LLl1DDl1)

N(ttl1,LLDD(LL))

Não conheço uma implementação R pronta para essa abordagem, mas é possível produzir facilmente a partir dos subcomponentes (principalmente um algoritmo PCA robusto), e eles estão bem implementados no R; consulte o pacote rrcov (o artigo é informativo tranquilo sobre este assunto).

  • [0] Serneels S. e Verdonck, T. (2008). Análise de componentes principais para dados contendo valores discrepantes e elementos ausentes. Estatística Computacional e Análise de Dados vol: 52 edição: 3 páginas: 1712-1727.
user603
fonte
obrigado, meu objetivo aqui é não prever valores extremos (no sentido em que estão distantes da distribuição) e sim valores fora do padrão (extremos) que não se ajustam ao padrão.
Rdorlearn 28/05
Eu acho que você não entendeu minha resposta. Essa abordagem produzirá previsão para qualquer valor, mas os valores discrepantes não serão previstos muito bem: isso ocorre porque eles não têm permissão para influenciar o ajuste do PCA. Eu aconselho você a ler o jornal.
User603 28/05
obrigado, a abordagem parece interessante e o palpite também pode funcionar bem. Mas sem códigos adequados será difícil de implementar - pelo menos sofisticado demais para mim!
Rdorlearn