【问题标题】:The nls() function in RR 中的 nls() 函数
【发布时间】:2013-02-08 13:00:54
【问题描述】:

混合的新凯恩斯菲利普斯曲线是:

经过几次操作,我们得到以下可估计模型:

其中 π 是通货膨胀率,x 是衡量产出缺口的指标(= 使用 Hodrick-Prescott 过滤器得出的 GDP 的周期性成分)。模型πx的解释变量是可观察的。

我需要使用非线性最小二乘估计这个模型;然而,这个模型在我看来是线性的。另外,我在 R 中使用 nls() 函数的尝试失败了。

此外,我对非线性回归的研究使我实现了逻辑人口增长,但我无法找到一种方法将我学到的知识与这个练习联系起来,尤其是在推导起始值时。

【问题讨论】:

  • 我们需要更多的信息/上下文,一个可重现的例子不会有什么坏处。特别是:是否同时观察到 pi 和 x,还是仅观察到 x?典型的数据集是什么样的?为什么你“被要求”使用非线性最小二乘法——这是作业吗? (对我来说,它看起来像是一个状态空间模型——例如查看dynlm 包)
  • @BenBolker dynlm 包中有用于非线性回归的工具吗?我一直在使用时间序列数据进行线性回归。是的,pi 和 x 是可观察的。也是的,这是我作业的最后一部分。模型中的所有变量都是先前导出的。
  • 如果(如您编辑的版本所说)pix 都是可观察的,那么这应该很容易与 lm() 匹配。 nls-fit 的一个参数是直接获取变量 abc 的一种方法,而不是必须对它们进行反向计算(并使用类似 delta 的方法来近似他们的不确定性)。我建议您(1)使用lm() 拟合模型; (2) 通过从这些系数进行反算,从 nls 拟合中获得起始值。如果您需要家庭作业方面的帮助,您肯定必须向我们展示您已经尝试过的内容......
  • 非常感谢@BenBolker
  • 我的意思当然是“获取起始值 for 上面的nls fit”...获取线性回归滞后变量的最简单方法是复制和适当地添加NA值/修剪结束值,例如x 的滞后 1 = c(NA,x[-length(x)])

标签: r regression nls


【解决方案1】:

使用带有lm() 函数的普通最小二乘法 (OLS) 来估计问题中的方程 (2) 将导致估计系数 、 和 。

另一方面,使用带有nls() 函数的非线性最小二乘法来估计方程将估计参数“a”、“b”和“c”的值,这些参数是感兴趣的参数。

R 中的nls() 函数(非线性最小二乘)有两个重要参数:首先是formula 参数,然后是start 参数。在 R 中运行 ?nls 将提供一些详细信息;然而,要点是formula 参数包含一个想要估计的非线性模型的表达式(例如y ~ a / (b + c*x),其中'y' 和'x' 是变量,'a'、'b' 和'c' 是感兴趣的参数),start 参数接受感兴趣参数的起始值,R 将在迭代过程中使用这些值(因为非线性最小二乘法基本上迭代计算,直到获得参数的最佳值)。

以下是步骤:

(i) 获取参数'a'、'b'和'c'的起始值

在这里,我使用了lm() 函数来估计方程(2)的系数。我首先创建要在函数中使用的滞后变量。

注意:“y”指的是“”

y_1 = c(NA, head(y, head(y, -1) # variable 'y' lagged  by one time period
y_2 = c(c(NA, NA), head(y, head(y, -2) # variable 'y' lagged by two time periods
x_1 = c(NA, head(x, head(x, -1) # variable 'x' lagged by one time period

因此,为了估计方程的系数,使用了以下代码:

reg = lm(y ~ y_1 + y_2 + x_1, na.action = na.exclude) # it is important to tell R to exclude the missing values (NA) that we included as we constructed the lagged variables

现在我们已经对 、 和 进行了估算,我们可以继续按以下方式计算“a”、“b”和“c”的值:

B = 1 / reg$coefficients["y_1"] # Calculates the inverse of the coefficient on the variable 'y_1'

A = B * reg$coefficients["y_2"] # Multiplies 'b' by the coefficient on the variable 'y_2'

C = B * reg$coefficients["x_1"] # Multiplies 'b' by the coefficient on the variable 'x_1'

ABC 然后用作nls() 函数中的起始值

(ii) 使用nls() 函数

nlreg = nls(y ~ (1/b)*y_1 - (a/b)*y_2 - (c/b)*x_1,
        start = list(a = A, b = B, c = C))

用代码可以看到结果:

summary(nlreg)

感谢 Ben Bolker 提供的见解 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-05
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多