Rambler's Top100
Лёгкая версия форума* Виртуальная клавиатура  English  
Molbiol.ru | О проекте | Справочник | Методы | Растворы | Расчёты | Литература | Орг.вопросы
Web | Фирмы | Coffee break | Картинки | Работы и услуги | Биржа труда | Междисциплинарный биологический онлайн-журналZbio-wiki

NG SEQUENCING · ЖИЗНЬ РАСТЕНИЙ · БИОХИМИЯ · ГОРОДСКИЕ КОМАРЫ · А.А.ЛЮБИЩЕВ · ЗООМУЗЕЙ


Темы за 24 часа  [ Вход* | Регистрация* ]  
   



Форум: 
 

Щёлкните, чтобы внести в Избранные Темы* R Help -- Давайте составим русский FAQ --
Кураторы темы:* plantago
Операции: Хочу стать куратором* · Подписаться на тему* · Отправить страницу по e-mail · Версия для печати*
Внешний вид:* Схема · [ Стандартный ] · +Перв.сообщ.


Добавить сообщение в темуСоздать новую темуСоздать голосование
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 15.04.2020 10:57     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс3212 @ 15.04.2020 00:52)
Ссылка на исходное сообщение  Да я и сам написал, а потом уже понял, что сам бы не понял, что нужно на месте другого человека....извиняюсь.
исходный файл вот такой
> d <- read.table("data.txt")
> d
  V1  V2  V3
1 1111 2222 2222
2 1111 2222 2223
3 1111 2222 1111
4 1111 2222 1112
Те значения что нужны min и max содержатся в V3, проблема (для меня пока что), в том, что этот столбец удаляется (оно и ясно иначе не выйдет) для получения файла такого вида
  X1  X2 X3 X4 x
1 1111 2222  1  1 2
2 1111 2222  1  2 2
Если на реальном примере и используя код который в моем сообщении был то исходник такой
V1
<int>
V2
<int>
V3
<int>
delta
<dbl>
170509 5337 1545 1
170509 5337 1546 1
170509 5337 1547 1
170509 5337 1548 1
170509 5337 1549 1

Отлично считается количество файлов, которые идут подряд, но V3 столбец исчезает, а именно там содержатся файлы, которые нужны теперь(( min и max значение. И получается фрейм такого вида
X1
<fctr>
X2
<fctr>
X3
<fctr>
x
<int>
170509 5337 1 160
170509 5385 0 1
170509 5401 1 5

А нужно, чтобы был примерно следующий

170509 5337 1 160 1545    1705
170509 5385 0 1 5385    5385
170509 5401 1 5      5401    5406
т.е. последние 2 столбца это значения минимум и максимум того что суммируется...пока не придумал, как сделать то что нужно мне, но в голове представляется пока прям огромный путь с манипуляцией данными, т.к. придется это делать с использованием каких то пакетов и использовать какие то ухищрения, кажется мне, что с помощью base пакета можно сделать все в пару строчек, но я его плохо знаю, от чего и такой вопрос)) обещаю выложить код с садомазо ухищрениями как придумаю, но не уверен что кому то нужен будет он, повторюсь, мне кажется там будет пару десятков строк. Поэтому буду рад за любую инфу, пусть не готовый код а просто куда копать))


решение простое, нанимаете r-программиста на почасовую ставку, и интерактивно задаете ему вводные, оплачивая каждый этап исполнение по затратам времени программиста, до тех пор пока вас не удовлетворит очередной результат.
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 15.04.2020 12:37     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

В общем-то согласен с PS2004R smile.gif но все же попробую wink.gif

170509 5337 1 160 1545    1705
170509 5385 0 1 5385    5385
170509 5401 1 5      5401    5406

т.е. последние 2 столбца это значения минимум и максимум того что суммируется..


Шестой столбец -- это сумма четверного и пятого, правильно?

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! Алекс3212




 прочитанное сообщение 17.04.2020 20:38     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 15.04.2020 13:37)
Ссылка на исходное сообщение  В общем-то согласен с PS2004R smile.gif но все же попробую wink.gif
Шестой столбец -- это сумма  четверного и пятого, правильно?

Да все верно 4+5 =6)) Проблема вытащить 4 столбец у меня...пока что...если так будет справедливее, пусть решение выложит сюда тот кто сможет, после того как я выложу свой код с костылями..я в любом случае буду благодарен.
Насчет программиста я согласен полностью, любой труд должен быть оплачен и я не прошу выкладывать готовый код, прошу просто подсказать где может быть решение, хотя б в какой стороне) Можно было бы и нанять и заплатить, но это не коммерческая задача в целом, и мне нравится думать своей головой, что касается r, хоть иногда я попадаю в тупик из за недостатка знаний в r, все таки я планирую использовать r как можно больше, т.к. это дает преимущества в выполнении разных задач))
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 17.04.2020 22:00     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

>> Шестой столбец -- это сумма четверного и пятого, правильно?
> Да все верно ...

Тогда нужен только пятый, шестой Вы сами легко посчитаете.

> ... мне нравится думать своей головой ...

Тогда придумайте, пожалуйста, минимальный воспроизводимый пример, как требует stackoverflow: https://ru.stackoverflow.com/help/minimal-r...ducible-example или https://overcoder.net/q/7388/%D0%BA%D0%B0%D...%BC%D0%B5%D1%80

Если Вы его придумаете, тогда Вам, скорее всего помогут. Если нет, то вряд ли.
Участник оффлайн! Алекс3212




 прочитанное сообщение 17.04.2020 22:39     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 17.04.2020 23:00)
Ссылка на исходное сообщение  >> Шестой столбец -- это сумма  четверного и пятого, правильно?
> Да все верно ...

Тогда нужен только пятый, шестой Вы сами легко посчитаете.

> ... мне нравится думать своей головой ...

Тогда придумайте, пожалуйста, минимальный воспроизводимый пример, как требует stackoverflow: https://ru.stackoverflow.com/help/minimal-r...ducible-example или https://overcoder.net/q/7388/%D0%BA%D0%B0%D...%BC%D0%B5%D1%80

Если Вы его придумаете, тогда Вам, скорее всего помогут. Если нет, то вряд ли.

Вот готовый код, но я не уверен, что все сделал верно...буду рад если укажите на ошибки или поможете сократить его..всем спасибо.

d.y <- read.table("G://badchannel0416.asc") %>% # по ссылке текстовик
mutate(prpk = (V1*10000+V2)*10000+V3) %>%
arrange(prpk) %>%
select(V1, V2, V3)

delta.d.y <- c(diff(d.y[,3]), 0)
s <- which(!(delta.d.y == 1))

delta.d.y[which(delta.d.y==1)+1] <- 1
delta.d.y[which(!(delta.d.y==1))] <- 0

sec <- rep(1:(length(s)), times=c(s[1],diff(s)))

d.y <- data.frame(d.y, delta.d.y, sec)
res.y <- rle(paste(d.y[,1], d.y[,2], d.y[,4], d.y[,5]))
FR1 <- data.frame(do.call(rbind, strsplit(res.y$values," ")),x=res.y$lengths)
FR1 <- FR1 %>% filter(X3 == 1)
#------
dfg <- d.y %>% mutate(prpkff = (V2*10000+V3))
dfg$dif <- c(dfg$prpkff[1], diff(dfg$prpkff))
dfg01 <- dfg %>% mutate(dif2 = ifelse(dif != 1, 0, 1))
dfg02 <- dfg01 %>% mutate(row1 = 1:nrow(dfg01)) %>% mutate(minV3 =ifelse(dif2 == 0, V3, 0))

dfg_first <- d.y %>% mutate(row1 = 1:nrow(d.y))
dfg_full <- full_join(dfg_first, dfg02, by=c("row1"="row1")) %>% select(V1.x, V2.x, V3.x, delta.d.y.x, minV3)

