2016-08-15 3 views
1

Я использую модель для анализа выбросов парниковых газов из районов посева. Чтобы попытаться измерить ручку стандартного отклонения данных, я пытаюсь выполнить анализ стиля Монте-Карло на ней через несколько итераций.R Итерация модели по столбцам таблицы данных

model parameters 
a <- 0.1474 # Alpha 
b <- 0.0005232 # Beta 
g <- -0.00001518 # Gamma 
d <- 0.000003662 # Delta 
rain <- crm$rain # rainfall value for that location from the col 'rain' 

Данные в data.table, как показано ниже, но N столбцов запустить из N1-N100:

 rn rain Wheat  N1  N2  N3  N4  N5  N6 
# 1: 10007 1049.61 0.1718 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 
# 2: 10018 1114.31 0.1629 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 
# 3: 10023 1361.61 0.1082 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 
# 4: 10024 1407.20 0.0494 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 
# 5: 10025 1499.56 0.0200 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 
# 6: 10026 1654.13 0.0040 0.6363109 0.939479 0.9242736 0.9018818 0.6556216 0.1150655 

Так что мой вопрос, как я могу применить свою модель ниже каждого столбца N и добавить результат до конца таблицы данных? Модель работает с фиксированным значением для N, но я борюсь за то, как получить значение из каждого столбца в модель.

logN2O <- function (x) {a+(b*rain)+(g*N)+(d*rain*N)} 

Большое спасибо заранее.

Редактировать

Для уточнения я хочу, чтобы запустить модель со значением для N1 первого и сделать новый седловины с этим результатом в конце. Затем сделайте то же самое для значения N2 и так далее до конца N столбцов.

+2

не совсем понятно, что вы после этого, но, возможно, вы хотите 'lapply (.sd, функция (х) {все, что должно быть сделано для каждого столбца}' – MichaelChirico

+0

@ MichaelChirico Я отредактирую вопрос, чтобы быть более ясным. По сути, я хочу запустить модель для каждого значения N (1: 6) против значения дождя для строки и поместить вывод модели в конец таблицы данных. –

ответ

1

Я думаю, что это должно работать:

n <- 1:6 
cols <- paste0("N",n,"_res") 
dt[,(cols) := lapply(.SD ,function (x) {a + (b*dt[,rain]) + (g*x) + (d*dt[,rain]*x)}), .SDcols = paste0("N",n)] 

В основном вы просто указать «N» s вы хотите перебрать (в данном случае N1 - N6), а затем он сохраняет результат с «_res» прикрепленными - например "N1_res".

данных:

dt <- structure(list(rn = c(10007L, 10018L, 10023L, 10024L, 10025L, 
10026L), rain = c(1049.61, 1114.31, 1361.61, 1407.2, 1499.56, 
1654.13), Wheat = c(0.1718, 0.1629, 0.1082, 0.0494, 0.02, 0.004 
), N1 = c(0.6363109, 0.6363109, 0.6363109, 0.6363109, 0.6363109, 
0.6363109), N2 = c(0.939479, 0.939479, 0.939479, 0.939479, 0.939479, 
0.939479), N3 = c(0.9242736, 0.9242736, 0.9242736, 0.9242736, 
0.9242736, 0.9242736), N4 = c(0.9018818, 0.9018818, 0.9018818, 
0.9018818, 0.9018818, 0.9018818), N5 = c(0.6556216, 0.6556216, 
0.6556216, 0.6556216, 0.6556216, 0.6556216), N6 = c(0.1150655, 
0.1150655, 0.1150655, 0.1150655, 0.1150655, 0.1150655)), .Names = c("rn", 
"rain", "Wheat", "N1", "N2", "N3", "N4", "N5", "N6"), class = c("data.table", 
"data.frame"), row.names = c(NA, -6L)) 
+0

Это отлично работает, большое спасибо за помощь! Мой googling в настоящее время терпит неудачу - что делает .SD в точности? –

+1

.SD означает ** S ** ubset ** D ** ata и на самом деле является его собственным отдельный 'data.table'. Он обычно используется для каждой группы 'by', но в этом случае мы используем его для доступа только к интересующим нас столбцам (указанным в' .SDcols'. –

Смежные вопросы