Члены взаимодействия R lm с категориальными и квадратичными непрерывными переменными

Я пытаюсь настроить фильм, подходящий для моих данных. Проблема, с которой я столкнулся, заключается в том, что я хочу соответствовать линейной модели (полином 1-го порядка), когда коэффициент равен «истина», и полиному второго порядка, когда коэффициент «ложь». Как я могу это сделать, используя только одну пленку.

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

Как я могу получить здесь правильные условия взаимодействия ???

Спасибо, Андри, мне еще кое-чего здесь не хватает. В этом примере переменная b является логической, если фактор двух уровней не работает, я думаю, мне нужно преобразовать переменную фактора в логическую. Еще мне не хватает символа not in the condition, I (! 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 ***

Не могу соотнести формулы с символом и без него! состояние, которое мне немного странно.


person Dr VComas    schedule 26.04.2013    source источник


Ответы (2)


Попробуйте что-нибудь в этом роде:

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.
  • Они приведут к 1 и 0 соответственно.
  • Я использовал отрицание !b внутри формулы.
person Andrie    schedule 26.04.2013
comment
Спасибо, Андри, мне кое-чего здесь не хватает. В этом примере переменная b является логической, если фактор двух уровней не работает, я думаю, мне нужно преобразовать переменную фактора в логическую. Еще мне не хватает символа not in the condition, I (! B * a ^ 2) без символа! Я получаю: Call: lm (formula = c ~ a + I (b * a ^ 2), data = dat) Коэффициенты: Estimate Std. Ошибка t значение Pr (›| t |) (пересечение) 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 *** - person Dr VComas; 29.04.2013

Эммм ...

Lm2<-lm(c~a + b + b*I(a^2), data=DumbData)

Вы говорите, что «Проблема, с которой я столкнулся, заключается в том, что я хочу соответствовать линейной модели (полином 1-го порядка), когда коэффициент равен« истина », и полиному второго порядка, когда коэффициент« ложь ». Как я могу это сделать, используя только один погонный метр ".

Из этого я делаю вывод, что вы не хотите, чтобы b было прямо в модели? Кроме того, a ^ 2 следует включать, только если b ложно.

Так что это было бы ...

lm(c~ a + I((!b) * a^2))

Если b истинно (то есть! B равно FALSE), тогда a ^ 2 умножается на ноль (FALSE) и исключается из уравнения.

Единственная проблема в том, что вы определили b как factor вместо 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") является выражением, которое оценивается как " логическое "(логическое) значение.

person lebatsnok    schedule 19.09.2013