res1 <- rle(paste(dfg_full[,1], dfg_full[,2], dfg_full[,4], dfg_full[,5]))
FFF1 <- data.frame(do.call(rbind, strsplit(res1$values," ")),x=res1$lengths)
FFF1$X4 <- as.numeric(FFF1$X4)
FFF1$x <- as.numeric(FFF1$x)
FFF1 <- FFF1 %>% filter(X3 ==1) %>% filter(X4 != 0)

FR1$min <- FFF1$X4
FR2 <- FR1 %>% mutate(max = (x + min)-1) %>% select(-X3, -X4) %>% filter(x >= 10)

Файл не прикрепляется, загрузил в облако https://yadi.sk/d/BRg7LmW7aQ6YGg

Сообщение было отредактировано Алекс3212 - 18.04.2020 01:41
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 18.04.2020 10:15     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

> FR1$min <- FFF1$X4
Error in `$<-.data.frame`(`*tmp*`, min, value = c(146, 1, 8, 1, 18, 1, :
replacement has 7497 rows, data has 3765

так и должно быть?

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! Алекс3212




 прочитанное сообщение 18.04.2020 17:46     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 18.04.2020 11:15)
Ссылка на исходное сообщение  > FR1$min <- FFF1$X4
Error in `$<-.data.frame`(`*tmp*`, min, value = c(146, 1, 8, 1, 18, 1,  :
  replacement has 7497 rows, data has 3765

так и должно быть?


Нет, поменял немного на вот так

d.y <- read.table("G:/badchannel0416.asc") %>%
mutate(prpk = (V1*10000+V2)*10000+V3) %>%
arrange(prpk) %>%
select(V1, V2, V3)

delta.d.y <- c(diff(d.y[,3]), 0)
s <- which(!(delta.d.y == 1))

delta.d.y[which(delta.d.y==1)+1] <- 1
delta.d.y[which(!(delta.d.y==1))] <- 0

sec <- rep(1:(length(s)), times=c(s[1],diff(s)))

d.y <- data.frame(d.y, delta.d.y, sec)
res.y <- rle(paste(d.y[,1], d.y[,2], d.y[,4], d.y[,5]))
FR1 <- data.frame(do.call(rbind, strsplit(res.y$values," ")),x=res.y$lengths)
FR1 <- FR1 %>% filter(X3 == 1)
#------
dfg <- d.y %>% mutate(prpkff = (V2*10000+V3))
dfg$dif <- c(dfg$prpkff[1], diff(dfg$prpkff))
dfg01 <- dfg %>% mutate(dif2 = ifelse(dif != 1, 0, 1))
dfg02 <- dfg01 %>% mutate(row1 = 1:nrow(dfg01)) %>% mutate(minV3 =ifelse(dif2 == 0, V3, 0))

dfg_first <- d.y %>% mutate(row1 = 1:nrow(d.y))
dfg_full <- full_join(dfg_first, dfg02, by=c("row1"="row1")) %>% select(V1.x, V2.x, V3.x, delta.d.y.x, minV3)

res1 <- rle(paste(dfg_full[,1], dfg_full[,2], dfg_full[,4], dfg_full[,5]))
FFF1 <- data.frame(do.call(rbind, strsplit(res1$values," ")),x=res1$lengths)
FFF1$X4 <- as.character(FFF1$X4)
FFF1$X4 <- as.numeric(FFF1$X4)
FFF1$x <- as.numeric(FFF1$x)
FFF1 <- FFF1 %>% filter(X3 ==1) %>% filter(X4 > 1)

FR1
FFF1

FR1$min <- FFF1$X4
FR2 <- FR1 %>% mutate(max = (x + min)-1) %>% select(-X3, -X4) %>% filter(x >= 10)
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 19.04.2020 08:56     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Теперь работает, только Вы забыли указать

library(dplyr)

вначале.

Теперь, пожалуйста, сформулируйте Ваш вопрос _в связи с этим примером_. Какую именно переменную надо сделать, где она должна появиться, откуда ее брать, и т.д.

Всего благодарностей: 1Поблагодарили (1): Алекс3212
Участник оффлайн! Алекс3212




 прочитанное сообщение 19.04.2020 19:34     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 19.04.2020 09:56)
Ссылка на исходное сообщение  Теперь работает, только Вы забыли указать

library(dplyr)

вначале.

Теперь, пожалуйста, сформулируйте Ваш вопрос _в связи с этим примером_. Какую именно переменную надо сделать, где она должна появиться, откуда ее брать, и т.д.


Да, библиотеку не указал...
Это готовый код, который дает нужный мне результат, я обещал выложить, я выложил как только сделал...то, что он длинный и с костылями будет я предупреждал...вопросы только в части сокращения кода, если это возможно...какую переменную откуда и куда понятно мне кажется из кода.
Вообще я надеюсь, что это недопонимание между нами)) ато как то странно, выложить тут готовый код, а потом писать что мне нужно помочь в его написании...он ведь готовый как бы, вроде работает...изначально да, был другой вопрос, но разобрался сам... Есть другие вопросы по другим задачам, но честно сказать я уже примерно знаю что услышу, поэтому буду сам пытаться, чтобы не нервировать никого))
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 20.04.2020 07:26     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

> ..пока не придумал, как сделать то что нужно мне
> Проблема вытащить 4 столбец у меня
> разобрался сам...

Так Вы уже решили эту проблему самостоятельно?

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 22.04.2020 21:10     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Судя по отсутствию ответа, проблема решена. Хочется надеяться, что в этом помогли усилия по поиску минимального воспроизводимого примера.
Что касается улучшения скрипта, то здесь лучше применить принцип "работает -- не трогай". Но если есть какие-то _конкретные_ вопросы, задавайте.

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! -Эн-




 прочитанное сообщение 09.07.2020 03:41     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Уважаемые эксперты, кто-нибудь из вас имел опыт работы с BioGeoBears - программой на платформе R для реконструкции предковых ареалов? Или схожими программами RevBayes, corHMM? Интерес не праздный.
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 09.07.2020 05:56     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Нет, только глядел издалека. Но учтите, что RevBayes -- это отдельный язык, совершенно независимый от R. А с BioGeoBears что-то не в порядке -- https://cran.r-project.org/web/packages/Bio...EARS/index.html , уже больше года не исправляются ошибки, хотя разработка вроде бы идет.
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 09.07.2020 11:59     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Но вопрос-то спросите, может, чем и помогут smile.gif
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 09.07.2020 20:57     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

У меня довольно "ламерский" вопрос:
Хочется на картосхеме показать пространственное распределение показателя Z , построенное по выборке точек с нерегулярно заданными координатами. Для этого надо выполнить интерполяцию на равноточечный грид. Начала с неспециализированых методов loess и gam:
eastseq <- seq(44.532,  55.648, by = .2)
northseq <- seq(48.65536,  55.11243, by = .2)
R.grid <- expand.grid(Долгота = eastseq, Широта = northseq)
###  Сглаживаеие loess
m <- loess(z ~ Долгота * Широта, span = 0.85,degree = 2, data = df)
R.fit <- predict(m, R.grid)
image(eastseq, northseq, R.fit, col=colorRampPalette(c("white", "gray10"))(100),
    xlab="Долгота",ylab="Широта")
contour(eastseq, northseq, R.fit,  nlevels=10 , col="green", add=T)
###  Сглаживаеие gam
require("mgcv")
mod <- gam(z ~ te(Долгота , Широта), data = df)
G.fit <- matrix(predict(mod, R.grid), ncol = length(northseq))
image(eastseq, northseq, G.fit, col=colorRampPalette(c("white", "gray10"))(100),
    xlab="Долгота",ylab="Широта")
contour(eastseq, northseq, G.fit,  nlevels=10 , col="green", add=T)

