Почему я получаю значения «NA» после запуска функции curvefit в R?

#r

#r

Вопрос:

Я использую набор данных, в котором я строю выбросы газов по оси y и температуру почвы по оси x. Я пытаюсь использовать функцию curvefit для определения наилучшего соответствия данным. Я использую этот код:

 x <- df2$tsoil
y <- df2$winter_flux
curvefit(x, y, plot.curves = TRUE) 
  

И мой вывод дает мне значения для линейной подгонки, но не для степенной, экспоненциальной или логистической подгонки. Все значения для этих трех — просто NA. И на графике показана только линейная линия. Чего мне здесь не хватает?

Данные

 df2 <- structure(list(tsoil = c(-0.5, 5.6, -0.41, 2.92, -2.33, -4.16, -4.45, 
-4.29, -2.52, -0.15), winter_flux = c(0.064, 0.132, 0.486, 0.281, 0.192, 
0.161, 0.143, 0.146, 0.141, 0.082)), row.names = c(1L, 3L, 4L, 5L, 6L, 7L, 
8L, 9L, 10L, 39L), class = "data.frame")
  

Комментарии:

1. не могли бы вы поделиться dput(head(df2,10)) ?

2. структура (список (tsoil = c(-0.5, 5.6, -0.41, 2.92, -2.33, -4.16, -4.45, -4.29, -2.52, -0.15), winter_flux = c(0.064, 0.132, 0.486, 0.281, 0.192, 0.161, 0.143, 0.146, 0.141, 0.082)), row.names = c (1L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 39L), class = «data.frame»)

3. Спасибо, из какого пакета curvefit?

4. REAT — это пакет для curvefit

Ответ №1:

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

Вероятно, мы сможем легче продемонстрировать это, если будем использовать ggplot для построения ваших точек данных:

 library(ggplot2)

p <- ggplot(df2, aes(tsoil, winter_flux))   geom_point()   theme_bw()
p
  

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

Первое, на что следует обратить внимание, это то, что существует только 10 точек, и для них нет очевидного шаблона, поэтому мы должны быть удивлены, обнаружив хорошее соответствие любой простой кривой. Если мы посмотрим на код внутри функции curvefit , мы увидим, что создано 4 линейных модели: y ~ x , log10(y) ~ log10(x) , log10(y) ~ x и log((max(y) * 1.001 - y)/y) ~ x

Мы можем отобразить их в ggplot, потому что он просто пропустит сгенерированные бесконечности, а не вернет все, NA как curvefit делает:

 p   geom_smooth(method = lm, formula = y ~ x, se = FALSE, 
                colour = "black")  
    geom_smooth(method = lm, formula = log10(y) ~ log10(x), se = FALSE, 
                colour = "red")  
    geom_smooth(method = lm, formula = log10(y) ~ x,
                se = FALSE, colour = "blue")  
    geom_smooth(method = lm, formula = log((max(y) * 1.001 - y)/y) ~ x,
                se = FALSE, colour = "green")
  

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

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

Комментарии:

1. В моем наборе данных более 1000 наблюдений, но я думаю, что я разобрался со своей проблемой. Поскольку некоторые из моих значений отрицательны, не вызывает ли проблем запись журнала функции, и именно поэтому данные генерируются NAs? Как бы мне это исправить?

2. @Katherine это верно — конкретные формы регрессий в curvefit просто не подходят для ваших данных из-за преобразований журнала, и, честно говоря, это довольно ограниченная функция. Если вы можете отредактировать свой вопрос (просто нажмите на серую «редактировать» под вашим вопросом), чтобы включить более репрезентативное подмножество данных (скажем, 100 точек данных, но чем больше, тем лучше), должно быть возможно направлять вас, но с 10 точками данных мало кто может вам рассказать. Это то, что я подчеркиваю в конце своего ответа.