Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.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
R:在nlsLM()语句中进行汇总_R_Dplyr_Nls - Fatal编程技术网

R:在nlsLM()语句中进行汇总

R:在nlsLM()语句中进行汇总,r,dplyr,nls,R,Dplyr,Nls,我正在使用nlsLM()创建幂函数的模型,但我需要在函数调用中总结数据,以找到合适的系数和指数。更具体地说,以下是我的模型代码: Jmod = nlsLM(value~(a)*summarise(funs(mean), (MW)^b), start = list(a=100000, b = 1/3), data = mod_data, upper = c(Inf,1), lower = c(0,1/5)) 其中,MW是我试图用

我正在使用
nlsLM()
创建幂函数的模型,但我需要在函数调用中总结数据,以找到合适的系数和指数。更具体地说,以下是我的模型代码:

Jmod = nlsLM(value~(a)*summarise(funs(mean), (MW)^b),
                 start = list(a=100000, b = 1/3), data = mod_data,
                 upper = c(Inf,1), lower = c(0,1/5))
其中,
MW
是我试图用来预测
值的数据。
MW
的数据已经根据名为
datetime
的变量按月分组,因此我想取
MW^b
的月平均值,其中
b
nlsLM()
语句找到

我会事先取平均值,但正如你可能意识到的那样,这在数学上是不相等的[e.((a+c)/2)^b不等于(a^b+c^b)/2]

如果任何人有任何关于如何做到这一点的信息,我将非常感激


编辑:

下面是我尝试使用的示例数据集的代码:

structure(list(datetime = structure(c(1514782800, 1480568400,1504242000, 1509512400, 1509512400, 1485925200, 1517461200, 1485925200, 1501563600, 1467349200, 1472706000, 1454302800, 1483246800, 1498885200, 1506834000, 1477976400, 1483246800, 1477976400, 1509512400, 1496293200, 1451624400, 1454302800, 1454302800, 1464757200, 1498885200, 1517461200, 1462078800, 1506834000, 1522558800, 1483246800, 1501563600, 1451624400, 1485925200, 1501563600, 1451624400, 1517461200, 1475298000, 1480568400, 1512104400, 1456808400, 1477976400, 1475298000, 1517461200, 1459486800, 1501563600, 1477976400, 1506834000, 1506834000, 1451624400, 1483246800), class = c("POSIXct", "POSIXt"), tzone = ""), value = c(2863.27837518519, 2878.40382333333, 1236.74444444444, 3522.48888888889, 3522.48888888889, 2033.55555555556, 3305.5, 2033.55555555556, 2094.7037037037, 3052.91875740741, 2960.52222222222, 1733.7918262963, 2850.28673851852, 2841.40740740741, 3310.77538814815, 2266.26172851852, 2850.28673851852, 2266.26172851852, 3522.48888888889, 2802.55555555556, 2196.82556740741, 1733.7918262963, 1733.7918262963, 3001.43703703704, 2841.40740740741, 3305.5, 2061.4826762963, 3310.77538814815, 3107.01851851852, 2850.28673851852, 2094.7037037037, 2196.82556740741, 2033.55555555556, 2094.7037037037, 2196.82556740741, 3305.5, 2848.90322592593, 2878.40382333333, 2873.73476703704, 2208.64755074074, 2266.2172851852, 2848.90322592593, 3305.5, 2021.68765444444, 2094.7037037037, 2266.26172851852, 3310.77538814815, 3310.77538814815, 2196.82556740741, 2850.28673851852), mon = structure(c(2018, 2016.91666666667, 2017.66666666667, 2017.83333333333, 2017.83333333333, 2017.08333333333, 2018.08333333333, 2017.08333333333, 2017.58333333333, 2016.5, 2016.66666666667, 2016.08333333333, 2017, 2017.5, 2017.75, 2016.83333333333, 2017, 2016.83333333333, 2017.83333333333, 2017.41666666667, 2016, 2016.08333333333, 2016.08333333333, 2016.41666666667, 2017.5, 2018.08333333333, 2016.33333333333, 2017.75, 2018.25, 2017, 2017.58333333333, 2016, 2017.08333333333, 2017.58333333333, 2016, 2018.08333333333, 2016.75, 2016.91666666667, 2017.91666666667, 2016.16666666667, 2016.83333333333, 2016.75, 2018.08333333333, 2016.25,2017.58333333333,2016.83333333333, 2017.75, 2017.75, 2016, 2017), class = "yearmon"), 
MW = c(2.6142700774997, 4.02670249993547, 0.666666666666667, 
0.724114015571947, 4.07197668868287, 3.74122386862433, 3.30097429092907, 
3.84858110028323, 0.666666666666667, 0.666666666666667, 4.35000446878457, 
0.666666666666667, 0.666666666666667, 3.8371824280444, 0.825077317374, 
0.666666666666667, 4.028058457579, 0.666666666666667, 4.3378032532779, 
3.84270845997837, 1.40955788986009, 0.666666666666667, 0.666666666666667, 
4.05845600900597, 4.00664052392117, 4.0295346724872, 0.666666666666667, 
4.14159923664523, 4.231951299842, 3.9562222817766, 0.666666666666667, 
3.61602795165213, 0.666666666666667, 3.58079262746603, 4.12197770915903, 
4.2610646492437, 4.02152528469467, 1.0117763092792, 2.03648922832252, 
0.666666666666667, 0.666666666666667, 3.8042476910097, 3.91787334748133, 
0.666666666666667, 0.666666666666667, 0.89571472289964, 4.1530002677697, 
3.93733212731873, 0.710671314318797, 0.666666666666667)), .Names = c("datetime", "value", "mon", "MW"), row.names = c(39113L, 12946L, 4365L, 37505L, 36601L, 31055L, 39814L, 31433L, 32105L, 20668L, 18191L, 8328L, 10232L, 25689L, 35528L, 4577L, 10302L, 5146L, 37975L, 29670L, 28429L, 7932L, 8468L, 23120L, 25111L, 39699L, 24312L, 36246L, 1556L, 11068L, 33269L, 29163L, 31685L, 32419L, 29059L, 40618L, 16751L, 11737L, 34371L, 6001L, 4864L, 16413L, 40304L, 8716L, 33190L, 5399L, 35610L, 36462L, 28338L, 10371L), class = "data.frame")