Получила на редкость отвратительные картинки
Вопрос легко решился использованием интерполяции из пакета gstat. Но осадочек остался: может я что не так делаю.
Ведь в пакете vegan функция ordisurf как раз проводит сглаживание сплайнами, обращаясь к gam. Хочу посмотреть, как это делается. Но как посмотреть R-код этого метода:
UseMethod("ordisurf")
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 10.07.2020 07:24     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

> Получила на редкость отвратительные картинки
Ну вот кто мешает приложить этот самый df, чтобы и другие могли посмотреть на картинки и понять, как Вам можно помочь?
> Вопрос легко решился использованием интерполяции из пакета gstat.
И этот код тоже было бы хорошо привести, ведь тогда будет лучше понятно, что именно Вам нужно. И другим читателям форума полезно.
> Но как посмотреть R-код этого метода

===
> library(vegan)
Loading required package: permute
Loading required package: lattice
This is vegan 2.5-6
> UseMethod("ordisurf")
Error in UseMethod("ordisurf") :
'UseMethod' used in an inappropriate fashion
> methods("ordisurf")
[1] ordisurf.default* ordisurf.formula*
see '?methods' for accessing help and source code
> getAnywhere(ordisurf.default)
A single object matching ‘ordisurf.default’ was found
It was found in the following places
registered S3 method for ordisurf from namespace vegan
namespace:vegan
with value
function (x, y, choices = c(1, 2), knots = 10, family = "gaussian",
...
===

Вот так smile.gif

А можно скачать исходники отсюда https://cran.r-project.org/web/packages/vegan/index.html
Исходники https://cran.r-project.org/src/contrib/vegan_2.5-6.tar.gz
Открыть их, найти файл "ordisurf.R" и посмотреть содержимое, на этот раз в авторском оформлении и, что важно, с авторскими комментариями в коде.
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 10.07.2020 17:55     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Большое спасибо!
Еще чуток поразбираюсь и все выложу в конфу

Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 07.08.2020 15:53     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Извините, пришлось взять тайм-аут, но проблема не рассосалась.
Вот как я получал прилагаемые рисунки:

df1 <- read.table("PRODIAMESINAE.txt",sep ="\t")
df1 <- df[df$z > 0,]
eastseq <- seq(44.532,  55.648, by = .2)
northseq <- seq(48.65536,  55.11243, by = .2)
R.grid <- expand.grid(Долгота = eastseq, Широта = northseq)
nrow(R.grid)
1848

###  Сглаживаеие четырьмя различными методами
m <- loess(z ~ Долгота * Широта, span = 0.85,degree = 2, data = df)
R.fit <- predict(m, R.grid)
image(eastseq, northseq, R.fit, col=colorRampPalette(c("white", "gray10"))(100),
    xlab="Долгота",ylab="Широта")
contour(eastseq, northseq, R.fit,  nlevels=10 , col="green", add=T)
points(df1$Долгота,df1$Широта, pch=20, col="yellow")

require("mgcv")
mod <- gam(z ~ te(Долгота , Широта), data = df)
G.fit <- matrix(predict(mod, R.grid), ncol = length(northseq))
image(eastseq, northseq, G.fit, col=colorRampPalette(c("white", "gray10"))(100),
    xlab="Долгота",ylab="Широта")
contour(eastseq, northseq, G.fit,  nlevels=10 , col="green", add=T)
points(df1$Долгота,df1$Широта, pch=20, col="yellow")

library(akima)
akima.spl <- interp(df$Долгота,df$Широта,df$z,eastseq,northseq, linear=FALSE)
image(akima.spl, col=colorRampPalette(c("white", "gray10"))(100),
    xlab="Долгота",ylab="Широта")
contour(akima.spl,  nlevels=10 , col="green", add=T)
points(df1$Долгота,df1$Широта, pch=20, col="yellow")


library(sp)
library(gstat)
df_xy <- df
colnames(df_xy) <- c("x","y","z")
coordinates(df_xy) = ~x + y
xy.grid <- expand.grid(x = eastseq, y = northseq)
coordinates(xy.grid) <- ~x + y
gridded(xy.grid) <- TRUE
idw <- idw(formula = z ~ 1, locations = df_xy, newdata = xy.grid)
idw.output = as.data.frame(idw)
names(idw.output)[1:3] <- c("Долгота", "Широта", "z")

library(ggplot2) # start needed libraries
library(metR)
My_map_cont +
ggplot() +
geom_tile(data = idw.output, aes(x = Долгота, y = Широта, fill=z), alpha = "0.75") +
scale_fill_gradient(low = "white", high = "green") +
geom_point(data=df1, aes(x=Долгота, y=Широта), shape=21, colour="red") +
        geom_contour(data = idw.output,aes(x = Долгота, y = Широта, z=z), bins = 7) +
        theme_bw()

Вроде бы мне понятно, что в данном случае использование геостатистики естественно. Но есть много задач, не относящихся к геоинформатике. Как тут быть?

Картинки:
картинка: loes1.jpg
loes1.jpg — (61.46к)   



Файл/ы:

скачать файл PRODIAMESINAE.txt
размер: 4.21к
кол-во скачиваний: 102


Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 08.08.2020 00:32     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Код не работает... Много ошибок, часть поправил, но где взять "My_map_cont", непонятно. Русские подписи осей без специальных усилий в скрипте тоже не работают smile.gif
Но в целом я так и не понял, в чем проблема.
Поправьте, пожалуйста, скрипт, чтобы он работал и объясните, что именно нужно.
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 10.08.2020 08:51     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Строги Вы однако...
Просто уберите единичку в первой строке (извините, недоглядела из-за разных экспериментов, а таблицу грузила из другого места):
df <- read.table("PRODIAMESINAE.txt",sep ="\t")

и закомментируйте My_map_cont + (это подгрузка карты подложки, здесь не нужной).
И все заработает без каких-либо дополнительных усилий tongue.gif
Но, еще раз простите за невнимательность).
А проблема в том, что сглаживание LOES дает совершенно абсурдный результат, сглаживание GAM - чуть получше, но тоже получается несъедобная поверхность, Аkima - в целом верно, но эстетически скучно, да и пропорции исказились...

Сообщение было отредактировано ПолинаШ - 10.08.2020 09:01
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 10.08.2020 10:16     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(ПолинаШ @ 10.08.2020 08:51)
Ссылка на исходное сообщение  
А проблема в том, что сглаживание LOES дает совершенно абсурдный результат, сглаживание GAM - чуть получше, но тоже получается несъедобная поверхность, Аkima - в целом верно, но эстетически скучно, да и пропорции исказились...


Это называется "кригинг". Он проводиться опираясь на тот или иной вариант вариограммы. Если вариограмма построена чисто формально, то результат бессмысленный.

Начинайте с вариограммы, доказывайте (да хоть бутстрепом) что она хоть что то реально отражает. И потом кригингом "сглаживайте" (интерполируйте-экстраполируйте).

Сообщение было отредактировано PS2004R - 11.08.2020 09:14
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 11.08.2020 18:16     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Как я писала выше, мне понятно, что в данном случае использование геостатистики естественно и не спрашивала о различных вариантах кригинга - там есть своя теория и ее надо использовать.
Но есть много задач, не относящихся к геоинформатике. Например, построить поверхность зависимости концентрации озона от температуры и скорости ветра. В частности, в функции ordisurf() из Veganа используют сглаживание сплайнами через gam() и никаких вариограмм не строят. В принципе, нельзя отбрасывать и возможность трехмерного сглаживания LOES, так хорошо зарекомендовавшее себя в двумерном случае. Но у меня ничего не получилось и я просто спросила: это что, принципиальная "ущербность" сглаживающих функций в трехмерном случае, или я что-то не так делала.
Но, как говорят в нашей богадельне, на нет и судна нет. rolleyes.gif
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 11.08.2020 18:27     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(ПолинаШ @ 11.08.2020 18:16)
Ссылка на исходное сообщение  Как я писала выше, мне понятно, что в данном случае использование геостатистики естественно и не спрашивала о различных вариантах кригинга - там есть своя теория и ее надо использовать.
Но есть много задач, не относящихся к геоинформатике.  Например, построить поверхность зависимости концентрации озона от температуры и скорости ветра. В частности, в функции ordisurf() из Veganа используют сглаживание сплайнами через gam() и никаких вариограмм не строят. В принципе, нельзя отбрасывать и возможность  трехмерного сглаживания LOES, так хорошо зарекомендовавшее себя в двумерном случае. Но у меня ничего не получилось и я просто спросила: это что, принципиальная "ущербность" сглаживающих функций в трехмерном случае, или я что-то не так делала.
Но, как говорят в нашей богадельне, на нет и судна нет. rolleyes.gif


