我想计算进入公式右侧的变量数量.有没有这样做的功能?
例如:
y<-rnorm(100)
x1<-rnorm(100)
x2<-rnorm(100)
x3<-rnorm(100)
f<-formula(y~x1+x2+x3)
Run Code Online (Sandbox Code Playgroud)
然后,我会调用SomeFunction(f)
哪个将返回3(因为在等式的右边有3个x变量).SomeFunction存在吗?
您可能需要查看帮助页面中链接的一些相关功能formula
.特别是terms
:
> terms(f)
y ~ x1 + x2 + x3 + x4
attr(,"variables")
list(y, x1, x2, x3, x4)
attr(,"factors")
x1 x2 x3 x4
y 0 0 0 0
x1 1 0 0 0
x2 0 1 0 0
x3 0 0 1 0
x4 0 0 0 1
attr(,"term.labels")
[1] "x1" "x2" "x3" "x4"
attr(,"order")
[1] 1 1 1 1
attr(,"intercept")
[1] 1
attr(,"response")
[1] 1
attr(,".Environment")
<environment: R_GlobalEnv>
Run Code Online (Sandbox Code Playgroud)
请注意"term.labels"属性.
这有两种可能性:
length(attr(terms(f), "term.labels"))
length(all.vars(update(f, z ~.))) - 1
Run Code Online (Sandbox Code Playgroud)
如果您想计算估计参数的数量,正如 G. Grothendieck 的答案下面的评论所建议的那样,您可以尝试下面的代码。n.coefficients
我为错误项添加了一个,就像 AIC 所做的那样。
n <- 20 # number of observations
B0 <- 2 # intercept
B1 <- -1.5 # slope 1
B2 <- 0.5 # slope 2
B3 <- -2.5 # slope 3
sigma2 <- 5 # residual variance
x1 <- sample(1:3, n, replace=TRUE) # categorical covariate
x12 <- ifelse(x1==2, 1, 0)
x13 <- ifelse(x1==3, 1, 0)
x3 <- round(runif(n, -5 , 5), digits = 3) # continuous covariate
eps <- rnorm(n, mean = 0, sd = sqrt(sigma2)) # error
y <- B0 + B1*x12 + B2*x13 + B3*x3 + eps # dependent variable
x1 <- as.factor(x1)
model1 <- lm(y ~ x1 + x3) # linear regression
model1
summary(model1)
n.coefficients <- as.numeric(sapply(model1, length)[1]) + 1
n.coefficients
# [1] 5
Run Code Online (Sandbox Code Playgroud)
这是代码的更直接的替代方案n.coefficients
:
# For each variable in a linear regression model, one coefficient exists
# An intercept coefficient exists as well
# Subtract -1 to account for the intercept
n.coefficients2 <- length(model1$coefficients) - 1
n.coefficients2
# [1] 5
Run Code Online (Sandbox Code Playgroud)