Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更改在predict()中使用的lm对象列表中的通用lm()系数名称?_R_Tidyverse_Lm_Predict - Fatal编程技术网

如何更改在predict()中使用的lm对象列表中的通用lm()系数名称?

如何更改在predict()中使用的lm对象列表中的通用lm()系数名称?,r,tidyverse,lm,predict,R,Tidyverse,Lm,Predict,我正在尝试编写一个函数,该函数从数据帧创建一个lm对象列表,并为数据集中的每个唯一日期使用不同的lm。然后,我希望能够通过一个新的数据帧将这些lms传递到predict(),以生成预测值和置信区间 数据如下所示: 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

我正在尝试编写一个函数,该函数从数据帧创建一个lm对象列表,并为数据集中的每个唯一日期使用不同的lm。然后,我希望能够通过一个新的数据帧将这些lms传递到predict(),以生成预测值和置信区间

数据如下所示:

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\u field]]
,而不是
“area”

这给我带来了一个问题,因为我想将这些lm对象传递到
predict()
,以便从面积测量中预测ppm值。我在下一个数据表中的列将命名为
区域
,我无法将其重命名为
[[peak\u field]]
。我尝试了类似的方法,但出现了一个错误:

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

$中出错您可以尝试使用定义的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 

在语言上使用计算机。我会使用bquote和eval,但我相信tidyverse中有一个相当于酷酷儿童的功能。这可能是酷酷儿童的一个功能;)