используя информацию о соседях при вменении данных или находке вне данных (в R)


13

У меня есть набор данных с предположением, что ближайшие соседи являются лучшими предикторами. Просто прекрасный пример визуализации двухстороннего градиента

введите описание изображения здесь

Предположим, у нас есть случай, когда несколько значений отсутствуют, мы можем легко предсказать на основе соседей и тренда.

введите описание изображения здесь

Соответствующая матрица данных в R (фиктивный пример для тренировки):

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

Примечания: (1) Свойство пропущенных значений предполагается случайным , оно может происходить где угодно.

(2) Все точки данных взяты из одной переменной, но предполагается, что на их значение влияют neighborsстрока и столбец рядом с ними. Поэтому позиция в матрице важна и может рассматриваться как другая переменная.

Я надеюсь, что в некоторых ситуациях я могу предсказать некоторые смещения (могут быть ошибки) и исправить смещение (просто пример, давайте сгенерируем такую ​​ошибку в фиктивных данных):

> 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

Приведенные выше примеры являются лишь иллюстрацией (на них можно ответить визуально), но реальный пример может быть более запутанным. Я смотрю, есть ли надежный метод для такого анализа. Я думаю, что это должно быть возможно. Какой будет подходящий метод для проведения такого типа анализа? какие-либо R / программные предложения для такого анализа?

введите описание изображения здесь


Можете ли вы предположить, что отсутствующими данными является MAR (в терминологии Rubin (1976))?
user603

да, значения могут быть приняты как отсутствующие в случайном порядке (MAR). Смотрите мои последние правки.
rdorlearn

Ответы:


7

Вопрос задает способы использования ближайших соседей в прочном способ выявления и исправления локальных выбросов. Почему бы не сделать именно это?

Процедура состоит в том, чтобы вычислить устойчивое локальное сглаживание, оценить невязки и обнулить все, что слишком велико. Это напрямую удовлетворяет всем требованиям и является достаточно гибким для адаптации к различным приложениям, поскольку можно варьировать размер локального соседства и порог для определения выбросов.

(Почему гибкость так важна? Потому что любая такая процедура имеет хорошие шансы идентифицировать определенные локализованные поведения как "отдаленные". Таким образом, все такие процедуры можно считать более плавными . Они устранят некоторые детали наряду с очевидными выбросами. Аналитик нужен некоторый контроль над компромиссом между сохранением деталей и неспособностью обнаружить локальные выбросы.)

Еще одним преимуществом этой процедуры является то, что она не требует прямоугольной матрицы значений. Фактически, это может даже применяться к нерегулярным данным, используя локальный сглаживатель, подходящий для таких данных.

R, как и большинство полнофункциональных пакетов статистики, имеет несколько надежных локальных сглаживателей, таких как loess. Следующий пример был обработан с использованием этого. Матрица имеет строк и 49 столбцов - почти 4000 записей. Он представляет собой сложную функцию, имеющую несколько локальных экстремумов, а также целую линию точек, где она не дифференцируема («складка»). Для того, чтобы немного больше , чем 5 % из точек - очень высокий процент , чтобы считать «периферийное» - были добавлены гауссовых ошибки которых стандартное отклонение составляет только 1 / 20 стандартного отклонения исходных данных. Этот синтетический набор данных, таким образом, представляет многие сложные характеристики реалистичных данных.794940005%1/20

фигуры

Обратите внимание, что (согласно Rсоглашениям) строки матрицы отображаются в виде вертикальных полос. Все изображения, за исключением остатков, затенены, чтобы помочь отображать небольшие изменения в их значениях. Без этого почти все местные выбросы были бы невидимы!

Сравнивая «вмененный» (исправленный) с «реальным» (исходным незагрязненным) изображением, становится очевидным, что удаление выбросов сгладило некоторую, но не всю, складку (которая идет от вниз в ( 49 , 30 ) ; очевидно , в виде светло - голубой полосой под углом в «Разности» сюжета).(0,79)(49,30)

Спеклы на графике «Остатки» показывают очевидные изолированные локальные выбросы. Этот график также отображает другую структуру (например, диагональную полосу), относящуюся к базовым данным. Эту процедуру можно улучшить, используя пространственную модель данных (с помощью геостатистических методов), но ее описание и иллюстрирование приведут нас здесь слишком далеко.

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: Правильно ли я понимаю, что вы предполагаете, что выбросы являются изолированными клетками? Если да, знаете ли вы, насколько чувствителен этот подход к нарушению этого предположения?
user603

@ user603 Я не предполагаю, что выбросы являются изолированными - многие из них в примере не являются - но я предполагаю, что доля выбросов в любом локальном районе достаточно мала, чтобы они не сломали локальный сглаживатель. Можно утверждать, что если есть какое-либо соседство с очень большой долей таких выбросов, их уже нельзя считать локальными выбросами!
whuber

1
@ user603 Абсолютно! Но это, кажется, выводит нас из предполагаемой ситуации, когда «ближайшие соседи являются лучшими предикторами». Из уважения к этому все, что мы делаем при обработке данных, должно сохранять эту локальную предсказуемость. Если один столбец имеет «совершенно другой масштаб», чем его сосед, это обстоятельство довольно сильно нарушит это высказанное предположение. (Мне также интересно ваше внимание на столбцы: после перечитывания вопроса я не могу обнаружить асимметрию в роли столбцов и строк.)
whuber

1
p

1
@ whuber, это отличное решение, спасибо - я пытался ввести хотя бы некоторые пропущенные значения, что всегда является реальной ситуацией - сочетание пропущенных (например, 50 пропущенных значений) и выбросов (100 выпадающих значений). захватывающе !
rdorlearn

4

Я бы посоветовал вам взглянуть на эту статью [0]. Проблема, к которой она имеет отношение, кажется, вполне соответствует вашему описанию, за исключением того, что метод, предложенный автором, несколько более изощрен, чем NN-ввод (хотя он использует нечто подобное в качестве отправной точки).

XXnp

k

Первым этапом каждой итерации является этап ввода данных. Это делается так же, как в алгоритме EM: недостающие ячейки заполняются значением, которое они должны иметь (это E-шаг).

XXttRppkLLkkDDkp

Подводя итог статьи, вот общий алгоритм, который они предлагают:

  • l=0WW0XX

  • Затем до сходимости:

    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))

Я не знаю о готовой реализации R для этого подхода, но ее можно легко получить из подкомпонентов (главным образом, надежного алгоритма PCA), и они хорошо реализованы в R, см. Пакет rrcov (статья тихая информативность на эту тему).

  • [0] Serneels S. и Verdonck, T. (2008). Анализ основных компонентов для данных, содержащих выбросы и недостающие элементы. Вычислительная статистика и анализ данных том: 52 выпуск: 3 страницы: 1712-1727.

спасибо, моя цель здесь не в том, чтобы предсказать выбросы (в смысле, они находятся вне распределения), а не в значениях (выбросы), не подходящих к шаблону.
rdorlearn

Я думаю, вы неправильно поняли мой ответ. Этот подход даст прогноз для любого значения, но выбросы не будут прогнозироваться очень хорошо: это потому, что им не разрешено влиять на соответствие PCA. Я советую вам прочитать газету.
user603

спасибо, подход кажется интересным, и догадка тоже может сработать. Но без правильных кодов это будет сложно реализовать - по крайней мере, слишком сложно для меня!
rdorlearn
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.