是否可以控制R中适合GAM的平滑函数的自由度,如果是,如何?

时间:2017-05-17 00:37:18

标签: r regression gam mgcv

我正在使用R中的No Implicit conversion of String into Array包来使GAM适应某些水文数据,如下所示:

// Function that returns a Promise for the FPS
const getFPS = () =>
  new Promise(resolve =>
    requestAnimationFrame(t1 =>
      requestAnimationFrame(t2 => resolve(1000 / (t2 - t1)))
    )
  )

// Calling the function to get the FPS
getFPS().then(fps => console.log(fps));

当我得到从 $data = DB::table('pemesanan as p') ->select('p.tgl_pesan', DB::raw('SUM(dp.jumlah) as jumlah')) ->leftJoin('detail_pemesanan as dp', 'p.id_pemesanan', '=', 'dp.id_pemesanan') ->whereRaw('p.tgl_pesan >= DATE_ADD(NOW(), INTERVAL -6 DAY)') ->groupBy('p.tgl_pesan') ->get(); 输出的图时,在y轴上它告诉我每个平滑函数的自由度,这些通常是非整数值。 我希望能够控制所使用的每个平滑函数的自由度,有没有办法做到这一点?

我已经看到了指定" knots"因此控制合适但我对GAM的概念相当新,我还没有找到任何明确的资源来解释这些是什么(如果它们甚至与我的问题有关)。

2 个答案:

答案 0 :(得分:2)

我一直在密切关注你如何回答其他答案。从您的回复中可以看出,在GAM中了解了几个概念,然后我可以做出简短的回答。

不幸的是,没有。 mgcv GAM不使用反向拟合进行估算,而是通过GCV或REML执行平滑参数的联合估算。因此,与旧版gam包不同,您可以在其中为每个样条线术语指定df,但无法在mgcv中实现此目的。

在惩罚回归设置中控制平滑度的唯一方法是设置平滑参数sp,但它与自由度的关系不是封闭的形式,你无法预见它

另一个答案是建议你做一个纯粹的回归样条而不会受到惩罚。通过设置等级k和信令fx = TRUE,您总是拥有等于等级减1的自由度(作为居中约束的结果),这是一个整数。

以下是我在平滑方面做出的其他一些答案。

smooth.spline(): fitted model does not match user-specified degree of freedom解释了如何在df中设置smooth.spline。请注意,这是反装配GAM的基础。

How to interpret lm() coefficient estimates when using bs() function for splines解释了纯回归样条的基础。当然,mgcv提供了很多样条基础类,而不仅仅是splines::bs使用的B样条。

答案 1 :(得分:1)

gam文档中有很多参数可供您了解。

我认为对您的案例最有用的参数是k基础维度。从本质上讲,它设定了使用s平滑的自由度的上限。 Here is some documentation

所以你可能会跑,例如:

gam(GWL ~ s(month, k = 4) + ...)

然后使用plot.gamgam.check检查您的模型。如果诊断结果不佳,您可以向上或向下调整k直到它们改善。

编辑:根据this answerfx = TRUE的{​​{1}}参数将适合具有固定自由度的回归样条。 k将等于总df和k-1 = edf。