이것은 내가 여기에 게시 한 질문에 대한 후속 질문입니다.
해결책은 다음 코드를 사용하는 것이 었습니다.
groups <- c("group2", "group3", "group4")
dataGroups <- groups %>%
purrr::map_dfr(~ data %>%
filter(grp == "group1" | grp == .x) %>%
mutate(!!.x := normaliseData(Y)))
이것을 사용하여 이제 다음과 같은 데이터 프레임이 생겼습니다.
grp date id Y group2 group3 group4
<chr> <dttm> <chr> <dbl> <dbl> <dbl> <dbl>
1 group1 2020-09-01 00:00:00 04003 17039. 0.424 NA NA
2 group1 2020-09-01 00:00:00 04006 13233. 0.247 NA NA
3 group1 2020-09-01 00:00:00 04011_AM 7918. 0 NA NA
4 group1 2020-09-01 00:00:00 0401301_AD 22586. 0.682 NA NA
5 group1 2020-09-01 00:00:00 0401303 20527. 0.586 NA NA
6 group1 2020-09-01 00:00:00 0401305 29422. 1 NA NA
7 group2 2020-09-01 00:00:00 22017_AM 7088. 0.0554 NA NA
8 group2 2020-09-01 00:00:00 22021_AM 8134. 0.165 NA NA
9 group2 2020-09-01 00:00:00 22039_AM 15842. 0.969 NA NA
10 group2 2020-09-01 00:00:00 22048 16142. 1 NA NA
이제 열을 변경하고 선형 회귀 모델을 적용하고 싶습니다. 다음을 사용하여 데이터를 생성 할 수 있습니다.
dataGroups2 <- dataGroups %>%
rowwise %>%
mutate(
control = sample(c(0,1), 1),
treatment = ifelse(grp == "group1", 1, 0),
did = control * treatment
)
그러나 열에 회귀 모델을 적용 할 수 없습니다.
dataGroups2 %>%
mutate(across(where(.) %in% groups), ~lm(log(.x) ~ treatment + control + did ))
변경되는 유일한 것은 Y
변수입니다. 열을 매핑하고 회귀 모델을 실행하려면 어떻게해야합니까?
데이터:
data <- structure(list(grp = c("group1", "group1", "group1", "group1",
"group1", "group1", "group2", "group2", "group2", "group2", "group2",
"group2", "group3", "group3", "group3", "group3", "group3", "group3",
"group4", "group4", "group4", "group4", "group4", "group4"),
date = structure(c(1598918400, 1598918400, 1598918400, 1598918400,
1598918400, 1598918400, 1598918400, 1598918400, 1598918400,
1598918400, 1598918400, 1598918400, 1598918400, 1598918400,
1598918400, 1598918400, 1598918400, 1598918400, 1598918400,
1598918400, 1598918400, 1598918400, 1598918400, 1598918400
), tzone = "UTC", class = c("POSIXct", "POSIXt")), id = c("04003",
"04006", "04011_AM", "0401301_AD", "0401303", "0401305",
"22017_AM", "22021_AM", "22039_AM", "22048", "22053_AM",
"22054_AM", "28002", "28004", "2800501", "2800502", "2800503",
"2800504", "31010_AM", "31015_AM", "31016", "31019_AM", "31023",
"31029_AM"), Y = c(17039.329, 13232.982, 7917.693, 22585.676,
20527.113, 29422.471, 7087.536, 8134.265, 15842.035, 16142.111,
11493.981, 6556.387, 22086.768, 11325.882, 53449.067, 83662.101,
78508.089, 66107.125, 5095.169, 5590.531, 17796.439, 6028.701,
39271.698, 3642.281)), row.names = c(NA, -24L), groups = structure(list(
grp = c("group1", "group2", "group3", "group4"), .rows = structure(list(
1:6, 7:12, 13:18, 19:24), ptype = integer(0), class = c("vctrs_list_of",
"vctrs_vctr", "list"))), row.names = c(NA, 4L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
편집하다:
회귀를 개별적으로 실행할 수 있습니다.
dataGroups2 %>%
lm(group2 ~ control + did + treatment + did, data = .) %>%
summary()
dataGroups2 %>%
lm(group3 ~ control + did + treatment + did, data = .) %>%
summary()
dataGroups2 %>%
lm(group4 ~ control + did + treatment + did, data = .) %>%
summary()
변화하는 유일한 것은 Y
변수입니다.
편집하다:
깔끔한 솔루션 :
linearRegFunction <- function(x){
lm(get(x) ~ control + did + treatment, data = dataGroups)
}
groups %>%
map(., ~linearRegFunction(.x))
하나는 확실히 가지고 올 수 있지만 tidyverse
솔루션을 사용 broom
하거나 purrr
, 때로는 간단한 해결책도 그 아름다움이있다. 예 :
lapply(groups, function(x) summary(lm(get(x) ~ control + did + treatment, data=dataGroups2)))
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다