当数据是要估计的参数的函数时,R中的非线性最小二乘

时间:2017-03-23 19:57:46

标签: r nls

我目前正在从matlab迁移到R,并试图找出我想做的事情是否可行。

我想估计R中的非线性模型,其中观察结果是美国州。皱纹是其中一个独立变量是县的州级指数,使用要估计的参数计算,即模型如下所示:

log(Y_s) = log(phi) + log(f(theta, X_cs)) + u_s

其中Y_s是状态级变量,X_cs是包含状态中变量的县级观察值的向量,f()返回为状态计算的索引的标量值。

到目前为止,我尝试使用R的nls函数,同时在传递给函数时转换数据。从索引的细节中抽象出来,一个更简单的代码版本如下所示:

library(dplyr)

state <- c("AK", "AK", "CA", "CA", "MA", "MA", "NY", "NY")
Y <- c(3, 3, 5, 5, 6, 6, 4, 4)
X <- c(4, 5, 2, 3, 3, 5, 3, 7)
Sample <- data.frame(state, Y, X)

f <- function(data, theta) {
  output <- data %>%
    group_by(state) %>%
    summarise(index = mean(X**theta),
              Y = mean(Y))
}

model <- nls(Y ~ log(phi) + log(index),
             data = f(Sample, theta),
             start = list(phi = exp(3), theta = 1.052))

这会返回一个错误,告诉我渐变是单数的。我的猜测是因为R无法看到公式中应该如何使用参数theta

有没有办法使用nls执行此操作?我知道我可以定义要手动最小化的标准函数,即log(Y_s) - log(phi) - log(f(theta, X_cs)),并使用最小化例程来估计参数值。但是我想使用nls的后置估计特征,就像对参数估计有置信区间一样。任何帮助非常感谢。

1 个答案:

答案 0 :(得分:2)

抱歉,我拒绝安装那个巨大的元数据包。因此,我使用基数R:

state <- c("AK", "AK", "CA", "CA", "MA", "MA", "NY", "NY")
Y <- c(3, 3, 5, 5, 6, 6, 4, 4)
X <- c(4, 5, 2, 3, 3, 5, 3, 7)
Sample <- data.frame(state, Y, X)

f <- function(X, state, theta) {
  ave(X, state, FUN = function(x) mean(x^theta))
}

model <- nls(Y ~ log(phi) + log(f(X, state, theta)),
             data = Sample, weights = 1/ave(X, state, FUN = length),
             start = list(phi = exp(3), theta = 1.052))
summary(model)
#Formula: Y ~ log(phi) + log(f(X, state, theta))
#
#Parameters:
#      Estimate Std. Error t value Pr(>|t|)
#phi   2336.867   4521.510   0.517    0.624
#theta   -2.647      1.632  -1.622    0.156
#
#Residual standard error: 0.7791 on 6 degrees of freedom
#
#Number of iterations to convergence: 11 
#Achieved convergence tolerance: 3.722e-06