Предоставление подмножества для функции lm в другой функции - PullRequest
0 голосов
/ 17 июня 2020

Я хотел бы выполнить регрессию lm внутри функции. Примерно так пост .

somefun <- function(vardep, varindep1, varindep2, DATA) {
  summary(lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA))
  }

Примеры данных:

panelID = c(1:50)   
year= c(2001:2010)
country = c("NLD", "BEL", "GER")
urban = c("A", "B", "C")
indust = c("D", "E", "F")
sizes = c(1,2,3,4,5)
n <- 2
library(data.table)
set.seed(123)
DT <- data.table(panelID = rep(sample(panelID), each = n),
                    country = rep(sample(country, length(panelID), replace = T), each = n),
                    year = c(replicate(length(panelID), sample(year, n))),
                    some_NA = sample(0:5, 6),                                             
                    Factor = sample(0:5, 6), 
                    industry = rep(sample(indust, length(panelID), replace = T), each = n),
                    urbanisation = rep(sample(urban, length(panelID), replace = T), each = n),
                    size = rep(sample(sizes, length(panelID), replace = T), each = n),
                    income = round(runif(100)/10,2),
                    sales= round(rnorm(10,10,10),2),
                    happiness = sample(10,10),
                    Sex = round(rnorm(10,0.75,0.3),2),
                    Age = sample(100,100),
                    educ = round(rnorm(10,0.75,0.3),2))        
DT [, uniqueID := .I]                                                         # Creates a unique ID     
DT <- as.data.frame(DT)

somefun("happiness", "educ", "income", DT)

Однако я бы хотел дополнительно указать подмножество для lm внутри функции. В результате я пробовал:

somefun<- function (vardep, varindep1, varindep2, DATA, subset=NULL) {
  summary(lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA, subset=paste(subset)))
  }

somefun("happiness", "educ", "income", DT, subset=(year<2005))
somefun("happiness", "educ", "income", DT, subset="(year<2005)")

Я даже пробовал:

somefun<- function (vardep, varindep1, varindep2, DATA, subset=NULL) {
  summary(lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA, subset=paste(subset, "")))
  }

somefun("happiness", "educ", "income", DT, subset=(year<2005))
somefun("happiness", "educ", "income", DT, subset="(year<2005)")

Но в обоих случаях получаю:

Error in lm.fit(x, y, offset = offset, singular.ok = singular.ok, ...) : 
  0 (non-NA) cases

Хотя summary(lm(paste("happiness", "~", "educ", "+", "income"), data = DT, subset=(year>2005))) отлично работает .

Как мне это сделать?

1 Ответ

1 голос
/ 17 июня 2020

Вы можете просто подмножество кадра данных, который вы передаете, lm:

somefun<- function (vardep, varindep1, varindep2, DATA, subset=NULL) {
  summary(lm(paste(vardep, "~", varindep1, "+", varindep2), data = DATA[subset,]))
  }

Таким образом, вы можете сделать

somefun("happiness", "educ", "income", DT, year < 2005)
#> 
#> Call:
#> lm(formula = paste(vardep, "~", varindep1, "+", varindep2), data = DATA[subset, 
#>     ])
#> 
#> Residuals:
#>      Min       1Q   Median       3Q      Max 
#> -2.60145 -2.30747 -0.09213  2.30536  2.73841 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)    
#> (Intercept)   10.553      1.269   8.314 5.44e-10 ***
#> educ          -3.780      1.047  -3.609 0.000904 ***
#> income        -5.912     12.760  -0.463 0.645880    
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
#> Residual standard error: 2.386 on 37 degrees of freedom
#> Multiple R-squared:  0.2672, Adjusted R-squared:  0.2276 
#> F-statistic: 6.746 on 2 and 37 DF,  p-value: 0.003179

и получить другой результат с помощью:

somefun("happiness", "educ", "income", DT, year > 2005)
#> 
#> Call:
#> lm(formula = paste(vardep, "~", varindep1, "+", varindep2), data = DATA[subset, 
#>     ])
#> 
#> Residuals:
#>     Min      1Q  Median      3Q     Max 
#> -3.7577 -0.9417 -0.2801  1.1769  3.8386 
#> 
#> Coefficients:
#>             Estimate Std. Error t value Pr(>|t|)   
#> (Intercept)    3.387      1.246   2.719  0.00914 **
#> educ           1.484      1.323   1.121  0.26790   
#> income         8.306     11.702   0.710  0.48136   
#> ---
#> Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
#> 
#> Residual standard error: 2.353 on 47 degrees of freedom
#> Multiple R-squared:  0.02928,    Adjusted R-squared:  -0.01203 
#> F-statistic: 0.7087 on 2 and 47 DF,  p-value: 0.4975
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...