Я ответил на ваш вопрос ранее, другого ответа для вас у меня увы нет.
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 12.08.2020 17:04     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Нет, там не одна ошибка. И не две.

Вот исправленный вариант на случай, если кто-то хочет выполнить его без больших проблем. (Только мне еще пришлось поставить 11 пакетов).

CODE


df <- read.table("PRODIAMESINAE.txt",sep ="\t", fileEncoding="windows-1251") ## corrected !!
names(df) <- c("Dolgota", "SHirota", "z") ## added !!
df1 <- df[df$z > 0,]
eastseq <- seq(44.532,  55.648, by = .2)
northseq <- seq(48.65536,  55.11243, by = .2)
R.grid <- expand.grid(Dolgota = eastseq, SHirota = northseq)
nrow(R.grid)
1848

###  Sglazhivaeie chetihrjmya razlichnihmi metodami
m <- loess(z ~ Dolgota * SHirota, span = 0.85,degree = 2, data = df)
R.fit <- predict(m, R.grid)
image(eastseq, northseq, R.fit, col=colorRampPalette(c("white", "gray10"))(100),
   xlab="Dolgota",ylab="SHirota")
contour(eastseq, northseq, R.fit,  nlevels=10 , col="green", add=T)
points(df1$Dolgota,df1$SHirota, pch=20, col="yellow")

require("mgcv")
mod <- gam(z ~ te(Dolgota , SHirota), data = df)
G.fit <- matrix(predict(mod, R.grid), ncol = length(northseq))
image(eastseq, northseq, G.fit, col=colorRampPalette(c("white", "gray10"))(100),
   xlab="Dolgota",ylab="SHirota")
contour(eastseq, northseq, G.fit,  nlevels=10 , col="green", add=T)
points(df1$Dolgota,df1$SHirota, pch=20, col="yellow")

library(akima)
akima.spl <- interp(df$Dolgota,df$SHirota,df$z,eastseq,northseq, linear=FALSE)
image(akima.spl, col=colorRampPalette(c("white", "gray10"))(100),
   xlab="Dolgota",ylab="SHirota")
contour(akima.spl,  nlevels=10 , col="green", add=T)
points(df1$Dolgota,df1$SHirota, pch=20, col="yellow")

library(sp)
library(gstat)
df_xy <- df
colnames(df_xy) <- c("x","y","z")
coordinates(df_xy) = ~x + y
xy.grid <- expand.grid(x = eastseq, y = northseq)
coordinates(xy.grid) <- ~x + y
gridded(xy.grid) <- TRUE
idw <- idw(formula = z ~ 1, locations = df_xy, newdata = xy.grid)
idw.output = as.data.frame(idw)
names(idw.output)[1:3] <- c("Dolgota", "SHirota", "z")

library(ggplot2) # start needed libraries
library(metR)
#My_map_cont + ## corrected !!
ggplot() +
geom_tile(data = idw.output, aes(x = Dolgota, y = SHirota, fill=z), alpha = 0.75) + ## corrected !!
scale_fill_gradient(low = "white", high = "green") +
geom_point(data=df1, aes(x=Dolgota, y=SHirota), shape=21, colour="red") +
       geom_contour(data = idw.output,aes(x = Dolgota, y = SHirota, z=z), bins = 7) +
       theme_bw()



(данные "PRODIAMESINAE.txt" нужно скачать выше по треду).

Всего благодарностей: 1Поблагодарили (1): Den-N
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 12.08.2020 17:08     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

А по сути дела, я, увы, так и не понял ничего... Что Вам именно хотелось получить? Почему одни картинки "верные", а другие "абсурдные"? В таких случаях обычно советуют нарисовать, хотя бы от руки, желаемый результат.

Да, и данные никак не объяснены. Что это за данные? Для чего проводится анализ? И что такое "z"?
Участник оффлайн! Den-N
Постоянный участник



 прочитанное сообщение 13.08.2020 20:36     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(ПолинаШ @ 11.08.2020 21:16)
Ссылка на исходное сообщение  
...Но есть много задач, не относящихся к геоинформатике.  Например, построить поверхность зависимости концентрации озона от температуры и скорости ветра. В частности, в функции ordisurf() из Veganа используют сглаживание сплайнами через gam() и никаких вариограмм не строят. В принципе, нельзя отбрасывать и возможность  трехмерного сглаживания LOES, так хорошо зарекомендовавшее себя в двумерном случае. Но у меня ничего не получилось и я просто спросила: это что, принципиальная "ущербность" сглаживающих функций в трехмерном случае, или я что-то не так делала.
Но, как говорят в нашей богадельне, на нет и судна нет. rolleyes.gif

Нужные вам негеостатистические интерполирующие функции есть и их много. Действительно, геостатистика - специфическое направление и рассматривается некоторыми авторами сродни искусству. Например, какую функцию выбрать для построения вариаграммы, учитывать ли и как анизотропию, какой метод кригинга использовать? - многовато субъективизма. И раньше, и сейчас более жёсткие и простые интерполяторы поверхностей широко распространены и даже встраиваются в некоторые ГИС. Помимо метода обратных расстояний (inverse distance weighting interpolation, IDW) это: триангуляция (triangulation), многоуровневое сглаживание сплайнами (multilevel B-spline approximation, MBA), радиальная интерполяция (radial basis function interpolation - для округлых объектов), метод ближайшего соседа (nearest neighbour interpolation), может ещё что-то более экзотичное. Все эти функции есть в R в качестве самостоятельных пакетов и/или входят в крупные. Также читал про симуляционные процедуры, многократно интерполирующие с использованием части данных и затем усредняющие результат для каждой ячейки грида - в R это можно реализовать для любого интерполятора и получить не только предметную карту по средним, но и карту неопределённости по дисперсиям.
Из подобных методов за простоту и результативность мне нравятся MBA и наименьшего искривления (minimum curvature, не нашёл в R). Но в MBA, как и в любых сплайнах есть проблема излишней волнистости, поэтому я обрадовался увидев в этой ветке так любимые мной в 2D сплайны Акимы. В 3D я пользовался ими только раз в технической задаче (функциональная зависимость практически без шума) и тогда они показали себя лучше LOESS. Но конкретно для вашего набора данных они всё-таки ушли в минуса подобно всяким сплайнам (на юге центральной части). Думаю, можно искусственно приравнять отрицательные значения в наборе нулю, но это уже не вполне comme il faut. У меня получилось подобно вашей картинке, только я шаг поменьше сделал, вышло более гладко (по умолчанию akima делит область по горизонтали и вертикали на 40 частей), а также использовал другую цветовую палитру.
#c русскими осями не заморачивался (просто x, y, z) т.к. обычно довожу и объединяю рисунки из R в векторном редакторе TpX.

library(akima)
ak1 <- with(df,interp(x,y,z, linear=FALSE, nx=500, ny=500))
library(RColorBrewer)
with(ak1,image(x,y,z, col=rev(brewer.pal(n=10, name="Spectral"))))
points(df$x,df$y, pch=20, col="black")

C GAM в 3D экспериментировать пока некогда, но в 2D я остался ей очень доволен...

