我正试图让我的数据适合我。我遇到的问题是,当因子为“真”时,我想拟合线性模型(一阶多项式),当因子为“假”时,我想拟合二阶多项式。我怎样才能只使用一个lm完成。
a=c(1,2,3,4,5,6,7,8,9,10)
b=factor(c("true","false","true","false","true","false","true","false","true","false"))
c=c(10,8,20,15,30,21,40,25,50,31)
DumbData<-data.frame(cbind(a,c))
DumbData<-cbind(DumbData,b=b)
我试过了
Lm2<-lm(c~a + b + b*I(a^2), data=DumbData)
summary(Lm2)
导致:
summary(Lm2)
Call:
lm(formula = c ~ a + b + b * I(a^2), data = DumbData)
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -0.74483 1.12047 -0.665 0.535640
a 4.44433 0.39619 11.218 9.83e-05 ***
btrue 6.78670 0.78299 8.668 0.000338 ***
I(a^2) -0.13457 0.03324 -4.049 0.009840 **
btrue:I(a^2) 0.18719 0.01620 11.558 8.51e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.7537 on 5 degrees of freedom
Multiple R-squared: 0.9982, Adjusted R-squared: 0.9967
F-statistic: 688 on 4 and 5 DF, p-value: 4.896e-07
这里我有两个拟合的I(a ^ 2),我想要1个1阶和另一个二阶多项式。 如果尝试:
Lm2<-lm(c~a + b + I(b*I(a^2)), data=DumbData)
Error in `contrasts<-`(`*tmp*`, value = contr.funs[1 + isOF[nn]]) :
contrasts can be applied only to factors with 2 or more levels
In addition: Warning message:
In Ops.factor(b, I(a^2)) : * not meaningful for factors
如何在这里获得正确的互动条款?
谢谢Andrie,我在这里还有一些遗漏的东西。在这个例子中,变量b是逻辑1,如果是两个级别的因子不起作用,我想我必须在逻辑1中转换因子变量。我缺少的另一件事是不在条件下,我(!b * a ^ 2)没有!我明白了:
Call: lm(formula = c ~ a + I(b * a^2), data = dat)
Coefficients: Estimate Std. Error t value Pr(>|t|)
(Intercept) 7.2692 1.8425 3.945 0.005565 **
a 2.3222 0.3258 7.128 0.000189 ***
I(b * a^2) 0.3005 0.0355 8.465 6.34e-05 ***
我无法将有和没有的公式联系起来!条件,这对我来说有点奇怪。
答案 0 :(得分:1)
尝试以下几行:
dat <- data.frame(
a=c(1,2,3,4,5,6,7,8,9,10),
b=c(TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE,TRUE,FALSE),
c=c(10,8,20,15,30,21,40,25,50,31)
)
fit <- lm(c ~ a + I(!b * a^2), dat)
summary(fit)
这导致:
Call:
lm(formula = c ~ a + I(!b * a^2), data = dat)
Residuals:
Min 1Q Median 3Q Max
-4.60 -2.65 0.50 2.65 4.40
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 10.5000 2.6950 3.896 0.005928 **
a 3.9000 0.4209 9.266 3.53e-05 ***
I(!b * a^2)TRUE -13.9000 2.4178 -5.749 0.000699 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 3.764 on 7 degrees of freedom
Multiple R-squared: 0.9367, Adjusted R-squared: 0.9186
F-statistic: 51.75 on 2 and 7 DF, p-value: 6.398e-05
注意:
TRUE
和FALSE
。!b
。答案 1 :(得分:1)
Lm2<-lm(c~a + b + b*I(a^2), data=DumbData)
你说“我遇到的问题是,当因子为”真“时,我想拟合线性模型(1阶多项式),当因子为”假“时,我想拟合二阶多项式。我怎样才能得到只使用一个lm就完成了。“
由此我推断你不希望b直接在模型中?此外,仅当b为假时才应包括^ 2。
那就是......
lm(c~ a + I((!b) * a^2))
如果b为真(即,!b等于FALSE)则将^ 2乘以零(FALSE)并从等式中省略。
唯一的问题是您已将b定义为因子而不是logical
。这可以治愈。
# b=factor(c("true","false","true","false","true","false","true","false","true","false"))
# could use TRUE and FALSE instead of "ture" and "false"
# alternatively, after defining b as above, do
# b <- b=="true" -- that would convert b to logical (i.e boolean TRUE and FALSe values)
确切地说,您将b定义为“字符”,但在将其添加到数据框时将其转换为“因子”(“DumbData”)
关于您定义数据框的方式的另一个小问题。
a=c(1,2,3,4,5,6,7,8,9,10)
b=factor(c("true","false","true","false","true","false","true","false","true","false"))
c=c(10,8,20,15,30,21,40,25,50,31)
DumbData<-data.frame(cbind(a,c))
DumbData<-cbind(DumbData,b=b)
这里,cbind是不必要的。你可以把它全部放在一条线上:
Dumbdata<- data.frame(a,b,c)
# shorter and cleaner!!
此外,要将b转换为logical
,请使用:
Dumbdata<- data.frame(a,b=b=="true",c)
请注意。你需要说b = b ==“true”,它似乎是多余的,但LHS(b)给出了数据框中变量的名称,而RHS(b ==“true”)是一个表达式,其值为“逻辑“(布尔)值。