as.numeric 这里是怎么用的?

How is as.numeric used here?

我一直在尝试弄清楚如何使用 R 来模拟在定价软件 Emblem 中开发的分段线性回归模型。我使用下面 post 中的@Roland 的回答做到了这一点。

https://stats.stackexchange.com/questions/61805/standard-error-of-slopes-in-piecewise-linear-regression-with-known-breakpoints

因此,为了获得斜率,感谢@Roland,我使用 as.numeric((variable < X)) 来获得预测变量中第二段的斜率。

这是怎么回事?为什么 "as.numeric" 给我正确答案?我找不到关于它的文档,我想了解为什么会这样。

它将布尔值 (TRUE / FALSE) 转换为数值 (1 / 0)。

(布尔值的 R-y 名称是 "logical":is.logical(TRUE) returns TRUE。)

x < 10 # TRUE if x is less than 10, FALSE if x is 10 or more

as.numeric(x<10) # 1 if x is less than 10, 0 if x is 10 or more

话虽如此,您实际上并不需要 as.numeric。你可以做的是:

# will also work:
mod2 <- lm(y~I((x<9.6)*x)+(x<9.6)+I((x>=9.6)*x)+(x>=9.6)-1)

此版本将直接使用布尔值——这些值被隐式转换为因子,因子在 lm 中的作用是将其转换为 k-1 二分变量,其中 k 是级别数。这就是为什么,如果你使用上面的代码,你会在 lm 输出中看到像 x < 9.6TRUE 这样的变量名称。

再一次,从技术上讲,as.numeric 是一种 hack,更透明的方法可能是 ifelse(x<9.6,1,0)。但是 hack 不一定是坏事,所以你可能更喜欢更 hackier hack,比如 (x<9.6)*1 但这在公式中不起作用,因为 * 在公式中有特殊含义,所以你必须在它周围使用 II((x<9.6)*1) - 我会说 as.numeric 看起来更干净。