Сообщение было отредактировано Den-N - 13.08.2020 21:30

Картинки:
картинка: akima.png
akima.png — (16.73к)   



Всего благодарностей: 2Поблагодарили (2): plantago, ПолинаШ
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 13.08.2020 23:41     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

Как ни крути "у кригинга толще" smile.gif

Да и вариограмма вполне себе "перспективно" выглядит (в смысле "видали и похужее" smile.gif) ).

Картинки:
картинка: _________________2020_08_13_23_39_48.png
_________________2020_08_13_23_39_48.png — (21.45к)   

картинка: _________________2020_08_13_23_32_06.png
_________________2020_08_13_23_32_06.png — (30.87к)   

Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 15.08.2020 11:09     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

plantago - совершенно непонятно, что Вам показалось непонятным в моем вопросе. Как пример, решается задача распределения численности личинок комара-звонца по некой территории. Я спрашивала: почему моя версия скрипта с использованием обычных сглаживающих функций дает катастрофически плохие результаты по сравнению с геостатистическим методом обратных расстояний. Я предполагала, что возможно будет хуже, но уж не настолько, как LOES. И подумала, что возможна ошибка в скрипте (и сейчас так считаю) - потому и спросила.
Но в моем скрипте формальных ошибок нет (кроме злополучной df1), у меня на Win7 все работает. Если у Вас проблемы с кириллицей - я тут не причем.
PS2004R - Вы прекрасно отвечали, но, к сожалению, совсем не на мой вопрос.
Den-N - большущее спасибо. Все прекрасно объяснили и вернули обсуждение в конструктивное русло.
Спасибо и за наводку на MBA. Прекрасный пакет и думаю, что проблему излишней волнистости можно как-то решить подбором параметров. Вот что у меня получилось и меня это удовлетворило:
df <- read.table("PRODIAMESINAE.txt",sep ="\t")
df1 <- df[df$z > 0,]
library(MBA)
mba.int <- mba.surf(df, 300, 300, extend=TRUE)$xyz.est
##Image plot
image(mba.int, xaxs="r", yaxs="r")
contour(mba.int,  nlevels=10 , col="green", add=T)
points(df1$Долгота,df1$Широта, pch=20, col="blue")

А Акима что-то смещает результат относительно системы координат

Сообщение было отредактировано ПолинаШ - 15.08.2020 11:26

Картинки:
картинка: MBA.png
MBA.png — (40.41к)   



Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! ИНО
Постоянный участник
Донецк



 прочитанное сообщение 15.08.2020 11:33     Сообщение для модератора  Сообщение для куратора темы       Личное письмо

Как пример, решается задача распределения численности личинок комара-звонца по некой территории.

Это стохастическая система, потому строить поверхность, точно проходящую через все точки выборки неверно. Тут регрессия нужна.

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 15.08.2020 12:03     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(ПолинаШ @ 15.08.2020 11:09)
Ссылка на исходное сообщение  plantago
PS2004R  - Вы прекрасно отвечали, но, к сожалению, совсем не на мой вопрос.


Мало ли что вам там показалось. Лучше займитесь оценкой модели выборочной вариограммы своих данных, без этого все эти "сглаживания" ничтожны с точки зрения статистики.

PS

Меня вообще всё это "ненавязчивое натягивание совы на глобус" жутко раздражает, донатягивались уже до края по моему.
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 15.08.2020 12:32     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

В принципе можно построить свою процедуру интерполяции экстраполяции. Хотя я подчеркиваю она математически окажется эквивалентна варианту с оценкой вариограммы.


Берем произвольный метод сглаживания и перебираем "параметры гладкости" в нем до момента когда функция "качества подгонки" достигает оптимума.

Функция "качество подгонки" это почти обычная кроссвалидация, только с учетом пространственной природы данных. Исключаемый в кроссвалидации участок в этом случае должен быть "связанный регион".

Вот посмотреть на пространство параметров подгонки заполенное качеством подгонки и найти область где есть оптимум качества.

Но зачем весь этот "закат солнца вручную" делать, если есть _ясный_ и _понятный_ способ с вариограммой в которой все понятно и который по сути делает все тоже самое?

PS

если же хочется некого surface reconstruction то берите https://en.wikipedia.org/wiki/Point_Cloud_Library

и делайте. Это не статистическая процедура получения гладкой поверхности.

PPS

сайт лежит, поэтому сразу отсюда https://github.com/PointCloudLibrary/pcl

Сообщение было отредактировано PS2004R - 15.08.2020 12:43
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 16.08.2020 15:01     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Проблема нахождения оптимальной интерполирующей поверхности неисчерпаема и многогранна. Много чего по-русски написано, например, в https://tsamsonov.github.io/r-geo-course/in...erministic.html Однако саму оптимальность (в том числе, и кросс-проверкой) можно оценить только косвенным путем. Поскольку самих критериев оптимальности можно придумать много. Посмотрите хотя бы описание функции SINENVAP() из пакета EcoIndR.
Я же задала очень локальный и простой вопрос: как правильно построить интерполирующую 3-мерную поверхность с использованием функций loess() и gam(). Исключительно в методических целях.
Например, loess() дает глубокую впадину посередине участка, тогда как функции idw(), akima(), mba.surf() да и ваш кригинг (не знаю, какую функцию Вы использовали) дали вполне нормальную идентичную картину с характерным трехгорбием. Вероятно, стоило бы поиграться со span и degree, но предикция с использованием параметров по умолчанию так шокировала, что захотелось спросить... И прошу прощения за беспокойство

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 16.08.2020 20:14     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(ПолинаШ @ 16.08.2020 15:01)
Ссылка на исходное сообщение   Однако саму оптимальность (в том числе, и кросс-проверкой)  можно оценить только косвенным путем.  Поскольку самих критериев оптимальности можно придумать много.


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

Лично я затрудняюсь придумать более общий критерий качества проверяющий модель по выборочным данным (ну если принять, что кроме выборки ничего больше нет). Если что то есть, то с удовольствием выслушаю.

2. Простая интерполяция в ваших данных невозможна как решение, наиболее близко к высказанному желанию получить интерполирующую поверхность в 3д пространстве это упомянутый surface reconstruction который принципиально допускает ошибку измерения в данных (и даже грубые выбросы). И имеет вмонтированный в модель приор о существовании некой "поверхности".
Guest
IP-штамп: fretc2UtzYVf6
гость



 прочитанное сообщение 16.08.2020 23:48     Сообщение для модератора  Сообщение для куратора темы     

(ПолинаШ @ 16.08.2020 15:01)
Ссылка на исходное сообщение  
...Я же задала очень локальный и простой вопрос: как правильно построить интерполирующую 3-мерную поверхность с использованием  функций loess() и  gam().  Исключительно в методических целях.

Попробовал gam, тоже в растерянности: очень много настроек. Вы использовали взаимодействие координат типа te, а там есть ещё три, причём каждый со своими настройками "по умолчанию", которые можно менять. С наскока не понял, какое решение всё-таки ближе к искомому "простому" интерполятору confused.gif

mod2d <- gam(z~s(x, y), data = df, method = "REML")
vis.gam(mod2d, view = c("x", "y"), n.grid=300, plot.type = "contour", color="topo", nCol=50, too.far = 0.25)
points(df$x,df$y, pch=20, col="black")

Всего благодарностей: 1Поблагодарили (1): ПолинаШ
Участник оффлайн! Den-N
Постоянный участник



 прочитанное сообщение 16.08.2020 23:50     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Вот все четыре:

Картинки:
картинка: gam4.png
gam4.png — (187.5к)   



Всего благодарностей: 1Поблагодарили (1): ПолинаШ
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 17.08.2020 08:05     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

А можно вообще без интерполяции? wink.gif

(Почти) Оккамовское решение:

