Есть ли реализация лёсса в R с более чем 3 параметрическими предикторами или трюк с подобным эффектом?

Приглашаем всех экспертов по локальной регрессии и/или R!

Я столкнулся с ограничением стандартной функции loess в R и надеюсь на ваш совет. Текущая реализация поддерживает только 1–4 предиктора. Позвольте мне изложить наш сценарий приложения, чтобы показать, почему это может легко стать проблемой, как только мы захотим использовать глобально подходящие параметрические копеременные.

По сути, у нас есть пространственное искажение s(x,y), наложенное на ряд измерений z:

z_i = s(x_i,y_i) + v_{g_i}

Эти измерения z могут быть сгруппированы по одному и тому же базовому неискаженному значению измерения v для каждой группы g. Членство в группе g_i известно для каждого измерения, но базовые неискаженные значения измерения v_g для групп неизвестны и должны определяться с помощью (глобальной, а не локальной) регрессии.

Нам нужно оценить двумерный пространственный тренд s(x,y), который мы затем хотим удалить. В нашем приложении, скажем, есть 20 групп не менее 35 измерений в каждой, в самом простом сценарии. Измерения расположены случайным образом. Принимая за основу первую группу, получаем 19 неизвестных смещений.

Приведенный ниже код для данных игрушек (с пространственным трендом в одном измерении x) работает для двух или трех групп смещения.

К сожалению, вызов loess завершается ошибкой для четырех или более групп смещений с сообщением об ошибке

Error in simpleLoess(y, x, w, span, degree, parametric, drop.square,
normalize,  :
  only 1-4 predictors are allowed"

Я попытался обойти ограничение и получил

k>d2MAX in ehg136.  Need to recompile with increased dimensions.

Насколько легко это будет сделать? Я нигде не могу найти определение d2MAX, и, похоже, это может быть жестко закодировано — ошибка, по-видимому, вызвана строкой № 1359 в loessf.f.

if(k .gt. 15)   call ehg182(105)

В качестве альтернативы, кто-нибудь знает о реализации локальной регрессии с глобальными (параметрическими) группами смещения, которые можно было бы применить здесь?

Или есть лучший способ справиться с этим? Я попробовал lme с корреляционными структурами, но это оказалось намного медленнее.

Будем очень признательны за любые комментарии!

Большое спасибо,
Дэвид

###
#
# loess with parametric offsets - toy data demo
#

x<-seq(0,9,.1);
x.N<-length(x);

o<-c(0.4,-0.8,1.2#,-0.2  # works for three but not four
     );  # these are the (unknown) offsets
o.N<-length(o);
f<-sapply(seq(o.N),
          function(n){
            ifelse((seq(x.N)<= n   *x.N/(o.N+1) &
                    seq(x.N)> (n-1)*x.N/(o.N+1)),
                    1,0);
          });
f<-f[sample(NROW(f)),];

y<-sin(x)+rnorm(length(x),0,.1)+f%*%o;
s.fs<-sapply(seq(NCOL(f)),function(i){paste('f',i,sep='')});
s<-paste(c('y~x',s.fs),collapse='+');
d<-data.frame(x,y,f)
names(d)<-c('x','y',s.fs);

l<-loess(formula(s),parametric=s.fs,drop.square=s.fs,normalize=F,data=d,
         span=0.4);
yp<-predict(l,newdata=d);
plot(x,y,pch='+',ylim=c(-3,3),col='red');  # input data
points(x,yp,pch='o',col='blue');           # fit of that

d0<-d; d0$f1<-d0$f2<-d0$f3<-0;
yp0<-predict(l,newdata=d0);
points(x,y-f%*%o);     # spatial distortion
lines(x,yp0,pch='+');  # estimate of that

op<-sapply(seq(NCOL(f)),function(i){(yp-yp0)[!!f[,i]][1]});

cat("Demo offsets:",o,"\n");
cat("Estimated offsets:",format(op,digits=1),"\n");

person kreil    schedule 16.06.2011    source источник


Ответы (1)


Почему бы вам не использовать для этого аддитивную модель? Пакет mgcv справится с такой моделью, если я правильно понял ваш вопрос, все в порядке. Возможно, я ошибаюсь, но код, который вы показываете, связан с x ~ y, но в вашем вопросе упоминается z ~ s (x, y) + g. То, что я показываю ниже для gam(), относится к ответу z, смоделированному пространственным сглаживанием в x и y, где g оценивается параметрически, а g сохраняется как фактор во фрейме данных:

require(mgcv)
m <- gam(z ~ s(x,y) + g, data = foo)

Или я неправильно понял, что вы хотели? Если вы хотите опубликовать небольшой фрагмент данных, я могу привести правильный пример, используя mgcv...?

person Gavin Simpson    schedule 16.06.2011
comment
Для уточнения моего первоначального вопроса: демо-код генерирует некоторые игрушечные данные, чтобы продемонстрировать проблему. Код также демонстрирует это только в одном измерении, а не в двух, ну, для упрощения демонстрации. Я все еще думаю, что реализация лесса R неудовлетворительна. Однако для моей непосредственной прикладной задачи ваше предложение прекрасно работает. Большое спасибо за чрезвычайно полезный указатель! Как я мог пропустить этот пакет? Он делает так много из того, что мне нужно, и даже больше, например, автоматическую оптимальную гладкость и масштабно-инвариантные сглаживатели (мои координаты не изотропны)! :-) - person kreil; 17.06.2011
comment
В свете этого гораздо более гибкого решения, какие причины или случаи существуют для использования лёсса? - person kreil; 17.06.2011
comment
@kreil хорошо, я думаю, часть причины кроется в названии - лесс изначально использовался как сглаживатель диаграммы рассеяния, а не как какая-то функция локального моделирования общего назначения. gam() в пакете gam может соответствовать сглаживателям с лессовыми элементами, тогда как в пакете mgcv используются сплайны. Последний, ИМХО, намного лучше. - person Gavin Simpson; 17.06.2011