在公式中出现'.'但没有'data'参数,导致terms.formula(formula)出错。

30

我试图使用神经网络进行预测。

创建一些X:

x <- cbind(seq(1, 50, 1), seq(51, 100, 1))
创建 Y:
y <- x[,1]*x[,2]

给它们起个名字

colnames(x) <- c('x1', 'x2')
names(y) <- 'y'

构建 data.frame:

dt <- data.frame(x, y)

现在,我遇到了错误

model <- neuralnet(y~., dt, hidden=10, threshold=0.01)

在 terms.formula(formula) 中出错:公式中有'.'但是没有'data'参数。

例如,在 lm(线性模型)中可以使用此方法。


5
neuralnet 通过非导出函数 neuralnet:::generate.initial.variables 大量更改公式。该函数存在一个 bug。建议您联系维护者并向他们发送此示例或问题链接。 - Gavin Simpson
3个回答

50

如我的评论所述,这似乎是非导出函数neuralnet:::generate.initial.variables中的一个错误。作为解决方法,只需从dt的名称(不包括y)构建一个较长的公式。

n <- names(dt)
f <- as.formula(paste("y ~", paste(n[!n %in% "y"], collapse = " + ")))
f

## gives
> f
y ~ x1 + x2

## fit model using `f`
model <- neuralnet(f, data = dt, hidden=10, threshold=0.01)

> model
Call: neuralnet(formula = f, data = dt, hidden = 10, threshold = 0.01)

1 repetition was calculated.

        Error Reached Threshold Steps
1 53975276.25     0.00857558698  1967

抱歉,我不明白。为什么错误值这么大?我已经尝试了,但是得到了一个恒定的预测值。你能帮我吗? - luckyi
@luckyi 这很可能是一个统计学问题,不适合在[so]上提问。建议您去[stats.se]上提问。 - Gavin Simpson
1
这在RMS包中的ols()函数中也会发生。同样的修复方法也适用于那里。 - Chris
1
@GavinSimpson - 感谢您的解决方案,Gavin!我在新的mpath包中遇到了相同的公式错误。 - RobertF
它不会从公式左侧删除y值,而是在最后出现。 - Arpit Sisodia

13

提供一种比前一个答案更简单的方法,您可以使用reformulate()dt的名称创建公式:

f <- reformulate(setdiff(colnames(dt), "y"), response="y")

reformulate() 方法不需要使用 paste() 方法,而是自动将术语加在一起。


我一直在寻找这个,,,, - kurtkim

-1

扩展一个公式

f <- formula(terms(f, data= dt))

甚至更短

f <- formula(dt, f)

其中f是公式,dt是数据。


例如,原始公式可能是:
f <- as.formula("y ~ .")

真的很令人困惑的答案。 - Julien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接