===
library(hexbin)
pp <- read.table("PRODIAMESINAE.txt", h=TRUE)
zz <- ifelse(pp$z == 0, 1, round(pp$z))
plot(hexbin(pp[rep(1:nrow(pp), times=zz), -3]))
===

картинка: 1.png

(можно обойтись без round(), но rep() использует as.integer(), а не round(), и вообще это ключевое место лучше описывать явно)

Всего благодарностей: 1Поблагодарили (1): ПолинаШ
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 17.08.2020 16:12     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Коллеги, искренне благодарна за обсуждение.

PS2004R - иногда важна не только точное и устойчивое воспроизведение моделью выборочных данных (оцениваемое кросс-проверкой), но и отсутствие аномалий поверхности (в первую очередь, неприятные горбы или впадины по краям).

Den-N Ага!, а еще можно и gam(z ~ te(x) + te(y), ...
и сплайнов штук 6 типов, да и разные типы взять для x и y, да и кнотом поварьировать. Комбинаторики намного хватит.

plantago - Все правильно. Все зависит от задачи. "Предсказание", "Объяснение", "Глобальный тренд", "Локальный тренд", "Изоляция расстоянием" и проч.
Здесь я к проблеме отнеслась еще проще.
Аппроксимируем плоскостью данные z относительно географических координат xy:
z = -45.19 - 0.0495x + 0.9437y
Эмпирическое значение тангенса угла наклона плоскости k = 0,9450
Строим распределение угла наклона при справедливости нулевой гипотезы. Для этого формируем 1000 рандомизированных выборок, в каждой из которых значения z случайно перемешаны относительно x и y. Среднее имитируемое 0.268, стандартное отклонение 0.171 и
только 3 значения из 1000 оказались больше, чем эмпирическое значение.
Таким образом, нулевая гипотеза об отсутствии пространственного тренда отклонена с достигнутым уровнем значимости 0.003
Далее показаем на графике "направление главного удара", т.е. проводим стрелку в направлении, совпадающем с проекцией нормали к полученной плоскости на плоскость XOY.
Делаем вывод, что животных больше в северных лесах. НаВашем графике это отчетливо видно.
И извините за некоторые недоразумения.

Сообщение было отредактировано ПолинаШ - 17.08.2020 16:15

Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 06.01.2021 12:32     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Подскажите в довольно простом вопросе.
Нужна функция, возвращающая содержимое таблицы по имени.

get_df <- function(table_name) get(table_name)
library(vegan)
сhoices = c("BCI", "dune", "mite", "pyrifos", "sipoo","varespec")
data(mite)
df <- get_df(сhoices[3])
str(df)
'data.frame': 70 obs. of 35 variables:
$ Brachy : int 17 2 4 23 5 19 17 5 3 22 ...
$ PHTH : int 5 7 3 7 8 7 3 4 3 4 ...
$ HPAV : int 5 16 1 10 13 5 8 8 2 5 ...

get_df(сhoices[2])
Ошибка в get(сhoices[2]) :объект 'dune' не найден

for (obj in ls()) {
if(class(get(obj)) == "data.frame")
print(obj)
}
[1] "df"
[1] "mite"

Как открыть объект данных, не используя предварительно data()
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 06.01.2021 15:19     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Бдагодарю. Весьма поучительно.
Кнопочная благодарность не срабатывает
Guest
IP-штамп: frt6Z9EOlgm.A
гость



 прочитанное сообщение 06.01.2021 17:44     Сообщение для модератора  Сообщение для куратора темы     

(ПолинаШ @ 06.01.2021 12:32)
Ссылка на исходное сообщение  Подскажите в довольно простом вопросе.
Нужна функция, возвращающая содержимое таблицы по имени.

get_df <- function(table_name) get(table_name)
library(vegan)
сhoices = c("BCI", "dune", "mite", "pyrifos", "sipoo","varespec")
data(mite)
df <- get_df(сhoices[3])
str(df)
'data.frame':  70 obs. of  35 variables:
$ Brachy  : int  17 2 4 23 5 19 17 5 3 22 ...
$ PHTH    : int  5 7 3 7 8 7 3 4 3 4 ...
$ HPAV    : int  5 16 1 10 13 5 8 8 2 5 ...

get_df(сhoices[2])
Ошибка в get(сhoices[2]) :объект 'dune' не найден

for (obj in ls()) {
    if(class(get(obj)) == "data.frame")
      print(obj)
}
[1] "df"
[1] "mite"

Как открыть объект данных, не используя предварительно data()



Use ‘getAnywhere’ for searching for an object anywhere, including
in other namespaces, and ‘getFromNamespace’ to find an object in a
specific namespace.
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 06.01.2021 18:41     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Похоже, что get* функции не будут работать. Наверное, потому, что механизм загрузки датасетов очень специфический и к тому же в разных пакетах разный. Например, "vegan" не использует lazy-loading, поэтому после его загрузки 'str(dune)' или 'getAnywhere(dune)' работать не будет, в то время как в других пакетах такое работает.

Я сначала написал ответ, в котором создавалось новое окружение (environment), но потом понял, что это не решает проблемы и стер его.

Похоже, что надо изменить код таким образом:

===

get_df <- function(table_name) get(table_name)

library(vegan)

choices <- c("BCI", "dune", "mite", "pyrifos", "sipoo", "varespec")

data(list=choices)

get_df(choices[3])

===

Без data(), кажется, не обойтись, но зато все эти таблицы можно загрузить скопом.

Кстати говоря, в оригинальном коде неприятная проблема: в слове "choices" первая буква кириллическая.
Guest
IP-штамп: frt6Z9EOlgm.A
гость



 прочитанное сообщение 06.01.2021 19:28     Сообщение для модератора  Сообщение для куратора темы     

(plantago @ 06.01.2021 18:41)
Ссылка на исходное сообщение  Похоже, что get* функции не будут работать. Наверное, потому, что механизм загрузки датасетов очень специфический и к тому же в разных пакетах разный. Например, "vegan" не использует lazy-loading, поэтому после его загрузки 'str(dune)' или 'getAnywhere(dune)' работать не будет, в то время как в других пакетах такое работает.

Я сначала написал ответ, в котором создавалось новое окружение (environment), но потом понял, что это не решает проблемы и стер его.

Похоже, что надо изменить код таким образом:

===

get_df <- function(table_name) get(table_name)

library(vegan)

choices <- c("BCI", "dune", "mite", "pyrifos", "sipoo", "varespec")

data(list=choices)

get_df(choices[3])

===

Без data(), кажется, не обойтись, но зато все эти таблицы можно загрузить скопом.

Кстати говоря, в оригинальном коде неприятная проблема: в слове "choices" первая буква кириллическая.


Доктор, меня все игнорируют (С) (но в хорошей компании, вместе со всем "?" скопом smile.gif)))

CODE


latform: x86_64-pc-linux-gnu (64-bit)

R -- это свободное ПО, и оно поставляется безо всяких гарантий.
Вы вольны распространять его при соблюдении некоторых условий.
Введите 'license()' для получения более подробной информации.

R -- это проект, в котором сотрудничает множество разработчиков.
Введите 'contributors()' для получения дополнительной информации и
'citation()' для ознакомления с правилами упоминания R и его пакетов
в публикациях.

Введите 'demo()' для запуска демонстрационных программ, 'help()' -- для
получения справки, 'help.start()' -- для доступа к справке через браузер.
Введите 'q()', чтобы выйти из R.

[Загружено ранее сохраненное рабочее пространство]