这将创建我用来制作模型的
mod_数据。重申一下,我在这里所做的是按月分组数据,可以在我的数据的
mon
列中找到,现在我想按月汇总数据,但指数包含在平均值中,如我上面的代码所示。再次感谢

这个问题不清楚你想要什么。是否要为数据中的每个唯一月份拟合单独的模型?或者,您想为所有数据拟合一个模型,然后取
MW^b
值的月平均值吗

这里有一种方法可以解决后一种情况

require(minpack.lm)
require(tidyverse)
require(broom)

dat <- structure(...) # provided in the question

predictions <- 
    dat %>% 
    ungroup %>%
    mutate(row = row_number()) %>%
    do(augment(nlsLM(
                formula = value ~ a * MW^b + 0*row, 
                data = .,
                start = list(a = 100000, b=1/3),
                upper = c(Inf, 1), 
                lower = c(0, 1/5)
               )
           )
       )

joined <- 
    dat %>%
    mutate(row = row_number()) %>%
    left_join(predictions, by=c('MW', 'value', 'row')) %>%
    select(-row)

joined %>%
    group_by(mon) %>%
    mutate(monthly_avg_prediction = mean(.fitted))
require(minpack.lm)
要求(整洁的人)
需要(扫帚)
dat%
变异(行=行编号())%>%
do(增广)(nlsLM)(
公式=值~a*MW^b+0*行,
数据=。,
开始=列表(a=100000,b=1/3),
上限=c(Inf,1),
下=c(0,1/5)
)
)
)
加入%
变异(行=行编号())%>%
左联合(预测,按=c('MW','value','row'))%>%
选择(-行)
加入%>%
按(星期一)分组%>%
变异(每月平均预测=平均值(.fitted))
注:

  • 这种东西用包装就容易多了。这是因为broom将诸如
    lm
    nls
    nlsLM
    等模型查找函数的结果转换为数据帧。因此,您不必记忆或重新查找模型对象的函数特定结构(例如,
    model$params[['estimate']][[1]])
    或类似内容;模型结果已经是R标准数据帧格式
  • 我的解决方案使用了关于如何将布鲁姆生成的预测数据帧与原始数据连接起来的想法。这就是为什么有
    row\u number()
    left\u join()
    的东西在那里。否则,在一般情况下,
    augment
    将丢弃模型预测中未使用的原始数据帧中的数据,并且如果使用的数据中存在重复值,则其将无法正常工作
  • .fitted
    列由broom的
    augment
    功能生成。这是指示数据点的模型预测
  • 结果(我想您可能想要的)在
    连接的
    数据帧的
    每月平均预测
    列中。但这代表了一个单一的全球模型,适用于所有数据,该模型的预测按月平均
    你能把你的问题简化成一个简单的问题,并加入模拟数据,以便其他人更好地理解你的问题吗?我编辑了这篇文章,希望能解决你的问题@CurtF。请让我知道,如果我还可以做些什么来推动这个进程。我还应该说,我不需要在这里使用summary函数,或者说dplyr。我之所以使用它,是因为
    groupby()
    函数已经根据数据帧中的
    mon
    变量对我的数据进行了分组。这是
    nlsLM()
    函数的包?@s\t它在
    minpack.lm
    packageThanks中!我的目标是为所有数据拟合一个模型,然后取月平均值,问题是我只有月平均值作为创建模型的数据。这有意义吗?如果我理解正确,这就是你的回答,但我想在得出结论之前先确认一下。是的,我就是这么做的。此外,如果你想看到模型结果,请将
    do(预兆(
    改为
    do(整洁(
    用于参数估计)或
    do(浏览(
    用于拟合信息的全局质量。现在的问题是,我需要与您在代码中找到的
    每月平均预测
    列对齐的系数,但是我使用
    do(tidy)得到的
    c
    b
    的系数(
    命令在平均值出现之前引用。这有意义吗?提前谢谢!我仍然不知道您要做什么。我认为您没有提供可复制的示例。如果您有新问题,您可能应该问新问题。