Как я могу сгладить массив в R? - PullRequest
1 голос
/ 23 января 2010

У меня есть двумерный массив в R, который представляет данные значения для сетки строк и столбцов. Это выглядит так:

     [,1] [,2] [,3] [,4]
[1,]    1    1    2    1
[2,]    1    5    6    3
[3,]    2    3    2    1
[4,]    1    1    1    1

Я хочу "сгладить" эти значения. На этом этапе проверки концепции я в порядке с любой популярной функцией сглаживания. В настоящее время я пытаюсь использовать функцию smooth.spline:

smooth.spline(x, y = NULL, w = NULL, df, spar = NULL,
              cv = FALSE, all.knots = FALSE, nknots = NULL,
              keep.data = TRUE, df.offset = 0, penalty = 1,
              control.spar = list())

(наивно) звонит

smoothed <- smooth.spline(myarray)

Когда я запускаю это, я получаю эту ошибку:

Ошибка в smooth.spline (a): нужно как минимум четыре уникальных значения 'x'

В моем массиве четыре или более уникальных значения в каждом измерении, поэтому я думаю, что не знаю, как правильно отформатировать входные данные. Может ли кто-нибудь дать мне несколько советов для такого рода вещей? Примеры для smooth -подобных функций, кажется, работают с одномерными векторами, и я не могу экстраполировать на двухмерный мир. Я новичок в R, поэтому, пожалуйста, не стесняйтесь исправить мое неправильное использование здесь терминов!

Ответы [ 2 ]

8 голосов
/ 23 января 2010

Сглаживание - большая тема, и многие функции доступны в самом R и через дополнительные пакеты из таких мест, как CRAN . В популярной книге Venables и Ripley ' Современная прикладная статистика с S"перечислены некоторые из них в разделе 8.1: (Я думаю - мое 4-е издание в работе) и рисунок 8.1:

  • Полиномиальная регрессия: lm(y ~ poly(x))
  • Естественные сплайны: lm(y ~ ns(x))
  • Сглаживание сплайнов: smooth.splines(x, y)
  • Lowess: lowess(x, y) (и более новый / предпочтительный метод
  • ksmooth: ksmooth(x, y)
  • supsmu: spusmu(x, y)

Если вы устанавливаете пакет MASS , входящий в комплект книги, вы можете запустить его через файл scripts/ch08.R и поэкспериментировать самостоятельно.

8 голосов
/ 23 января 2010

Чтобы выполнить 1-мерное сглаживание по вертикальной или горизонтальной оси, используйте apply:

apply(myarray,1,smooth.spline)

или

apply(myarray,2,smooth.spline)

Я не знаком с 2-D сглаживанием,но быстрый эксперимент с пакетом полей, похоже, сработал.Вам нужно будет установить пакет fields и его зависимости.Где myMatrix - это матрица, которую вы имели выше ... (я воссоздаю ее):

# transform data into x,y and z
m = c(1,1,2,1,1,5,6,3,2,3,2,1,1,1,1,1)
myMatrix = matrix(m,4,4,T)
myMatrix
     [,1] [,2] [,3] [,4]
[1,]    1    1    2    1
[2,]    1    5    6    3
[3,]    2    3    2    1
[4,]    1    1    1    1
Z = as.vector(myMatrix)
XY=data.frame(x=as.numeric(gl(4,1,16),Y=as.numeric(gl(4,4,16))
t=Tps(XY,Z)
surface(t)

Получил симпатичный сюжет.

...