> get_df <- function(table_name) getAnywhere(table_name)
> df <- get_df(сhoices[3])
> str(df)
List of 5
$ name   : chr "mite"
$ objs   :List of 1
 ..$ .GlobalEnv:'data.frame': 70 obs. of  35 variables:
 .. ..$ Brachy  : int [1:70] 17 2 4 23 5 19 17 5 3 22 ...
 .. ..$ PHTH    : int [1:70] 5 7 3 7 8 7 3 4 3 4 ...
 .. ..$ HPAV    : int [1:70] 5 16 1 10 13 5 8 8 2 5 ...
 .. ..$ RARD    : int [1:70] 3 0 1 2 9 9 2 2 2 3 ...
 .. ..$ SSTR    : int [1:70] 2 6 2 2 0 3 3 1 1 0 ...
 .. ..$ Protopl : int [1:70] 1 0 0 0 13 2 0 2 1 0 ...
 .. ..$ MEGR    : int [1:70] 4 4 3 4 0 3 3 3 12 0 ...
 .. ..$ MPRO    : int [1:70] 2 2 0 0 0 0 0 0 0 0 ...
 .. ..$ TVIE    : int [1:70] 2 0 0 1 0 0 0 0 0 0 ...
 .. ..$ HMIN    : int [1:70] 1 0 0 2 3 20 19 1 0 11 ...
 .. ..$ HMIN2   : int [1:70] 4 1 6 10 14 16 3 4 3 4 ...
 .. ..$ NPRA    : int [1:70] 1 3 3 0 3 2 0 10 9 5 ...
 .. ..$ TVEL    : int [1:70] 17 21 20 18 32 13 22 12 20 16 ...
 .. ..$ ONOV    : int [1:70] 4 27 17 47 43 38 27 25 8 33 ...
 .. ..$ SUCT    : int [1:70] 9 12 10 17 27 39 37 26 19 29 ...
 .. ..$ LCIL    : int [1:70] 50 138 89 108 5 3 0 0 30 0 ...
 .. ..$ Oribatl1: int [1:70] 3 6 3 10 1 5 4 6 7 8 ...
 .. ..$ Ceratoz1: int [1:70] 1 0 0 1 0 0 0 0 0 2 ...
 .. ..$ PWIL    : int [1:70] 1 1 2 0 5 1 0 3 0 1 ...
 .. ..$ Galumna1: int [1:70] 8 3 1 1 2 1 1 1 2 5 ...
 .. ..$ Stgncrs2: int [1:70] 0 9 8 2 1 8 3 3 1 2 ...
 .. ..$ HRUF    : int [1:70] 0 1 0 1 0 0 0 2 0 0 ...
 .. ..$ Trhypch1: int [1:70] 0 1 3 2 1 4 0 0 0 0 ...
 .. ..$ PPEL    : int [1:70] 0 1 0 1 0 0 0 0 0 0 ...
 .. ..$ NCOR    : int [1:70] 0 2 2 3 0 1 0 0 0 0 ...
 .. ..$ SLAT    : int [1:70] 0 2 0 2 0 0 0 0 0 3 ...
 .. ..$ FSET    : int [1:70] 0 2 8 12 12 10 9 6 0 10 ...
 .. ..$ Lepidzts: int [1:70] 0 1 0 0 2 0 0 1 0 0 ...
 .. ..$ Eupelops: int [1:70] 0 0 0 0 0 0 1 0 0 1 ...
 .. ..$ Miniglmn: int [1:70] 0 0 0 0 0 0 0 1 0 2 ...
 .. ..$ LRUG    : int [1:70] 0 0 0 0 0 0 0 0 0 0 ...
 .. ..$ PLAG2   : int [1:70] 0 0 0 0 0 0 0 0 0 0 ...
 .. ..$ Ceratoz3: int [1:70] 0 0 0 0 0 0 0 0 0 0 ...
 .. ..$ Oppiminu: int [1:70] 0 0 0 0 0 0 0 0 0 0 ...
 .. ..$ Trimalc2: int [1:70] 0 0 0 0 0 0 0 0 0 0 ...
$ where  : chr ".GlobalEnv"
$ visible: logi TRUE
$ dups   : logi FALSE
- attr(*, "class")= chr "getAnywhere"
>

Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение Сообщение на английском  06.01.2021 21:18     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

