Как изменить имена коэффициентов generi c lm () в списке объектов lm для использования в предикате ()? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь написать функцию, которая создает список объектов lm из фрейма данных с разными lm для каждой уникальной даты в моем наборе данных. Затем я хотел бы иметь возможность передавать эти lms в предикат () с новым кадром данных для генерации прогнозируемых значений и доверительных интервалов.

Данные выглядят так:

Date        ppm area
10/18/2019  0   0
10/18/2019  0   0
10/18/2019  0.1 438.9804
10/18/2019  0.1 447.1784
10/18/2019  0.1 443.7794
10/18/2019  1   3232.2088
10/18/2019  1   3206.6672
10/18/2019  1   3206.232
10/24/2019  0   0
10/24/2019  0   15.98
10/24/2019  0   0
10/24/2019  0   0
10/24/2019  0.1 379.387
10/24/2019  0.1 325.5268
10/24/2019  0.1 325.8126
10/24/2019  0.1 310.5972
10/24/2019  1   3259.366
10/24/2019  1   3218.0836
10/24/2019  1   3192.7076

Первая часть кажется простым - написание функции, которая создает разные lm для каждой даты:

standard.lm= function(standards,
                          date_field = "date",
                          peak_field,
                          std_field,
                          peak_field2 = NA){
  library(tidyverse)
  library(broom)


  y = standards %>% nest(-date_field) %>%
    mutate(fit = map(data, ~lm(.[[std_field]] ~ .[[peak_field]], data = .)))

    return(y)  }

Затем я могу выполнить команду:

test = standard.lm(standard_data, std_field = "std.ppm", peak_field = "area")

Это хорошо работает для генерации lms для каждой даты , но проблема в том, что коэффициент называется .[[peak_field]] вместо "area"

. Это создает для меня проблему, потому что я хотел бы передать эти объекты lm в predict(), чтобы предсказать значения ppm из измерения площади. Мой столбец в следующей таблице данных будет называться area, и я не могу переименовать его в .[[peak_field]]. Я пытаюсь что-то вроде этого и получаю ошибку:

a = c(1300.1, 1400.3, 1500.9)
df = data.frame(area = a)
df$std.ppm = predict(test$fit[[1]], newdata = df)

Ошибка в $<-.data.frame (*tmp*, std.ppm, значение = c (1 = -0.00299110569401364, : замена имеет 8 строк, данных - 3. Кроме того: Предупреждение: «newdata» имеет 3 строки, но найденные переменные имеют 8 строк

Это происходит потому, что predict() ищет столбец с именем .[[peak_field]] вместо того, чтобы распознавать область, и предсказывает значения для исходных входных данных lm вместо данных, которые я хочу, чтобы они предсказывали.

Так что в основном я ищу решение для преодоления этой проблемы. Лучшее решение позволил бы мне указывать имена коэффициентов, когда я первоначально создаю объекты lm в первой функции, но я был бы согласен с тем, что позволяет мне указать, какой столбец использовать в предикате ()

1 Ответ

0 голосов
/ 22 февраля 2020

Вы можете попытаться создать формулу в функции, используя определенные вами переменные y и x:

standard.lm= function(standards,date_field = "Date",
                      peak_field,std_field,peak_field2 = NA){
  lm_form = as.formula(paste(std_field,"~",peak_field))
  #another away
  #lm_form = substitute(y~x,list(y=as.name(std_field),x=as.name(peak_field)))
  y = standards %>% nest(data=-one_of(date_field)) %>%
    mutate(fit = map(data, ~lm(lm_form, data = .)))

    return(y)  }

Мы проверяем это:

standard_data = structure(list(Date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("10/18/2019", 
"10/24/2019"), class = "factor"), ppm = c(0, 0, 0.1, 0.1, 0.1, 
1, 1, 1, 0, 0, 0, 0, 0.1, 0.1, 0.1, 0.1, 1, 1, 1), area = c(0, 
0, 438.9804, 447.1784, 443.7794, 3232.2088, 3206.6672, 3206.232, 
0, 15.98, 0, 0, 379.387, 325.5268, 325.8126, 310.5972, 3259.366, 
3218.0836, 3192.7076)), class = "data.frame", row.names = c(NA, 
-19L))

mdl = standard.lm(standard_data, std_field = "ppm", peak_field = "area")

predict(mdl$fit[[1]], data.frame(area=c(1300.1,1400.3)))
        1         2 
0.3897161 0.4215205 
...