R подгонка полинома к данным

У меня есть некоторые данные, синтетически сгенерированные из функции, которая показана ниже.

fn <- function(w1,w2){
  f= -(0.1 + 1.3*w1 + 0.4*w2 - 1.8*w1*w1 - 1.8*w2*w2)
  return(f)
}

Затем я создаю фрейм данных со значениями, как показано ниже.

x = data.frame(
  yval = fn(seq(0.1,0.9,by=0.01),seq(1.1,0.3,by=-0.01)),
  x1 = seq(0.1,0.9,by=0.01),
  x2 = seq(1.1,0.3,by=-0.01)
)

Я хочу посмотреть, смогу ли я воссоздать коэффициенты полинома в fn, используя полиномиальную подгонку, которую я пытаюсь выполнить, как показано ниже.

fit = lm(yval ~ x1 + x2 + I(x1^2) + I(x2^2),data=x)
coef(fit)

Однако, когда я запускаю приведенный выше код, я получаю следующее

(Intercept)          x1          x2     I(x1^2)     I(x2^2) 
      2.012      -5.220          NA       3.600          NA 

Похоже, что термин x2 никогда не был «обнаружен». Кто-нибудь знает, что я могу делать неправильно? Я знаю, что если я создам синтетические линейные данные и попытаюсь воссоздать коэффициенты с помощью lm, я получу коэффициенты довольно точно. Заранее спасибо.


person broccoli    schedule 29.06.2013    source источник
comment
x1 и x2 совершенно коллинеарны, поэтому параметры не могут быть оценены для обоих одновременно. R распознает это и устанавливает для одного из них значение NA.   -  person Ben Bolker    schedule 29.06.2013


Ответы (1)


Если вы подходите к сетке из 2 предикторов, вам нужен expand.grid.

x <- expand.grid(x1=seq(0.1, 0.9, by=0.01), x2=seq(1.1, 0.3, by=-0.01))
x$yval <- with(x, fn(x1, x2))

fit = lm(yval ~ x1 + x2 + I(x1^2) + I(x2^2),data=x)
coef(fit)
(Intercept)          x1          x2     I(x1^2)     I(x2^2) 
       -0.1        -1.3        -0.4         1.8         1.8 
person Hong Ooi    schedule 29.06.2013