> get_df <- function(table_name) getAnywhere(table_name)
> library(vegan)
Loading required package: permute
Loading required package: lattice
This is vegan 2.5-7
>
> choices <- c("BCI", "dune", "mite", "pyrifos", "sipoo", "varespec")
> getAnywhere("dune")
no object named ‘dune’ was found
> getAnywhere(choices[2])
no object named ‘dune’ was found
> get_df(choices[2])
no object named ‘dune’ was found
> sessionInfo()
R version 4.0.3 (2020-10-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 16.04.7 LTS

Matrix products: default
BLAS: /usr/lib/libblas/libblas.so.3.6.0
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0

locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics grDevices utils datasets methods base

other attached packages:
[1] vegan_2.5-7 lattice_0.20-41 permute_0.9-5 colorout_1.2-2

loaded via a namespace (and not attached):
[1] MASS_7.3-53 compiler_4.0.3 Matrix_1.3-0 parallel_4.0.3 tools_4.0.3
[6] mgcv_1.8-33 splines_4.0.3 nlme_3.1-151 grid_4.0.3 cluster_2.1.0
Guest
IP-штамп: fr7rsGcRlbyvg
гость



 прочитанное сообщение 07.01.2021 02:59     Сообщение для модератора  Сообщение для куратора темы     

Если что то лежит в файле, то оно там и останется. Какую магию хотите увидеть? Все файлы данных в путях загрузить?

CODE

> data(package="vegan")$result[,3]
[1] "BCI"           "BCI.env"       "dune"          "dune.env"    
[5] "dune.phylodis" "dune.taxon"    "mite"          "mite.env"    
[9] "mite.pcnm"     "mite.xy"       "pyrifos"       "sipoo"        
[13] "sipoo.map"     "varechem"      "varespec"    


dune это имя объекта файловой системы (там в result остальные элементы пути лежат к нему), и data() все это разбирает
Участник оффлайн! ИНО
Постоянный участник
Донецк



 прочитанное сообщение 08.01.2021 22:16     Сообщение для модератора  Сообщение для куратора темы       Личное письмо

Простая вроде бы задачка, но с R я далеко не "на ты" (раз в годик встречаемся обычно smile.gif ), поэтому прошу помощи. Имеется датафрэйм подобного вида:

CODE

dataframe1<-data.frame(Pred1=c(1,2,3), Pred2=c(30, 20, 10), RespA=c(0, 1, 2), RespB=c(2, 1, 0))
dataframe1
 Pred1 Pred2 RespA RespB
1     1    30     0     2
2     2    20     1     1
3     3    10     2     0

Где последние два столбца - таблица сопряженности. Требуется ее развернуть, чтоб получилось что-то типа этого:
CODE
dataframe2<-data.frame(Pred1=c(1,1,2,2,3,3), Pred2=c(30,30,20,20,10,10), Resp=factor(c("B","B","A","B","A","A")))
dataframe2
 Pred1 Pred2 Resp
1     1    30    B
2     1    30    B
3     2    20    A
4     2    20    B
5     3    10    A
6     3    10    A


Сообщение было отредактировано ИНО - 08.01.2021 22:17
Guest
IP-штамп: fr7rsGcRlbyvg
гость



 прочитанное сообщение 09.01.2021 01:59     Сообщение для модератора  Сообщение для куратора темы     

(ИНО @ 08.01.2021 22:16)
Ссылка на исходное сообщение  Простая вроде бы задачка, но с R я далеко не "на ты" (раз в годик встречаемся обычно smile.gif ), поэтому прошу помощи. Имеется датафрэйм подобного вида:

CODE

dataframe1<-data.frame(Pred1=c(1,2,3), Pred2=c(30, 20, 10), RespA=c(0, 1, 2), RespB=c(2, 1, 0))
dataframe1
 Pred1 Pred2 RespA RespB
1     1    30     0     2
2     2    20     1     1
3     3    10     2     0

Где последние два столбца - таблица сопряженности. Требуется ее развернуть, чтоб получилось что-то типа этого:
CODE
dataframe2<-data.frame(Pred1=c(1,1,2,2,3,3), Pred2=c(30,30,20,20,10,10), Resp=factor(c("B","B","A","B","A","A")))
dataframe2
 Pred1 Pred2 Resp
1     1    30    B
2     1    30    B
3     2    20    A
4     2    20    B
5     3    10    A
6     3    10    A



Непонятный вопрос, но вот так например:

CODE

> reshape2::melt(dataframe1, id.var=c("Pred1","Pred2"))
 Pred1 Pred2 variable value
1     1    30    RespA     0
2     2    20    RespA     1
3     3    10    RespA     2
4     1    30    RespB     2
5     2    20    RespB     1
6     3    10    RespB     0
Участник оффлайн! ИНО
Постоянный участник
Донецк



 прочитанное сообщение 09.01.2021 03:09     Сообщение для модератора  Сообщение для куратора темы       Личное письмо

Увы, не то. Надо, чтобы сток с сочетанием Pred1=1, Pred2=30 и Resp=B должно стало две штуки, а Pred1=1, Pred2=30 и Resp=A - ни одной и т. д.

Попробую объяснить подробнее: есть данные, собранные в форме первой таблицы (а ля dataframe2). Pred1 и Pred2 - некие независимые переменные A и B - варианты бинарного отклика. Ситуация вполне жизненная: измеряем значения Pred1 и Pred2, подсчитываем количество объектов исследования, находящихся в состоянии A, заносим полученное число в столбец RespA, подсчитываем количество объектов, находящихся в состоянии B - заносим число в столбец RespB. Далее идем в другое место, снова измеряем Pred1 и Pred2 (получаем уже другие значения) и снова подсчитаем объекты находящиеся в каждом их двух альтернативных состояний. И т. д. Пока храним, все хорошо и компактно, но вот вздумалось применить например, логистическую регрессию, чтобы определить влияние Pred1 и Pred2 на вероятность нахождения объекта в состоянии через A или Б, а glm() требует данные в "длинном формате" (а ля dataframe2) , по одной строчке на каждый объект (или же можно и таблицу сопряженности ей как-то скормить?).

Естественно, приведенный пример вымышленный, в реальном и предикатов, и наблюдений много больше. Руками переписывать доооолго.

Думал, ситуация достаточно обычная confused.gif
Guest
IP-штамп: fr7rsGcRlbyvg
гость



 прочитанное сообщение 09.01.2021 15:00     Сообщение для модератора  Сообщение для куратора темы     

(ИНО @ 09.01.2021 03:09)
Ссылка на исходное сообщение  Увы, не то. Надо, чтобы сток с сочетанием Pred1=1, Pred2=30 и Resp=B должно стало две штуки, а Pred1=1, Pred2=30 и Resp=A - ни одной и т. д.

Попробую объяснить подробнее: есть данные, собранные в форме первой таблицы (а ля dataframe2). Pred1 и Pred2 - некие независимые переменные A и B - варианты бинарного отклика. Ситуация вполне жизненная: измеряем значения Pred1 и Pred2, подсчитываем количество объектов исследования, находящихся в состоянии A, заносим полученное число в столбец RespA, подсчитываем количество объектов, находящихся в состоянии B - заносим число в столбец RespB. Далее идем в другое место, снова измеряем Pred1 и Pred2 (получаем уже другие значения) и снова подсчитаем объекты находящиеся в каждом их двух альтернативных состояний. И т. д. Пока храним, все хорошо и компактно, но вот вздумалось применить например, логистическую регрессию, чтобы определить влияние Pred1 и Pred2 на вероятность нахождения объекта в состоянии через A или Б, а glm() требует данные в "длинном формате" (а ля dataframe2) , по одной строчке на каждый объект (или же можно и таблицу сопряженности ей как-то скормить?).

Естественно, приведенный пример вымышленный, в реальном и предикатов, и наблюдений много больше. Руками переписывать доооолго.

Думал, ситуация достаточно обычная confused.gif



Ну так в последнем столбце число таких повторов и записано.
Вот так например

CODE

> d <- reshape2::melt(dataframe1, id.var=c("Pred1","Pred2"))
> do.call(rbind, lapply(apply(d[d[,4]!=0,], 1, function(x) replicate(x[4],x[1:3])),t) )
    Pred1 Pred2 variable
[1,] "2"   "20"  "RespA"
[2,] "3"   "10"  "RespA"
[3,] "3"   "10"  "RespA"
[4,] "1"   "30"  "RespB"
[5,] "1"   "30"  "RespB"
[6,] "2"   "20"  "RespB"


Всего благодарностей: 1Поблагодарили (1): ИНО
Участник оффлайн! ИНО
Постоянный участник
Донецк



 прочитанное сообщение 09.01.2021 18:11     Сообщение для модератора  Сообщение для куратора темы       Личное письмо

Спасибо, работает, только нужно отформатировать выдачу, чтобы это стал датафрейм с правильно заданными типами данных, но то я умею. Однако для полного удовлетворения все же хотелось бы иметь универсальную функцию, принимающую в качестве аргументов таблицу любой размерности и имена столбцов, содержащих частоты. Если честно, думал, что задача типовая и для должна быть функция прямо в {base}, а тут такие бубны пришлось применять eek.gif
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 09.01.2021 20:05     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Без melt(), *apply() и replicate()

===

> dataframe1 <- data.frame(Pred1=c(1,2,3), Pred2=c(30, 20, 10), RespA=c(0, 1, 2), RespB=c(2, 1, 0))

> df2 <- rbind(as.matrix(dataframe1[, 1:3]), as.matrix(dataframe1[, c(1:2, 4)]))

> df2 <- as.data.frame(df2)

> df2$Resp <- rep(c("A", "B"), each=nrow(dataframe1))

> df3 <- df2[rep(1:nrow(df2), times=df2[, 3]), -3]

> df3
Pred1 Pred2 Resp
2 2 20 A
3 3 10 A
3.1 3 10 A
4 1 30 B
4.1 1 30 B
5 2 20 B

===

Всего благодарностей: 1Поблагодарили (1): ИНО

*




Кнопка "Транслит" перекодирует
текст из транслита в кирилицу.
Правила перекодировки здесь;
текст в квадратных скобках'[]'
не преобразуется.
Имя:

 преобразовывать смайлики · показать смайлики
Назначение кнопок:

   Поблагодарить автора сообщения — поблагодарить автора
   Удалить сообщение — удалить
   Редактировать сообщение — редактировать
   Поместить сообщение в колонку новостей — поместить в колонку новостей
   Цитировать — цитировать сообщение
   не входит в цитирование/входит в цитирование — цитировать несколько
   Отметить СПАМ-сообщение — обозначить спам
   Сообщение для модератора — связь с модератором
   Участник онлайн!/Участник оффлайн! — автор онлайн/оффлайн
   Фотография — фотография автора

   - остальные обозначения -
 
   *
« Предыдущая тема · Биофизика и матметоды в биологии · Следующая тема »
Быстрый ответДобавить сообщение в темуСоздать новую тему

Rambler   molbiol.ru - методы, информация и программы для молекулярных биологов              

 ·  Викимарт - все интернет-магазины в одном месте  ·  Доска объявлений Board.com.ua  · 
--- сервер арендован в компании Hetzner Online, Германия ---
--- администрирование сервера: Intervipnet ---

Хеликон · Диаэм · ИнтерЛабСервис · Beckman Coulter · SkyGen · ОПТЭК · BIOCAD · Евроген · Синтол · БиоЛайн · Sartorius · Химэксперт · СибЭнзим · Tecan · Даниес · НПП "ТРИС" · Биалекса · ФизЛабПрибор · Genotek · АТГ Сервис Ген · Биоген-Аналитика
Ваш форум  ·  redactor@molbiol.ru  ·  реклама  ·  Дата и время: 20.04.24 03:41
Bridged By IpbWiki: Integration Of Invision Power Board and MediaWiki © GlobalSoft