R中有许多自变量(固定效应)的非线性模型

时间:2017-04-09 15:37:22

标签: r non-linear-regression random-effects

我试图使用几乎 50个变量的非线性模型(因为有一年的固定效应)。问题是我有很多变量,我不能像

那样编写完整的公式
nl_exp = as.formula(y ~ t1*year.matrix[,1] + t2*year.matrix[,2] 
                        +... +t45*year.matirx[,45] + g*(x^d))
nl_model =  gnls(nl_exp, start=list(t=0.5, g=0.01, d=0.1))

其中y是二元响应变量,year.matirx是45列的矩阵(表示45个不同年份),x是自变量。需要估算的参数是t1, t2, ..., t45, g, d

我有t1, ..., t45, g, d的良好起始值。但我不想为这种非线性回归编写一个长公式。

我知道如果模型是线性的,可以使用

简化表达式
l_model = lm(y ~ factor(year) + ...)
  1. 我在factor(year)函数中尝试gnls但它不起作用。
  2. 此外,我也试过

    nl_exp2 = as.formula(y ~ t*year.matrix + g*(x^d))

    nl_model2 = gnls(nl_exp2, start=list(t=rep(0.2, 45), g=0.01, d=0.1))

  3. 它还会返回错误消息。

    那么,有没有简单的方法来记下R中的非线性公式和起始值?

1 个答案:

答案 0 :(得分:4)

由于你没有提供任何示例数据,我自己编写了 - 它完全没有意义,而且模型实际上没有用,因为它的数据覆盖率很差,但它得到了重点:

y <- 1:100
x <- 1:100
year.matrix <- matrix(runif(4500, 1, 10), ncol = 45)

start.values <- c(rep(0.5, 45), 0.01, 0.1) #you could also use setNames here and do this all in one row but that gets really messy
names(start.values) <- c(paste0("t", 1:45), "g", "d")
start.values <- as.list(start.values)

nl_exp2 <- as.formula(paste0("y ~ ", paste(paste0("t", 1:45, "*year.matrix[,", 1:45, "]"), collapse = " + "), " + g*(x^d)"))

gnls(nl_exp2, start=start.values)

这可能不是最有效的方法,但是因为你可以将字符串传递给as.formula,所以很容易使用paste命令来构建你想要的东西做。