R中具有许多自变量(固定效应)的非线性模型
Nonlinear model with many independent variables (fixed effects) in R
我正在尝试拟合具有近 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) + ...)
- 我在
gnls
函数中尝试了 factor(year)
但它不起作用。
另外,我也试过了
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))
它也returns我的错误信息。
那么,有什么简单的方法可以写下R
中的非线性公式和起始值吗?
由于您没有提供任何示例数据,我自己写了一个 - 它完全没有意义,而且模型实际上不起作用,因为它的数据覆盖率很差,但它明白了要点:
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
命令来构造您要执行的操作非常容易。
我正在尝试拟合具有近 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) + ...)
- 我在
gnls
函数中尝试了factor(year)
但它不起作用。 另外,我也试过了
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))
它也returns我的错误信息。
那么,有什么简单的方法可以写下R
中的非线性公式和起始值吗?
由于您没有提供任何示例数据,我自己写了一个 - 它完全没有意义,而且模型实际上不起作用,因为它的数据覆盖率很差,但它明白了要点:
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
命令来构造您要执行的操作非常容易。